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