您的当前位置:首页正文

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

2020-10-21 来源:个人技术集锦
 ;此程序为在两个数码管上实现00-99的轮回显示

;设置ram

DATA_IN DATA 20H DATA_OUT DATA 21H BIT_COUNT DATA 22H // HOUR DATA 23H // MINITE DATA 24H // SECOND DATA 25H // MSECOND DATA 26H ORG 0000H LJMP INIT ORG 000BH

LJMP TIME0 ORG 0013H LJMP KBHIT ;初始化

ORG 0030H

INIT: MOV DPTR,#4000H MOV A,#10011111B CS.CLK.DATA

MOVX @DPTR,A

;吸收数据缓冲存放器 ;发送数据缓冲存放器 ;数据位数存放器 ;准时器0中止进口 ;HD7279A的地址 ;HD7279A初始化 LCALL DELAY25MS ;延时落后入工作状况 MOV DATA_OUT,#10100100B ;HD7279A复位指令

LCALL SEND ;发送指令

MOV MOVX // MOV 内的中止数

MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV R5,#0// MOV // MOV // MOV // MOV MOV MOV MOV 模式为方法1

// MOV // MOV A,#10011111B @DPTR,A

R4,#20

MSECOND,#0 SECOND,#0 MINITE,#0

HOUR,#0 ; R6,#0 R7,#0 TMOD,#1 TH0,#3CH TL0,#0B0H

;设回CS为高电平 ;准时器一个周期

数字计数器 ;个位存放器 ;十位存放器

;设置准时器0工作;设置准时器准时价 MOV TH0,#0FCH ;设置准时器准时价

MOV TL0,#18H

SETB EA ;开总中止

SETB ET0 ;开准时器0中止 SETB EX1

SETB TR0 ;开端计时 ;主程序

MAIN: MOV A,R2 ;把数字转换为2个BCD码

MOV B,#10 DIV AB

MOV R6,B ;个位放在R6 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

LCALL DELAY25 ;T4,指令与数据时光距离

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

LCALL DELAY25 ;T4,指令与数据时光距离

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

LCALL SEND

MOV A,#10011111B

MOVX @DPTR,A

// LCALL DELAY1MS ;显示延时

MOV DATA_OUT,#11001110B ;下载数据且按方法1译码,找到了第7个数码管 LCALL SEND

LCALL DELAY25 距离

MOV DATA_OUT,R7 显示十位

LCALL SEND

MOV A,#10011111B MOVX @DPTR,A

// LCALL DELAY1MS LJMP MAIN SJMP $ ;发送子程序

SEND: CLR ET0 MOV BIT_COUNT,#8 据,一次只发送8位

MOV A,#00011111B MOVX @DPTR,A

LCALL DELAY50 ;T4,指令与数据时光 ;指令的数据部分,;显示延时 ;下一轮回 ;加锁

;无论指令照样数 ;设CS为低电平 ;T1,从CS降低沿至

CLK脉冲时光

;发送轮回,HD7279A采取串行方法与微处理器通信,一次发送一位

SENDLOOP: MOV A,DATA_OUT ;掏动身送的指令或数据

MOV C,ACC.7 位发送,故先取最高位

MOV A,#00011111B MOV ACC.5,C MOVX @DPTR,A

SETB C MOV ACC.6,C MOVX @DPTR,A

LCALL DELAY8 CLK脉冲宽度

CLR C MOV ACC.6,C MOVX @DPTR,A

LCALL DELAY8 CLK脉冲时光

MOV A,DATA_OUT 数据,为下一位的发送作预备

;串行发送从高位到低 ;输出到DAT位

;设CLK为高电平 ;T2,传送指令时;设CLK为低电平 ;T3,字节传送中 ;移位待发送的指令或 RL A

MOV DATA_OUT,A

DJNZ BIT_COUNT,SENDLOOP ;发送不到8位,持续轮回

MOV A,#00011111B ;发送完毕,恢复DAT

MOVX @DPTR,A

SETB ET0 ;释放锁 RET

;吸收子程序(本程序顶用不到,但在添加按键操纵的时刻用于读取键值)

RECEIVE: CLR ET0 ;加锁

MOV BIT_COUNT,#8 ;吸收8位数据 MOV DATA_IN,#0 ;清空吸收数据缓冲存放器

MOV A,#00111111B ;设CS为低电平,同时包管DAT为高电平(输入状况) MOVX @DPTR,A

LCALL DELAY25 ;T5,读键盘指令中指令与数据时光距离

;吸收轮回,HD7279A采取串行方法与微处理器通信,一次吸收一位

RECEIVELOOP:SETB ACC.6 ;设CS为高电平 MOVX @DPTR,A

LCALL DELAY8 ;T6,输出键盘数据树立时光

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 // MOV R4,#20 周期内里断数

CJNE R2,#100,NEXT 1

MOV R2,#0 INC R3

CJNE R3,#10,NEXT MOV R3,#0

INC R4

CJNE R4,#60,NEXT MOV R4,#0 INC R5

CJNE R5,#60,NEXT

;释放锁

;准时器一个周期;数字加1

;重置准时器一个;数字不敷100持续加;数字到达100就清零 MOV R5,#0

NEXT: MOV TH0,#0FCH ;准时器方法1中止后须要从新设置准时器准时价 MOV TL0,#18H KBHIT: PUSH PUSH DPH PUSH DATA_OUT MOV DATA_OUT,#00010101B LCALL SEND RETI

PUSH ACCPUSH DPLPUSH BIT_COUNTMOV A,R0PUSH ACCMOV A,R1PUSH ACCLCALL DELAY25LCALL RECEIVEMOV A,DATA_INJZ STARTDEC APSW

DEC A JZ STOP DEC A JZ CLEAR SJMP OUT

START: SETB TR0 STOP: CLR TR0 CLEAR: MOV OUT: POP ACC MOV R1,A POP DATA_OUT SJMP OUTSJMP OUTMOV MOV MOV POP ACCMOV R0,APOP BIT_COUNTPOP DPLPOP DPHPOP ACC

R2,#0 R3,#0 R4,#0 R5,#0

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,#11 D31: DJNZ R0,D31 RET

;延时8μs子程序 DELAY8: MOV R0,#2 NOP

D41: DJNZ R0,D41

RET

;延时1ms子程序 DELAY1MS: MOV NOP

D51: MOV NOP

D52: DJNZ DJNZ RET END

R0,#2 R1,#247 R1,D52 R0,D51

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