汇编语言知识学习在两个数码管上实现0099的循环显示.docx
《汇编语言知识学习在两个数码管上实现0099的循环显示.docx》由会员分享,可在线阅读,更多相关《汇编语言知识学习在两个数码管上实现0099的循环显示.docx(15页珍藏版)》请在冰豆网上搜索。
汇编语言知识学习在两个数码管上实现0099的循环显示
;此程序为在两个数码管上实现00-99的循环显示
;设置ram
DATA_IN
DATA20H
;接收数据缓冲寄存器
DATA_OUT
DATA21H
;发送数据缓冲寄存器
BIT_COUNT
DATA22H
;数据位数寄存器
//
HOUR
DATA23H
//
MINITE
DATA24H
//
SECOND
DATA25H
//
MSECOND
DATA26H
ORG
0000H
LJMP
INIT
ORG
000BH
LJMP
TIME0
定时器0中断入口
ORG
0013H
LJMP
KBHIT
;初始化
ORG
0030H
INIT:
MOV
DPTR,#4000H
;HD7279A的地址
MOV
A,#10011111B
;HD7279A初始化CS、CLK、
DATA
MOVX
@DPTR,A
LCALL
DELAY25MS
;延时后进入工作状态
MOV
DATA_OUT,#1O1OO1OOB
;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,#O
//
MOV
SECOND,#。
//
MOV
MINITE,#0
//
MOV
HOUR,#0
;数字计数器
MOV
R6,#0
;个位寄存器
MOV
R7,#0
;十位寄存器
SETB
EA
开总中断
SETB
ET0
;开定时器0中断
SETB
EX1
SETB
TR0
;开始计时
注程序
MAIN:
MOV
A,R2
MOV
B,#10
DIV
AB
MOV
R6,B
MOV
R7,A
;把数字转换为2个BCD码
;个位放在R6
;十位放在R7
译码,找到了第1个数码管
LCALL
SEND
LCALL
DELAY25
;T4,指令与数据时间间隔
MOV
DATA_OUT,R1
;指令的数据部分,显示个位
LCALL
SEND
MOV
A,#10011111B
MOVX
@DPTR,A
MOV
DATA_OUT,#11001001B;下载数据且按方式-
译码,找到了第2个数码管
LCALL
SEND
LCALL
DELAY25
;T4,指令与数据时间间隔
MOV
DATA_OUT,R2
;指令的数据部分,显示个位
LCALL
SEND
MOV
A,#10011111B
MOVX
@DPTR,A
MOV
DATA_OUT,#11OO1O1OB
;下载数据且按方式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,#11OO11OOB
;下载数据且按方式
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,#11OO11O1B
;下载数据且按方式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
;移位待发送的指令或数据,为下
;取出发送的指令或数据
一位的发送作准备
RLA
MOVDATA_OUT,A
DJNZBIT_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
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
为高电平
TIMEO:
//
;定时器0中断程序
DJNZR4,NEXT淀时器一个周期内中断数不够就继续计时
INC
R2
;数字加1
//
MOV
R4,#20
CJNE
R2,#100,NEXT
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
MOV
R5,#0
NEXT:
MOV
TH0,#0FCH
设置定时器定时值
;重置定时器一个周期内中断数
数字不够100继续加1
;数字到达100就清零
;定时器方式1中断后需要重新
MOV
TL0,#18H
RETI
KBHIT:
PUSH
PSW
PUSH
ACC
PUSH
DPH
PUSH
DPL
START:
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
SJMP
TR0
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
DJNZR0,D11
RET
涎时50阴子程序
DELAY50:
MOV
R0,#23
NOP
D21:
DJNZ
R0,D21
RET
涎时25阴子程序
DELAY25:
MOV
R0,#11
D31:
DJNZ
R0,D31
RET
DELAY8:
D41:
;延时8阳子程序
MOVR0,#2
NOP
DJNZR0,D41
RET
END