📄 电子钟1.6.asm
字号:
;程序升级说明:在1.5基础上增加了按键蜂鸣声
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
LJMP REMO ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP TIME0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
LJMP TIME1 ;跳至TIME1执行
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
;
TIME1: RETI
;
TIMEADD EQU 30H;30H做为软件计数缓存
DISP1 EQU 31H;31H做为第一位显示缓存
DISP2 EQU 32H;32H做为第二位显示缓存
DISP3 EQU 33H;33H做为第三位显示缓存
DISP4 EQU 34H;34H做为第四位显示缓存
SECLED EQU P0.0;秒点显示P1.0
HALFSEC EQU 35H;半秒计数缓存
UPKEY BIT P3.3;定义P2.7是UP键
SETKEY BIT P3.2;定义P2.0是SET键
BUZZ BIT P2.0;
;
;第1位使能P2.1
;第2位使能P2.2
;第3位使能P2.3
;第4位使能P2.4
;
ORG 0030H;
;
START:
MOV SP,#5FH;放堆栈
MOV P2,#0FFH;把P2置高
CLR P2.5;把p2.5置0
LCALL BUZZER;发出滴声
LCALL BUZZER;按键滴声
MOV TIMEADD,#0;软件计数器清零
MOV TMOD,#11H;TIME0工作于方式1,TIME1工作于方式1
MOV TH0,#3CH;
MOV TL0,#0B0H;放定时预置数15536
MOV IE,#8BH;开INT0,TIME0,TIME1
MOV IP,#02H;TIME0中断优先
SETB IT0;外部中断0为负跳变方式触发
SETB TR0;开始计数
MOV DISP1,#00H;
MOV DISP2,#00H;
MOV DISP3,#00H;
MOV DISP4,#00H;把所有显示缓存清零
MOV HALFSEC,#00H;把半秒计数缓存清零
MOV DPTR,#TAB;
SCAN:
MOV A,DISP1;把第一位显示缓存送入A
MOVC A,@A+DPTR;查表
SETB P2.7;
CLR P2.4;第一位显示使能
MOV P0,A;查表得到的7段码送给P0去显示
LCALL DELAY;延时
MOV P0,#0FFH;显示一小段时间后关掉7段显示,去显示下一位
MOV A,DISP2;
MOVC A,@A+DPTR;
SETB P2.4;
CLR P2.5;
MOV P0,A;
LCALL DELAY;
MOV P0,#0FFH;
MOV A,DISP3;
MOVC A,@A+DPTR;
SETB P2.5;
CLR P2.6;
MOV P0,A;
CLR P0.0
LCALL DELAY;
MOV P0,#0FFH;
MOV A,DISP4;
MOVC A,@A+DPTR;
SETB P2.6;
CLR P2.7;
MOV P0,A;
LCALL DELAY;
MOV P0,#0FFH;
JNB SETKEY,ADJUST;按键按下时去调整时间
;以下是进位程序
MOV A,DISP1;把第一位缓存送入A
CJNE A,#10,SCAN;如果第一位不等于10继续扫描
MOV DISP1,#00H;如果第一位等于10了就把第一位清零
INC DISP2;第二位加1
MOV A,DISP2;
CJNE A,#6,SCAN;如果第二位不等于6继续扫描
MOV DISP2,#00H;
INC DISP3;
MOV A,DISP4;
CJNE A,#2,PM;
MOV A,DISP3;
CJNE A,#4,SCAN;
MOV DISP3,#00H;
AJMP DIS4;
PM:
MOV A,DISP3;
CJNE A,#10,SCAN;
MOV DISP3,#00H;
DIS4:
INC DISP4;
MOV A,DISP4;
CJNE A,#3,SCAN;
MOV DISP4,#00H;
AJMP SCAN;
;
DELAY: ;延时子程序
MOV R7,#2
NOP
D1: MOV R6,#2
DJNZ R6,$
DJNZ R7,D1
RET
;
TAB: db 03h,9fh,25h,0dh,99h,49h,41h,1fh,01h,09h
;
;
;
;
;下面程序为设置时间用
ADJUST:
LCALL ADJDELAY;
JB SETKEY,SET1;
LCALL BUZZER;按键滴声
JNB SETKEY,$
CLR TR0; 暂时关闭计时
ADJ4:
SETB P2.4;
CLR P2.7;
MOV A,DISP4;
MOVC A,@A+DPTR;
MOV P0,A;显示第四位
JNB SETKEY,ADJ8;如果设置键有动作去调节第3位
JB UPKEY,ADJ4;加键是否按下
LCALL ADJDELAY;
JB UPKEY,ADJ4;延时后再检查加键是否按下
LCALL BUZZER;按键滴声
JNB UPKEY,$;等待加键松开
INC DISP4;第四位加1
MOV A,DISP4;
CJNE A,#3,ADJ4;第四位不等于3转移
MOV DISP4,#00H;第四位等于3清零
AJMP ADJ4;再去显示第四位
ADJ8:
LCALL ADJDELAY;
JB SETKEY,ADJ4;
LCALL BUZZER;按键滴声
JNB SETKEY,$;
ADJ3:
SETB P2.7;
CLR P2.6;
MOV A,DISP3;
MOVC A,@A+DPTR;
MOV P0,A;显示第三位
JNB SETKEY,ADJ7;
JB UPKEY,ADJ3;
LCALL ADJDELAY;
JB UPKEY,ADJ3;
LCALL BUZZER;按键滴声
JNB UPKEY,$;
INC DISP3;第3位加1
MOV A,DISP4;
CJNE A,#2,PM1;
MOV A,DISP3;
CJNE A,#4,ADJ3;第3位不等于4转移
MOV DISP3,#00H;第四位等于3清零
AJMP ADJ3;再去显示第四位
PM1:
MOV A,DISP3;
CJNE A,#10,ADJ3;
MOV DISP3,#00H;
AJMP ADJ3;
SET1:
LCALL BUZZER;按键滴声
LCALL BUZZER;按键滴声
JNB SETKEY,$;
NOP;
MOV HALFSEC,#00H;清零秒针
SETB TR0;
LJMP SCAN;
ADJ7:
LCALL ADJDELAY;
JB SETKEY,ADJ3;
LCALL BUZZER;按键滴声
JNB SETKEY,$;
ADJ2:
SETB P2.6;
CLR P2.5;
MOV A,DISP2;
MOVC A,@A+DPTR;
MOV P0,A;显示第二位
JNB SETKEY,ADJ6;
JB UPKEY,ADJ2;
LCALL ADJDELAY;
JB UPKEY,ADJ2;
LCALL BUZZER;按键滴声
JNB UPKEY,$;
INC DISP2;第2位加1
MOV A,DISP2;
CJNE A,#6,ADJ2;第2位不等于6转移
MOV DISP2,#00H;第2位等于6清零
AJMP ADJ2;再去显示第2位
ADJ6:
LCALL ADJDELAY;
JB SETKEY,ADJ2;
LCALL BUZZER;按键滴声
JNB SETKEY,$;
ADJ1:
SETB P2.5;
CLR P2.4;
MOV A,DISP1;
MOVC A,@A+DPTR;
MOV P0,A;显示第一位
JNB SETKEY,ADJ5;如果SET键有动作转去抖
JB UPKEY,ADJ1;
LCALL ADJDELAY;
JB UPKEY,ADJ1;
LCALL BUZZER;按键滴声
JNB UPKEY,$;
INC DISP1;第1位加1
MOV A,DISP1;
CJNE A,#10,ADJ1;第1位不等于10转移
MOV DISP1,#00H;第1位等于10清零
AJMP ADJ1;再去显示第1位
ADJ5:
LCALL ADJDELAY;
JB SETKEY,ADJ1;
AJMP SET1;
ADJDELAY:;是不是延时40MS?
MOV R7,#200
D3: MOV R6,#100
DJNZ R6,$
DJNZ R7,D3
RET
BUZZER: MOV R6,255;蜂鸣子程序
BUZZ1: CPL BUZZ;
MOV R7,#80;
DJNZ R7,$;
DJNZ R6,BUZZ1;
CLR BUZZ;
RET
;以上为设置时间用
;
REMO:
RETI;
;
;
;
TIME0:; TIME0中断处理程序
MOV TH0,#3CH;
MOV TL0,#0B6H;重新放定时预置数15542,用预置数较正时间。
PUSH ACC;机器周期2
PUSH PSW;机器周期2
INC TIMEADD;软件计数器加1,机器周期1
MOV A,TIMEADD;加1后送给A,机器周期1
CJNE A,#10,T_RET;如果A不等于10跳到T_RET,机器周期2
CPL SECLED;取反秒点LED,软件计数器计时半秒,机器周期1
MOV TIMEADD,#00H;软件计数器清零,机器周期1
INC HALFSEC;秒加1,机器周期1
MOV A,HALFSEC;机器周期1
CJNE A,#120,T_RET;把秒针缓存和120比较,不等跳转T_RET,机器周期2
INC DISP1;第一位显示加1,机器周期1
MOV HALFSEC,#00H;清零秒针,机器周期1
T_RET:
POP PSW
POP ACC
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -