admin 管理员组文章数量: 887021
2024年1月26日发(作者:margin函数)
;此程序为在两个数码管上实现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
ORG
LJMP
ORG
LJMP
ORG
LJMP
;初始化
ORG
INIT: MOV
MOV
DATA
MOVX
LCALL
MOV
LCALL
MOV
MOVX
// MOV
MOV
MOV
MOV
MOV
// MOV
// MOV
// MOV
// MOV
MOV
MOV
DATA 26H
0000H
INIT
000BH
TIME0 ;定时器0中断入口
0013H
KBHIT
0030H
DPTR,#4000H ;HD7279A的地址
A,#10011111B ;HD7279A初始化CS、CLK、@DPTR,A
DELAY25MS ;延时后进入工作状态
DATA_OUT,#10100100B ;HD7279A复位指令
SEND ;发送指令
A,#10011111B ;设回CS为高电平
@DPTR,A
R4,#20 ;定时器一个周期内的中断数
R2,#0
R3,#0
R4,#0
R5,#0
MSECOND,#0
SECOND,#0
MINITE,#0
HOUR,#0 ;数字计数器
R6,#0 ;个位寄存器
R7,#0 ;十位寄存器
MOV TMOD,#1 ;设置定时器0工作模式为方式1
// MOV TH0,#3CH ;设置定时器定时值
// MOV TL0,#0B0H
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
// LCALL
MOV
MOV
DIV
MOV
MOV
MOV
找到了第4个数码管
LCALL
LCALL
MOV
LCALL
MOV
MOVX
// LCALL
MOV
找到了第5个数码管
LCALL
LCALL
MOV
LCALL
MOV
MOVX
// LCALL
MOV
MOV
DIV
MOV
MOV
MOV
找到了第6个数码管
LCALL
LCALL
MOV
LCALL
MOV
MOVX
// LCALL
@DPTR,A
DELAY1MS ;显示延时
A,R4 ;把数字转换为2个BCD码
B,#10
AB
R6,B ;个位放在R6
R7,A ;十位放在R7
DATA_OUT,#11001011B ;下载数据且按方式1译码,SEND
DELAY25 ;T4,指令与数据时间间隔
DATA_OUT,R6 ;指令的数据部分,显示个位
SEND
A,#10011111B
@DPTR,A
DELAY1MS ;显示延时
DATA_OUT,#11001100B ;下载数据且按方式1译码,SEND
DELAY25 ;T4,指令与数据时间间隔
DATA_OUT,R7 ;指令的数据部分,显示十位
SEND
A,#10011111B
@DPTR,A
DELAY1MS ;显示延时
A,R5 ;把数字转换为2个BCD码
B,#10
AB
R6,B ;个位放在R6
R7,A ;十位放在R7
DATA_OUT,#11001101B ;下载数据且按方式1译码,SEND
DELAY25 ;T4,指令与数据时间间隔
DATA_OUT,R6 ;指令的数据部分,显示个位
SEND
A,#10011111B
@DPTR,A
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 ;串行发送从高位到低位发送,故先取最高位
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 ;设CS为高电平
MOVX @DPTR,A
LCALL DELAY8 ;T6,输出键盘数据建立时间
MOV A,DATA_IN ;接收数据缓冲寄存器向左移位,准备接收一位数据,数据的高位会先发送
RL A
MOV DATA_IN,A
MOVX A,@DPTR ;读取数据
MOV ;取出数据位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
INC R3
CJNE R3,#10,NEXT
MOV R3,#0
INC R4
CJNE R4,#60,NEXT
MOV R4,#0
INC R5
;数字到达100就清零
CJNE
MOV
NEXT: MOV
设置定时器定时值
MOV
RETI
KBHIT: PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
MOV
PUSH
MOV
PUSH
MOV
LCALL
LCALL
LCALL
MOV
JZ
DEC
DEC
JZ
DEC
JZ
SJMP
START: SETB
SJMP
STOP: CLR
R5,#60,NEXT
R5,#0
TH0,#0FCH
TL0,#18H
PSW
ACC
DPH
DPL
DATA_OUT
BIT_COUNT
A,R0
ACC
A,R1
ACC
DATA_OUT,#00010101B
SEND
DELAY25
RECEIVE
A,DATA_IN
START
A
A
STOP
A
CLEAR
OUT
TR0
OUT
TR0
;定时器方式1中断后需要重新
SJMP OUT
CLEAR: MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#0
OUT: 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,#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
版权声明:本文标题:汇编语言:在两个数码管上实现00-99的循环显示 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1706202537h503959.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论