📄 单片机.txt
字号:
Z8279 EQU 0FF82H ; 8279状态/命令口地址
D8279 EQU 0FF80H ; 8279数据口地址
LEDMOD EQU 10H ; 右端输入,8位字符显示
LEDFEQ EQU 38H ; 扫描频率分频系数为18h=24
LEDWRO EQU 90H ; 设定的将要写入的"显示RAM地址", 地址从0000开始,自动增量AI=1
HOUR EQU 42H
MINUTE EQU 41H
SECOND EQU 40H
KEY EQU 43H
BASHI EQU 44H
BAFEN EQU 45H
BAMIAO EQU 46H
YISHI EQU 47H
YIFEN EQU 48H
YIMIAO EQU 49H
ERSHI EQU 4AH
ERFEN EQU 4BH
ERMIAO EQU 4CH
WUSHI EQU 4DH
WUFEN EQU 4EH
WUMIAO EQU 4FH
BASIGNAL EQU 5AH ;8定时到标志存放地址
YISIGNAL1 EQU 5BH ;11:30第一次标志
YISIGNAL2 EQU 5CH ;11:30第二次标志
ERSIGNAL EQU 5DH ;12:30到标志
WUSIGNAL1 EQU 5EH ;5点到第一次标志
WUSIGNAL2 EQU 5FH ;5点到第二次标志
MON EQU 2BH
LAST EQU 28H
NEXT EQU 29H
SHIFT EQU 2AH
ORG 0000H ;主程序开始
AJMP START
ORG 000BH
AJMP T0INT
ORG 0040H
START:
MOV BASHI,#08H
MOV BAFEN,#00H
MOV BAMIAO,#00H
MOV YISHI,#11H
MOV YIFEN,#30H
MOV YIMIAO,#00H
MOV ERSHI,#12H
MOV ERFEN,#30H
MOV ERMIAO,#00H
MOV WUSHI,#17H
MOV WUFEN,#00H
MOV WUMIAO,#00H
CLR P1.0 ;开始时灭p1,p2
CLR P1.1
CLR P1.2
MOV R1,#20H ;开启一个从20开始的内存块用来存表的读数,初始清零
MOV R2,#08H
MOV A,#00H
LOOP22:
MOV @R1,A
INC R1
DJNZ R2,LOOP22
MOV 22H,#40H
MOV 25H,#40H
MOV R1,#50H ;开启一个从50开始的内存块用来存显示定时时间的读数,初始清零
MOV R2,#08H
MOV A,#40H
LOOP21:
MOV @R1,A
INC R1
DJNZ R2,LOOP21
MOV 52H,#40H
MOV 55H,#40H
MOV SP,#60H
MOV SECOND,#00H ; 初始清表的各位值
MOV MINUTE,#00H
MOV HOUR,#00H
LCALL LOOP77 ;查表子程序
LCALL INIT8279 ;显示子程序
CLR TF0
MOV TMOD,#01H ;设定T0为模式1定时方式
MOV TH0,#4BH
MOV TL0,#0FCH ;T0定时时间为50ms
MOV IE,#82H ;开中断
SETB TR0
MOV R2,#14H ;计数器初值20
DENG:
LCALL WAIT ;等待键盘输入程序
SJMP DENG
INIT8279: ;显示子程序
PUSH DPH
PUSH DPL
PUSH ACC
PUSH 02H
PUSH 01H
LCALL DELAY
MOV R1,#20H
MOV R2,#08H
MOV DPTR,#Z8279 ;设置8279工作方式
MOV A,#LEDMOD
MOVX @DPTR,A
MOV A,#LEDFEQ
MOVX @DPTR,A
MOV DPTR,#Z8279
MOV A,#LEDWRO
MOVX @DPTR,A
MOV DPTR,#D8279
MOV R1,#20H
LOOP33:
MOV A,@R1
MOVX @DPTR,A
INC R1
DJNZ R2,LOOP33
SJMP LOOP30
POP 01H
POP 02H
POP ACC
POP DPL
POP DPH
RET
DELAY:
PUSH 00H
PUSH 01H
MOV R0,#00H
DELAY1:
MOV R1,#00H
DJNZ R1,$
DJNZ R0,DELAY1
POP 01H
POP 00H
RET
T0INT: ;中断程序
MOV TH0,#4BH
MOV TL0,#0FCH
DJNZ R2,LOOP4 ;判断是否到1秒,到1秒中断返回
MOV R2,#14H
MOV A,SECOND
ADD A,#01H ;秒加1
DA A
MOV SECOND,A
CJNE A,#60H,LOOP5
MOV SECOND,#00H
MOV A, MINUTE
ADD A,#01H ;分加1
DA A
MOV MINUTE,A
CJNE A,#60H,LOOP5 ;判断是否到1小时
MOV MINUTE,#00H
MOV A,HOUR
ADD A,#01H ;小时加1
DA A
MOV HOUR,A
CJNE A,#24H,LOOP5
MOV HOUR,#00H
LOOP5:
MOV R2,#14H ;计数器重赋初值20
LCALL LOOP77 ;调查表子程序
LCALL DINGSHIDAO ;调报时自程序
LOOP4:
RETI
LOOP77: ;查字形表子程序
LCALL CHAIFEN ;调拆分秒位程序
MOV A,R3
MOV DPTR,#LEDSEG ;查表找出字形码
MOVC A,@A+DPTR
MOV 20H,A
MOV A,R4
MOVC A,@A+DPTR
MOV 21H,A
LCALL CHAIFEN1 ;调拆分分位程序
MOV A,R3
MOV DPTR,#LEDSEG ;查表找出字形码
MOVC A,@A+DPTR
MOV 23H,A
MOV A,R4
MOVC A,@A+DPTR
MOV 24H,A
LCALL CHAIFEN2 ;调拆分时位程序
MOV A,R3
MOV DPTR,#LEDSEG ;查表找出字形码
MOVC A,@A+DPTR
MOV 26H,A
MOV A,R4
MOVC A,@A+DPTR
MOV 27H,A
LCALL INIT8279
RET
CHAIFEN: ;拆分表的秒位子程序
PUSH ACC
MOV A,SECOND
MOV R3,A
MOV R4,A
MOV A,#0FH
ANL A,R3
MOV R3,A
MOV A,#0F0H
ANL A,R4
SWAP A
MOV R4,A
POP ACC
RET
CHAIFEN1: ;拆分表的分位子程序
PUSH ACC
MOV A, MINUTE
MOV R3,A
MOV R4,A
MOV A,#0FH
ANL A,R3
MOV R3,A
MOV A,#0F0H
ANL A,R4
SWAP A
MOV R4,A
POP ACC
RET
CHAIFEN2: ;拆分表的时位子程序
PUSH ACC
MOV A,HOUR
MOV R3,A
MOV R4,A
MOV A,#0FH
ANL A,R3
MOV R3,A
MOV A,#0F0H
ANL A,R4
SWAP A
MOV R4,A
POP ACC
RET
WAIT: ;等待键盘输入子程序
MOV DPTR,#Z8279 ;从8279的状态口读状态
MOVX A,@DPTR ;保留状态字的低4位
ANL A,#0FH ;如果低4位为0等待
JZ WAIT
MOV A,#40H ;如果有键按下时向8279发读FIFO RAM命令
MOVX @DPTR,A ;设定FIFO RAM的地址为000
MOV DPTR,#D8279 ;指向8279的数据口
MOVX A,@DPTR ;读出FIFO RAM中000单元中的键值
YI: ;判断键值的内容
CJNE A,#01H,ER
LJMP FUZHI
ER:
CJNE A,#02H,SAN
LJMP FUZHI
SAN:
CJNE A,#03H,SI
LJMP FUZHI
SI:
CJNE A,#04H,WU
LJMP FUZHI
WU:
CJNE A,#05H,LIU
LJMP FUZHI
LIU:
CJNE A,#06H,QI
LJMP FUZHI
QI:
CJNE A,#07H,BA
LJMP FUZHI
BA:
CJNE A,#08H,JIU
LJMP FUZHI
JIU:
CJNE A,#09H,LING
LJMP FUZHI
LING:
CJNE A,#00H,MIAO
LJMP FUZHI
MIAO:
CJNE A,#SHIFT,FEN
LCALL TIAOMIAO
FEN:
CJNE A,#NEXT, SHI
LCALL TIAOFEN
SHI:
CJNE A,#LAST,ZHUANYI
LCALL TIAOSHI
LJMP LOOP44
FUZHI:
MOV KEY,A
LOOP44:
RET
ZHUANYI:
LJMP WAIT
TIAOMIAO: ;调秒位子程序
CLR EA
MOV SECOND,#00H
LCALL LOOP77
COME:
LCALL WAIT ;从键盘读十位的值
MOV A, KEY
CJNE A,#01H,L2
LJMP CONTINUE
L2:
CJNE A,#02H,L3
LJMP CONTINUE
L3:
CJNE A,#03H,L4
LJMP CONTINUE
L4:
CJNE A,#04H,L5
LJMP CONTINUE
L5:
CJNE A,#05H,GO
CONTINUE:
MOV B,#10H
MUL AB ;乘10
MOV SECOND, A
LCALL WAIT ;从键盘读个位的值
MOV A,SECOND
ADD A,KEY
DA A
MOV SECOND, A
LCALL LOOP77
SETB EA
LJMP TT
GO:
MOV A,#76H
MOV 21H,a
LCALL INIT8279
LJMP COME
TT:
RET
TIAOFEN: ;调分位子程序
CLR EA
MOV MINUTE,#00H
LCALL LOOP77
COME1:
LCALL WAIT ;从键盘读十位的值
MOV A, KEY
CJNE A,#01H,LL2
LJMP CONTINUE1
LL2:
CJNE A,#02H,LL3
LJMP CONTINUE1
LL3:
CJNE A,#03H,LL4
LJMP CONTINUE1
LL4:
CJNE A,#04H,LL5
LJMP CONTINUE1
LL5:
CJNE A,#05H,GO1
CONTINUE1:
MOV B,#10H
MUL AB ;乘10
MOV MINUTE, A
LCALL WAIT ;从键盘读个位的值
MOV A,MINUTE
ADD A,KEY
DA A
MOV MINUTE, A
LCALL LOOP77
SETB EA
LJMP TT1
GO1:
MOV a,#76h
MOV 24h,a
LCALL INIT8279
LJMP COME1
TT1:
RET
TIAOSHI: ;调时位子程序
CLR EA
MOV HOUR,#00H
LCALL LOOP77
DU:
LCALL WAIT ;从键盘读十位的值
MOV A, KEY
CJNE A,#00H,J1
LJMP MO
J1:
CJNE A,#01H,J2
LJMP MO
J2:
CJNE A,#02H,CUO
LJMP DUI
CUO:
MOV a,#76h
MOV 27h,a
LCALL INIT8279
LJMP DU
DUI:
MOV B,#10H
MUL AB ;乘10
MOV HOUR, A
DU1:
LCALL WAIT ;从键盘读个位的值
CJNE A,#00H,JJ1
LJMP PLUS
JJ1:
CJNE A,#01H,JJ2
LJMP PLUS
JJ2:
CJNE A,#02H,JJ3
LJMP PLUS
JJ3:
CJNE A,#03H,CUO1
LJMP PLUS
CUO1:
MOV a,#76h
MOV 26h,a
LCALL INIT8279
LJMP DU1
PLUS:
MOV A,HOUR
ADD A,KEY
DA A
MOV HOUR, A
LCALL LOOP77
LJMP FANHUI
MO:
MOV B,#10H
MUL AB ;乘10
MOV HOUR, A
LCALL WAIT ;从键盘读个位的值
MOV A,HOUR
ADD A,KEY
DA A
MOV HOUR, A
LCALL LOOP77
FANHUI:
SETB EA
RET
DINGSHIDAO:
EIGHT: ;判断第一个定时时间
MOV A,HOUR
CJNE A, BASHI,EIGHT1
MOV A, MINUTE
CJNE A, BAFEN,EIGHT1
MOV A,SECOND
CJNE A,BAMIAO,EIGHT1
SETB P1.0 ;定时时间到亮p1灯
EIGHT1:
MOV A,HOUR
CJNE A, BASHI,ELEVEN
MOV A, MINUTE
CJNE A, BAFEN,ELEVEN
MOV A,BAMIAO
ADD A,#02H ;将秒位的值加2,存在baxin中
MOV BASIGNAL,A
MOV A,SECOND
CJNE A,BASIGNAL,ELEVEN
CLR P1.0 ;两秒钟后灭灯p1
ELEVEN: ;判断第二个定时时间
MOV A, HOUR
CJNE A, YISHI,ELEVEN1
MOV A, MINUTE
CJNE A, YIFEN,ELEVEN1
MOV A,SECOND
CJNE A,YIMIAO,ELEVEN1
SETB P1.0 ;定时时间到亮p1,p2灯
SETB P1.1
ELEVEN1:
MOV A, HOUR
CJNE A, YISHI,ELEVEN2
MOV A, MINUTE
CJNE A, YIFEN,ELEVEN2
MOV A,YIMIAO
ADD A,#02H ;将秒位的值加2,存在YIXIN1中
MOV YISIGNAL1,A
MOV A,SECOND
CJNE A,YISIGNAL1,ELEVEN2
CLR P1.0 ;两秒钟后灭灯p1
ELEVEN2:
MOV A,YISHI
ADD A,#01H ;将时位的值加1,存在YIXIN2中
MOV YISIGNAL2,A
MOV A, HOUR
CJNE A,YISIGNAL2,TWELVE
MOV A, MINUTE
CJNE A, YIFEN,TWELVE
MOV A,SECOND
CJNE A,YIMIAO,TWELVE
CLR P1.1 ;一小时后灭灯p2
TWELVE: ;判断第三个定时时间
MOV A, HOUR
CJNE A, ERSHI,TWELVE1
MOV A, MINUTE
CJNE A, ERFEN,TWELVE1
MOV A,SECOND
CJNE A,ERMIAO,TWELVE1
SETB P1.0 ;定时时间到亮p1灯
TWELVE1:
MOV A, HOUR
CJNE A, ERSIGNAL,FIVE
MOV A, MINUTE
CJNE A, ERFEN,FIVE
MOV A,ERMIAO
ADD A,#02H ;将秒位的值加2,存在ERXIN中
MOV ERSIGNAL,A
MOV A,SECOND
CJNE A,ERSIGNAL ,FIVE
CLR P1.0 ;两秒钟后灭灯p1
FIVE: ;判断第四个定时时间
MOV A, HOUR
CJNE A, WUSHI,FIVE1
MOV A, MINUTE
CJNE A,WUFEN,FIVE1
MOV A,SECOND
CJNE A,WUMIAO,FIVE1
SETB P1.0 ;定时时间到亮p1,p2灯
SETB P1.1
FIVE1:
MOV A, HOUR
CJNE A, WUSHI,FIVE2
MOV A, MINUTE
CJNE A,WUFEN,FIVE2
MOV A,WUMIAO
ADD A,#02H ;将秒位的值加2,存在WUXIN1中
MOV WUSIGNAL1,A
MOV A,SECOND
CJNE A,WUSIGNAL1,FIVE2
CLR P1.0 ;两秒钟后灭灯p1
FIVE2:
MOV A, HOUR
CJNE A, WUSHI,LOOPBB
MOV A,WUFEN
ADD A,#10H ;将分位的值加10,存在WUXIN2中
MOV WUSIGNAL2,A
MOV A, MINUTE
CJNE A,WUSIGNAL2,LOOPBB
MOV A,SECOND
CJNE A,WUMIAO,LOOPBB
CLR P1.1 ;十分钟后灭灯p2
LOOPBB:
RET
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H;
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -