搜索
您的当前位置:首页正文

汇编语言:在两个数码管上实现00-99的循环显示

来源:好走旅游网



;此程序为在两个数码管上实现00-99的循环显示

;设置ram

//

DATA_IN

DATA 20H

;接收数据缓冲寄存器

DATA_OUT

DATA 21H

;发送数据缓冲寄存器

BIT_COUNT DATA 22H

;数据位数寄存器

HOUR

DATA 23H

//

MINITE

DATA 24H

;定时器0 中断入口

//

SECOND

DATA 25H

//

MSECOND

DATA 26H

ORG

0000H

LJMP

INIT

ORG

000BH

LJMP

TIME0

ORG

0013H

LJMP

KBHIT

;初始化

INIT:

ORG

0030H

;HD7279A 的地址

MOV

DPTR,#4000H

MOV

A,#10011111B

;HD7279A 初始化CSCLK

DATA

//

MOVX

@DPTR,A

LCALL

DELAY25MS

;延时后进入工作状态

MOV

DATA_OUT,#10100100B

;HD7279A 复位指令

LCALL

SEND

;发送指令

MOV

A,#10011111B

;设回CS 为高电平

MOVX

@DPTR,A

MOV

R4,#20

;定时器一个周期内的中断数

//

MOV

R2,#0

MOV

R3,#0

MOV

R4,#0

MOV

R5,#0

MOV

MSECOND,#0

//

MOV

SECOND,#0

//

MOV

MINITE,#0

//

MOV

HOUR,#0

;数字计数器

MOV

R6,#0

;个位寄存器

MOV

R7,#0

;十位寄存器




MOV

TMOD,#1

;设置定时器0 工作模式为

方式1

//

MOV

EA

TH0,#3CH

;设置定时器定时值

//

MOV

TL0,#0B0H

;设置定时器定时值

MOV

TH0,#0FCH

MOV

TL0,#18H

;开总中断

SETB

SETB

ET0

;开定时器0 中断

SETB

EX1

;开始计时

SETB

TR0

;主程序

MAIN:

MOV

AB

A,R2

;把数字转换为2 BCD

MOV

B,#10

DIV

R6,B

;个位放在R6

MOV

MOV

R7,A

;十位放在R7

MOV

DATA_OUT,#11001000B

;下载数据且按方式1

译码,找到了第1个数码管

LCALL SEND

LCALL DELAY25 ;T4,指令与数据时间间隔

MOV DATA_OUT,R1 ;指令的数据部分,显示个位

LCALL SEND

MOV A,#10011111B

MOVX @DPTR,A

MOV DATA_OUT,#11001001B ;下载数据且按方式1

译码,找到了第2个数码管

LCALL SEND

LCALL DELAY25 ;T4,指令与数据时间间隔

MOV DATA_OUT,R2 ;指令的数据部分,显示个位

LCALL SEND

MOV A,#10011111B

MOVX @DPTR,A

MOV DATA_OUT,#11001010B ;下载数据且按方式1译码,

找到了第3个数码管

LCALL

SEND

;T4,指令与数据时间间隔

LCALL

DELAY25

MOV

DATA_OUT,R3

;指令的数据部分,显示个位

LCALL

SEND

MOV

A,#10011111B




//

MOVX

@DPTR,A

LCALL

DELAY1MS

;显示延时

MOV

A,R4

;把数字转换为2 BCD

MOV

B,#10

DIV

AB

MOV

R6,B

;个位放在R6

MOV

R7,A

;十位放在R7

MOV

DATA_OUT,#11001011B

;下载数据且按方式1 译码,

找到了第4个数码管

//

LCALL

SEND

LCALL

DELAY25

;T4,指令与数据时间间隔

MOV

DATA_OUT,R6

;指令的数据部分,显示个位

LCALL

SEND

MOV

A,#10011111B

MOVX

@DPTR,A

LCALL

DELAY1MS

;显示延时

MOV

DATA_OUT,#11001100B

;下载数据且按方式1 译码,

找到了第5个数码管

//

LCALL

SEND

LCALL

DELAY25

;T4,指令与数据时间间隔

MOV

DATA_OUT,R7

;指令的数据部分,显示十位

LCALL

SEND

MOV

A,#10011111B

MOVX

@DPTR,A

LCALL

DELAY1MS

;显示延时

MOV

A,R5

;把数字转换为2 BCD

MOV

B,#10

DIV

AB

MOV

R6,B

;个位放在R6

MOV

R7,A

;十位放在R7

MOV

DATA_OUT,#11001101B

;下载数据且按方式1 译码,

找到了第6个数码管

//

LCALL

SEND

;T4,指令与数据时间间隔

LCALL

DELAY25

MOV

DATA_OUT,R6

;指令的数据部分,显示个位

LCALL

SEND

;显示延时

MOV

A,#10011111B

MOVX

@DPTR,A

LCALL

DELAY1MS




MOV

DATA_OUT,#11001110B

;下载数据且按方式1 译码,

找到了第7个数码管

//

LCALL

SEND

;T4,指令与数据时间间隔

LCALL

DELAY25

MOV

DATA_OUT,R7

;指令的数据部分,显示十位

LCALL

SEND

;显示延时

MOV

A,#10011111B

MOVX

@DPTR,A

LCALL

DELAY1MS

LJMP

MAIN

;下一循环

SJMP

$

;发送子程序

SEND:

CLR

ET0

BIT_COUNT,#8

;加锁

MOV

;无论指令还是数据,一次只发送

8

MOV

A,#00011111B

;CS 为低电平

MOVX

@DPTR,A

;T1,CS 下降沿至CLK 脉冲时间

LCALL

DELAY50

;发送循环,HD7279A采用串行方式与微处理器通讯,一次发送一位

SENDLOOP:

MOV

A,DATA_OUT

;取出发送的指令或数据

MOV

C,ACC.7

;串行发送从高位到低位发送,故先取

最高位

MOV

C

A,#00011111B

;输出到DAT

MOV

ACC.5,C

;CLK 为高电平

MOVX

@DPTR,A

SETB

C

MOV

ACC.6,C

;T2,传送指令时CLK 脉冲宽度

MOVX

@DPTR,A

LCALL

DELAY8

CLR

ACC.6,C

;CLK 为低电平

MOV

MOVX

@DPTR,A

;T3,字节传送中CLK 脉冲时间

LCALL

DELAY8

MOV

A,DATA_OUT

;移位待发送的指令或数据,为下一位

的发送作准备

RL

A

;发送不到8 ,继续循环

MOV

DATA_OUT,A

DJNZ

BIT_COUNT,SENDLOOP

MOV

A,#00011111B

;发送完毕,恢复DAT

MOVX

@DPTR,A




SETB

ET0

;释放锁

RET

;接收子程序(本程序中用不到,但在添加按键操作的时候用于读取键值)

RECEIVE: CLR

MOV

ET0

BIT_COUNT,#8

;加锁

;接收8 位数据

MOV

DATA_IN,#0

;清空接收数据缓冲寄存器

MOV

A,#00111111B

;CS 为低电平,同时保证DAT

为高电平(输入状态)

MOVX

@DPTR,A

;T5,读键盘指令中指令与数据时间间

LCALL

DELAY25

;接收循环,HD7279A采用串行方式与微处理器通讯,一次接收一位

RECEIVELOOP:SETB

ACC.6

;CS 为高电平

MOVX

@DPTR,A

;T6,输出键盘数据建立时间

LCALL

DELAY8

MOV

A,DATA_IN

;接收数据缓冲寄存器向左移位,准备

接收一位数据,数据的高位会先发送

RL

A

;读取数据

MOV

DATA_IN,A

MOVX

A,@DPTR

MOV

C,ACC.5

;取出数据位DAT

MOV

A,DATA_IN

;数据放进接收数据缓冲寄存器

MOV

ACC.0,C

MOV

DATA_IN,A

MOV

A,#00111111B

;CS 为低电平,同时保证DAT

为高电平(输入状态)

MOVX @DPTR,A

LCALL DELAY8 ;T7,读键盘数据是CLK脉冲宽

DJNZ BIT_COUNT,RECEIVELOOP;接收不到8,继续循环

MOV A,#00011111B ;接收完毕,恢复DAT

MOVX @DPTR,A

SETB ET0 ;释放锁

RET

;定时器0中断程序

TIME0:

//

DJNZ

R4,NEXT

;定时器一个周期内中断数不够就继

续计时

//

INC

R2

R4,#20

;数字加1

MOV

;重置定时器一个周期内中断数




NEXT:

CJNE

R2,#100,NEXT

;数字不够100 继续加1

MOV

R2,#0

;数字到达100 就清零

INC

R3

;定时器方式1 中断后需要重新

CJNE

R3,#10,NEXT

MOV

R3,#0

INC

R4

CJNE

R4,#60,NEXT

MOV

R4,#0

INC

R5

CJNE

R5,#60,NEXT

MOV

R5,#0

MOV

TH0,#0FCH

设置定时器定时值
MOV TL0,#18H
RETI

KBHIT:

PUSH

PSW

START:

PUSH

ACC

PUSH

DPH

PUSH

DPL

PUSH

DATA_OUT

PUSH

BIT_COUNT

MOV

A,R0

PUSH

ACC

MOV

A,R1

PUSH

ACC

MOV

DATA_OUT,#00010101B

LCALL

SEND

LCALL

DELAY25

LCALL

RECEIVE

MOV

A,DATA_IN

JZ

START

DEC

A

DEC

A

JZ

STOP

DEC

A

JZ

CLEAR

SJMP

OUT

SETB

TR0

SJMP

OUT




STOP:

CLR

TR0

CLEAR:

SJMP

OUT

MOV

R2,#0

OUT:

MOV

R3,#0

MOV

R4,#0

MOV

R5,#0

POP

ACC

MOV

R1,A

POP

ACC

MOV

R0,A

POP

BIT_COUNT

POP

DATA_OUT

POP

DPL

POP

DPH

POP

ACC

POP

PSW

RETI

;延时25ms子程序

DELAY25MS:MOV R0,#49

D11: MOV R1,#253

NOP

D12:

DJNZ

R1,D12

DJNZ

R0,D11

RET

;延时50μs子程序

DELAY50:

MOV

R0,#23

NOP

D21:

DJNZ

R0,D21

RET

;延时25μs子程序

DELAY25:

MOV

R0,D31

R0,#11

D31:

DJNZ

RET

;延时8μs子程序



DELAY8:

MOV

R0,#2

NOP

D41:

DJNZ

R0,D41

RET

;延时1ms子程序

DELAY1MS:

MOV

R0,#2

NOP

D51:

MOV

R1,#247

NOP

D52:

DJNZ

R1,D52

DJNZ

R0,D51

RET

END

因篇幅问题不能全部显示,请点此查看更多更全内容

Top