最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

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

IT圈 admin 41浏览 0评论

2024年2月24日发(作者:果颖馨)

;此程序为在两个数码管上实现00-99的循环显示之青柳念文创作

存器

存器

//

//

//

//

ORG 0013H

INIT:

;设置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

LJMP KBHIT

;初始化

ORG 0030H

MOV DPTR,#4000H

;接纳数据缓冲寄 ;发送数据缓冲寄 ;数据位数寄存器

;定时器0中断入口

;HD7279A的地

MOV

CS、CLK、DATA

MOVX

LCALL

MOV

复位指令

LCALL

MOV

MOVX

// MOV

内的中断数

MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV R5,#0// MOV

// MOV

// MOV

// MOV

A,#10011111B ;HD7279A初始化@DPTR,A

DELAY25MS ;延时后进入工作状 DATA_OUT,#10100100B ;HD7279ASEND ;发送指令

A,#10011111B ;设回CS为高电@DPTR,A

R4,#20 ;定时器一个周期

MSECOND,#0

SECOND,#0

MINITE,#0

HOUR,#0 ;数字计数

MOV R6,#0 ;个位寄存器

MOV R7,#0 ;十位寄存器

MOV TMOD,#1 ;设置定时器0工作形式为方式1

//

//

MAIN:

BCD码

MOV TH0,#3CH ;设置定时器定时MOV TL0,#0B0H

MOV TH0,#0FCH ;设置定时器定时MOV TL0,#18H

SETB EA ;开总中断

SETB ET0 ;开定时器0中断

SETB EX1

SETB TR0 ;开端计时

;主程序

MOV A,R2 ;把数字转换为2个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 ;T4,指令与数据时间间隔

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 ;设CS为低电平

MOVX @DPTR,A

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

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

SENDLOOP: MOV A,DATA_OUT ;取出发送的指令或数据

MOV C,ACC.7 ;串行发送从高位到低位发送,故先取最高位

MOV A,#00011111B ;输出到DAT位

MOV ACC.5,C

MOVX @DPTR,A

SETB C ;设CLK为高电平

MOV ACC.6,C

MOVX @DPTR,A

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

CLR C ;设CLK为低电平

MOV ACC.6,C

MOVX @DPTR,A

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

MOV A,DATA_OUT ;移位待发送的指令或数据,为下一位的发送作准备

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 ;数字加1

// MOV R4,#20 ;重置定时器一个周期内里断数

CJNE R2,#100,NEXT ;数字不敷100继续加1

MOV R2,#0 ;数字到达100就清零

INC R3

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

NEXT: MOV TH0,#0FCH

断后需要重新设置定时器定时值

MOV TL0,#18H

RETI

KBHIT: PUSH PSW

PUSH ACC

PUSH DPH

PUSH DPL

PUSH DATA_OUT

PUSH BIT_COUNT

MOV A,R0

PUSH ACC

MOV A,R1

定时器方式1;中

PUSH ACC

MOV DATA_OUT,#00010101B

LCALL SEND

LCALL DELAY25

LCALL RECEIVE

START: SETB TR0

STOP: CLR TR0

CLEAR: MOV

OUT: POP ACCMOV A,DATA_INJZ STARTDEC ADEC AJZ STOPDEC AJZ CLEARSJMP OUTSJMP OUTSJMP OUT

MOV

MOV

MOV

R2,#0

R3,#0

R4,#0

R5,#0

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,#11

D31: DJNZ R0,D31

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

2024年2月24日发(作者:果颖馨)

;此程序为在两个数码管上实现00-99的循环显示之青柳念文创作

存器

存器

//

//

//

//

ORG 0013H

INIT:

;设置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

LJMP KBHIT

;初始化

ORG 0030H

MOV DPTR,#4000H

;接纳数据缓冲寄 ;发送数据缓冲寄 ;数据位数寄存器

;定时器0中断入口

;HD7279A的地

MOV

CS、CLK、DATA

MOVX

LCALL

MOV

复位指令

LCALL

MOV

MOVX

// MOV

内的中断数

MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV R5,#0// MOV

// MOV

// MOV

// MOV

A,#10011111B ;HD7279A初始化@DPTR,A

DELAY25MS ;延时后进入工作状 DATA_OUT,#10100100B ;HD7279ASEND ;发送指令

A,#10011111B ;设回CS为高电@DPTR,A

R4,#20 ;定时器一个周期

MSECOND,#0

SECOND,#0

MINITE,#0

HOUR,#0 ;数字计数

MOV R6,#0 ;个位寄存器

MOV R7,#0 ;十位寄存器

MOV TMOD,#1 ;设置定时器0工作形式为方式1

//

//

MAIN:

BCD码

MOV TH0,#3CH ;设置定时器定时MOV TL0,#0B0H

MOV TH0,#0FCH ;设置定时器定时MOV TL0,#18H

SETB EA ;开总中断

SETB ET0 ;开定时器0中断

SETB EX1

SETB TR0 ;开端计时

;主程序

MOV A,R2 ;把数字转换为2个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 ;T4,指令与数据时间间隔

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 ;设CS为低电平

MOVX @DPTR,A

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

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

SENDLOOP: MOV A,DATA_OUT ;取出发送的指令或数据

MOV C,ACC.7 ;串行发送从高位到低位发送,故先取最高位

MOV A,#00011111B ;输出到DAT位

MOV ACC.5,C

MOVX @DPTR,A

SETB C ;设CLK为高电平

MOV ACC.6,C

MOVX @DPTR,A

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

CLR C ;设CLK为低电平

MOV ACC.6,C

MOVX @DPTR,A

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

MOV A,DATA_OUT ;移位待发送的指令或数据,为下一位的发送作准备

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 ;数字加1

// MOV R4,#20 ;重置定时器一个周期内里断数

CJNE R2,#100,NEXT ;数字不敷100继续加1

MOV R2,#0 ;数字到达100就清零

INC R3

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

NEXT: MOV TH0,#0FCH

断后需要重新设置定时器定时值

MOV TL0,#18H

RETI

KBHIT: PUSH PSW

PUSH ACC

PUSH DPH

PUSH DPL

PUSH DATA_OUT

PUSH BIT_COUNT

MOV A,R0

PUSH ACC

MOV A,R1

定时器方式1;中

PUSH ACC

MOV DATA_OUT,#00010101B

LCALL SEND

LCALL DELAY25

LCALL RECEIVE

START: SETB TR0

STOP: CLR TR0

CLEAR: MOV

OUT: POP ACCMOV A,DATA_INJZ STARTDEC ADEC AJZ STOPDEC AJZ CLEARSJMP OUTSJMP OUTSJMP OUT

MOV

MOV

MOV

R2,#0

R3,#0

R4,#0

R5,#0

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,#11

D31: DJNZ R0,D31

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

发布评论

评论列表 (0)

  1. 暂无评论