📄 家庭时钟6.10.asm
字号:
;本实验是做一个计时器,能从00:00计到59:59共1个小时。
;数码管1、2位为时,3、4位为分。
DS1 EQU 22H ;数码管显示缓存
DS2 EQU 23H
DS3 EQU 24H
DS4 EQU 25H
BUFF_LP EQU 28H
BUFF_LED_LP EQU 29H ;T0键盘显示扫描缓存
HOR EQU 30H ;时值缓存
MIN EQU 31H ;分钟值缓存
SEC EQU 32H ;秒值缓存
SET_TIME BIT 33H
SET_CLOCK BIT 34H
RAM1 EQU 35H
RAM2 EQU 36H
LED_PORT EQU P0 ;数码管段码接口
KEY EQU P1
GRE BIT P2.0
RED BIT P2.1
BUZZ BIT P2.2
LED BIT P2.3
IRC BIT P3.2
ORG 000H
JMP MAIN
ORG 003H
JMP INT0
ORG 00BH
JMP T0_INT
ORG 0100H
MAIN: MOV SP ,#40H
MOV PSW,#00H
MOV R0,#7FH ;初始化RAM区,
CLR_RAM:MOV A,#00H
MOV @R0,A
DJNZ R0,CLR_RAM
MOV P1,0FFH
MOV P2,0FFH
MOV P0,0FFH
MOV P3,0FFH
MOV TH0,#0F0H ;装入定时时间T0=4MS
MOV TL0,#060H
MOV IE,#83H
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
MOV TMOD,#01H
SETB TR0 ;开始定时
SETB IRC
SETB BUZZ ;关蜂鸣器
SETB LED ;关LED
SETB RED
SETB GRE
CLR SET_TIME
CLR SET_CLOCK
MOV KEY,#0FFH ;设P1口为输入口
LOOP: MOV A,KEY
CJNE A,#0FFH,START
LJMP LOOP
START: LCALL DEL_10MS
JNB SET_TIME,KEY5;;;;;
KEY1: JB ACC.0,KEY2
MOV A,HOR ;
CJNE A,#23,ADD_HOR ;
MOV HOR,#0 ;
LJMP KEY1OUT
ADD_HOR:INC HOR ;
KEY1OUT:LJMP KEYFRE
KEY2: JB ACC.1,KEY3
MOV A,HOR ;
CJNE A,#00,SUB_HOR ;
MOV HOR,#23 ;
LJMP KEY2OUT
SUB_HOR:DEC HOR ;
KEY2OUT:LJMP KEYFRE
KEY3: JB ACC.2,KEY4
MOV A,MIN ;
CJNE A,#59,ADD_MIN ;
MOV MIN ,#0 ;
LJMP KEY3OUT
ADD_MIN:INC MIN ;
KEY3OUT:LJMP KEYFRE
KEY4: JB ACC.3,KEY5
MOV A,MIN ;
CJNE A,#00,SUB_MIN ;
MOV MIN ,#59 ;
LJMP KEY2OUT
SUB_MIN :DEC MIN ;
KEY4OUT:LJMP KEYFRE
KEY5: JB ACC.4,KEY6
LCALL BELL
JBC SET_TIME,K5_OUT
SETB SET_TIME
CLR SET_CLOCK
CLR RED
SETB GRE
LJMP KEYFRE
K5_OUT:SETB RED
LJMP KEYFRE
KEY6: JB ACC.5,KEY7
LCALL BELL
JBC SET_CLOCK,K6_OUT
SETB SET_CLOCK
CLR SET_TIME
SETB RED
CLR GRE
LJMP KEYFRE
K6_OUT:SETB GRE
LJMP KEYFRE
KEY7: JB ACC.6,KEY8
;CPL GRE
LJMP KEYFRE
KEY8: JB ACC.7,KEYFRE
;CPL RED
LJMP KEYFRE
KEYFRE: JB SET_TIME,KEYR1
JNB SET_CLOCK,KEYR2
KEYR1:LCALL BELL
KEYR2:MOV A,KEY ;等待键释放
CPL A
XRL A,#00H
JNZ KEYR2
LJMP LOOP
BELL : MOV R5,#100
BEL: CLR BUZZ
LCALL DEL
SETB BUZZ
LCALL DEL
DJNZ R5,BEL
RET
DEL: MOV R7,#2
DEL01: MOV R6,#25
DJNZ R6,$
DJNZ R7,DEL01
RET
DEL_10MS: MOV R6,#25
D10MS: MOV R7,#250
DJNZ R7,$
DJNZ R6,D10MS
RET
YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;延时程序3,精确延时1000微秒
D3: MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
BIN_BCD: MOV B,#10
DIV AB
RET
;以下为进入P3.2脚外部中断子程序,也就是解码程序
INT0: CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#10
SB: ACALL YS1;调用882微秒延时子程序
JB IRC,EXIT;延时882微秒后判断IR脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB IRC, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R7,#26;忽略前26位系统识别码
JJJJA: JNB IRC,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,IRC;将IR引脚此时的电平状态0或1存入C中
JNC UUUA;如果为0就跳转到UUUA
LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
;========保存识别码
UUUA: DJNZ R7,JJJJA
MOV R1,#RAM1;设定1AH为起始RAM区
MOV R2,#2;接收从1AH到1BH的2个内存,用于存放操作码和操作反码
PP: MOV R3,#8;每组数据为8位
JJJJ: JNB IRC,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,IRC;将IR引脚此时的电平状态0或1存入C中
JNC UUU;如果为0就跳转到UUU
LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将R1中地址的给A
RRC A;将C中的值0或1移入A中的最低位
MOV @R1,A;将A中的数暂时存放在R1数值的内存中
DJNZ R3,JJJJ;接收满8位换一个内存
INC R1;对R1中的值加1,换下一个RAM
DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中
MOV A,RAM1
CPL A;对RAM1取反后和RAM2比较
CJNE A,RAM2,EXIT;如果不等表示接收数据发生错误,放弃
MOV A,RAM1
SWAP A
ANL A,#0FH
MOV DS1,A
MOV A,RAM1
ANL A,#0FH
MOV DS2,A
;=====解码正确===============
KK: ;LCALL BELL
EXIT:
SETB EA ;允许中断
RETI ;退出解码子程序
;===============数码管扫描定时中断================
T0_INT: PUSH ACC
PUSH PSW
MOV TH0,#0F0H ;T0=4MS
MOV TL0,#060H
INC BUFF_LED_LP
MOV A,BUFF_LED_LP
CJNE A,#250,CONT_SCAN ;250*4MS=1S
MOV BUFF_LED_LP,#00H
INC SEC
CPL LED
MOV A,SEC
CJNE A,#60,CONT_SCAN
MOV SEC,#00H
INC MIN
MOV A,MIN
CJNE A,#60,CONT_SCAN
MOV MIN,#00H
INC HOR
MOV A,HOR
CJNE A,#24,CONT_SCAN
MOV HOR,#00H
CONT_SCAN:INC BUFF_LP
MOV A,MIN ;
LCALL BIN_BCD
MOV DS4,B
MOV DS3,A
MOV A,HOR ;
LCALL BIN_BCD
MOV DS2,B
MOV DS1,A
SCAN: MOV A,BUFF_LP
MOV B,#04
DIV AB
MOV A,B
RL A
MOV DPTR,#TAB_SCAN
JMP @A+DPTR
TAB_SCAN: AJMP SCAN_L1
AJMP SCAN_L2
AJMP SCAN_L3
AJMP SCAN_L4
SCAN_L1: CLR P2.7
SETB P2.6
SETB P2.5
SETB P2.4
MOV A,DS1
JMP END_SCAN
SCAN_L2: SETB P2.7
CLR P2.6
SETB P2.5
SETB P2.4
MOV A,DS2
JMP END_SCAN
SCAN_L3: SETB P2.7
SETB P2.6
CLR P2.5
SETB P2.4
MOV A,DS3
JMP END_SCAN
SCAN_L4: SETB P2.7
SETB P2.6
SETB P2.5
CLR P2.4
MOV A,DS4
END_SCAN: MOV DPTR,#TAB_LED
DISPLAY: MOVC A,@A+DPTR
MOV LED_PORT,A
EXIT_T0: POP PSW
POP ACC
RETI
;=========共阳数码管段码表=============
TAB_LED: DB 0C0H,0F9H,0A4H,0B0H,99H ;"0","1","2","3","4"
DB 92H,82H,0F8H,80H,90H ;"5","6","7","8","9"
DB 88H,83H,0A7H,0A1H,86H,8EH;"A","B","C","D","E","F"
DB 0FFH ;" "
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -