;此程序为在两个数码管上实现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 初始化CS、CLK、 |
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
因篇幅问题不能全部显示,请点此查看更多更全内容