|
发表于 2015-11-7 18:03:34
|
显示全部楼层
本帖最后由 hyz_avr 于 2015-11-7 18:10 编辑
有,给你个十年前刚自学单片机时写的1602LCD电子钟程序。
- ORG 0000H;
- LJMP START;
- ORG 000BH;时间定时
- AJMP TIME;
- ORG 001BH;调时闪烁定时
- LJMP SETTIME;
- ORG 0030H;
- START:
- RS EQU P0.4 ;RS EQU P3.7
- RW EQU P0.5 ;RW EQU P3.6
- E EQU P0.6 ;E EQU P3.5
- MOV p2,#01H;;清除屏幕
- ACALL ENABLE
- MOV p2,#38H;8位点阵方式
- ACALL ENABLE
- MOV p2,#0CH;开显示
- ACALL ENABLE
- MOV p2,#06H;移动光标
- ACALL ENABLE
- MOV 2AH,#7FH;赋初值
- MOV 2CH,#00H;
- MOV 20H,#00H;
- MOV 21H,#00;
- MOV 22H,#00;
- MOV 23H,#00;
- MOV 24H,#20;
- MOV 25H,#01;
- MOV 26H,#06;
- MOV 43H,#08;
- MOV 46H,#00;
- MOV R5,#06H;
- SETB EA;
- SETB ET0;
- MOV TMOD,#11H;
- MOV TL0,#0B0H;
- MOV TH0,#3CH;
- MOV TL1,#0B0H;
- MOV TH1,#3CH;
- SETB TR0;
- MOV SP,#50H;
- MOV R2,#02H;
- MOV R1,#0C6H;
- MOV DPTR,#TABLE;
- YCL:MOV p2,R1;显示时间\日期的间隔符号
- LCALL ENABLE;
- MOV A,#3AH;
- LCALL WRITE2;
- MOV R1,#0C9H;
- DJNZ R2,YCL;
- MOV R2,#02H;
- MOV R1,#87H;
- YCL2:MOV p2,R1;
- LCALL ENABLE;
- MOV A,#2dH;
- LCALL WRITE2;
- MOV R1,#8AH;
- DJNZ R2,YCL2;
- MOV R2,#02H;
- MOV R1,#83H;
- MOV A,#'2';显示年的前两位
- YCL3:MOV p2,R1;
- LCALL ENABLE;
- LCALL WRITE2;
- MOV A,#'0';
- MOV R1,#84H;
- DJNZ R2,YCL3;
- LOOP:LCALL DISP;
- LCALL KEY;
-
- JZ LOOP;
- LCALL ANKEY;
-
- AJMP LOOP;
- TIME:
- PUSH ACC;
- PUSH PSW;
- MOV TL0,#0DCH;定时器初始值50ms(50000us)(可以自己更改)
- MOV TH0,#37H;
- INC 20H;
- MOV A,20H;
- CJNE A,#18,RETI1;
- MOV 20H,#00H;
- MOV A,21H;秒计数
- INC A;
- MOV 21H,A;
- SETB 2AH.2;
- CJNE A,#60,RETI1;
- MOV 21H,#00H;
-
- MOV A,22H;分计数
- INC A;
- MOV 22H,A;
- SETB 2AH.1;
- CJNE A,#60,RETI1;
- MOV 22H,#00H;
-
- MOV A,23H;时计数
- INC A;
- MOV 23H,A;
- SETB 2AH.0;
- CJNE A,#24,RETI1;
- MOV 23H,#00H;
- MOV A,24H;日计数
- INC A;
- MOV 24H,A;
- SETB 2AH.3;
- CJNE A,40H,RETI1;
- MOV 24H,#01;
- MOV A,25H;月计数
- INC A;
- MOV 25H,A;
- SETB 2AH.4;
- CJNE A,#13,RETI1;
- MOV 25H,#01;
- MOV A,26H;年计数
- INC A;
- MOV 26H,A;
- SETB 2AH.5;
- CJNE A,#99,RETI1;
- MOV 26H,#00;
-
- RETI1:
- MOV 2CH,#00H;
- POP PSW;
- POP ACC;
- RETI;
- NOP
- NOP
- NOP
- ;闪动调时程序
- SETTIME:PUSH ACC;
- PUSH PSW;
-
- MOV TL1,#0B0H;定时器1赋初值
- MOV TH1,#3CH;
- DJNZ R5,OUTSET;0.3秒未到,退出
- MOV R5,#06H;
- MOV A,2CH; ------------------放入相应的闪动熄灭符
- JB 2BH.0,SETN;
- JB 2BH.1,SETY;
- JB 2BH.2,SETR;
- JB 2BH.3,SETS;
- JB 2BH.4,SETF;
- JB 2BH.5,SETM;
- AJMP SETOUT;
- OUTSET:LJMP SETOUT;
- SETN:
- ANL A,#01H;
- MOV 2CH,A;
- CPL 2CH.0;
- SETB 2AH.5;
- MOV 36H,#20H;
- MOV 37H,#20H;
- AJMP SETOUT;
- SETY:
- ANL A,#02H;
- MOV 2CH,A;
- CPL 2CH.1;
- SETB 2AH.5
- SETB 2AH.4;
- MOV 38H,#20H;
- MOV 39H,#20H;
- AJMP SETOUT;
- SETR:
- ANL A,#04H;
- MOV 2CH,A;
- CPL 2CH.2;
- SETB 2AH.4;
- SETB 2AH.3;
- MOV 4AH,#20H;
- MOV 4BH,#20H;
- AJMP SETOUT;
- SETS:
- ANL A,#08H;
- MOV 2CH,A;
- CPL 2CH.3;
- SETB 2AH.3;
- SETB 2AH.0;
- MOV 30H,#20H;
- MOV 31H,#20H;
- AJMP SETOUT;
- SETF:
- ANL A,#16;
- MOV 2CH,A;
- CPL 2CH.4;
- SETB 2AH.0;
- SETB 2AH.1;
- MOV 32H,#20H;
- MOV 33H,#20H;
- AJMP SETOUT;
- SETM:
- ANL A,#32;
- MOV 2CH,A;
- CPL 2CH.5;
- SETB 2AH.1;
- SETB 2AH.2;
- MOV 34H,#20H;
- MOV 35H,#20H;
-
- SETOUT:LCALL DISP;
-
- POP PSW;
- POP ACC;
-
- RETI;
- NOP
- NOP
- NOP
- ;按键检测与处理
- KEY:MOV 46H,#00H;
- MOV A,P3;
- CPL A;
- ANL A,#3FH;
- JZ KEYOUT1;
- LCALL D20MS;
- MOV A,P3;
- CPL A;
- ANL A,#3FH;
- MOV 46H,A;
- KEEY22:
- MOV A,P3;
- CPL A;
- ANL A,#3FH;
- JNZ KEEY22;
- KEYOUT1:MOV A,46H;
- RET;
- KEY2:MOV 46H,#00H;按键检测
- MOV A,P3;
- CPL A;
- ANL A,#3FH;
- JZ KEY2;
- LCALL D20MS;消抖
-
- MOV A,P3;
- CPL A;
- ANL A,#3FH;
- JZ KEY2;
- MOV 46H,A;
- KEEY2: ;-------等待按键释放
- MOV A,P3;
- CPL A;
- ANL A,#3FH;
- JNZ KEEY2;
- ANKEY:; -------------------按键处理
- MOV A,46H;
- JB ACC.3,L2;-----------是加1键跳转到L2
- JB ACC.1,L3;-----------减1键跳转到L3
- JB ACC.4,GL_L;
- AJMP KEY2;
- GL_L:LJMP GL;----------------功能键处理
- L2:JB 2BH.0,NJ1;-------------加1键处理
- JB 2BH.1,YJ1;
- JB 2BH.2,RJ1;
- JB 2BH.3,SJ1;
- JB 2BH.4,FJ1;
- JB 2BH.5,MJ1;
- AJMP KEY2;
- L3:JB 2BH.0,NJJ1;------------减1键处理
- JB 2BH.1,YJJ1;
- JB 2BH.2,RJJ10;
- JB 2BH.3,SJJ10;
- JB 2BH.4,FJJ10;
- JB 2BH.5,MJJ10;
- AJMP KEY2;
- RJJ10:LJMP RJJ1;
- SJJ10:LJMP SJJ1;
- FJJ10:LJMP FJJ1;
- MJJ10:LJMP MJJ1;
- NJ1:MOV A,26H;---------------年加1
- INC A;
- CJNE A,#100,NOUT;
- MOV A,#00H;
- NOUT:
- MOV 26H,A;
- SETB 2AH.5;
- AJMP KEY2;
-
- YJ1:MOV A,25H;-------------- 月加1
- INC A;
- CJNE A,#13,YOUT;
- MOV A,#01H;
- YOUT:
- MOV 25H,A;
- SETB 2AH.4;
- AJMP KEY2;
- RJ1:MOV A,24H;----------------日加1
- INC A;
- CJNE A,40H,ROUT;
- MOV A,#01H;
- ROUT:
- MOV 24H,A;
- SETB 2AH.3;
- AJMP KEY2;
- SJ1:MOV A,23H;---------------时加1
- INC A;
- CJNE A,#24,SOUT;
- MOV A,#00H;
- SOUT:
- MOV 23H,A;
- SETB 2AH.0;
- AJMP KEY2;
- FJ1:MOV A,22H;---------------分加1
- INC A;
- CJNE A,#60,FOUT;
- MOV A,#00H;
- FOUT:
- MOV 22H,A;
- SETB 2AH.1;
- AJMP KEY2;
- MJ1:MOV A,21H;--------------秒加1
- INC A;
- CJNE A,#60,MOUT;
- MOV A,#00H;
- MOUT:
- MOV 21H,A;
- SETB 2AH.2;
- AJMP KEY2;
- NOP
- NOP
- ;-----------------------------------------------------减1键处理----------------
- NJJ1:MOV A,26H;
- DEC A;
- CJNE A,#0FFH,NJJ;
- MOV A,#99;
- NJJ:
- MOV 26H,A;
- SETB 2AH.5;
- AJMP KEY2;
- YJJ1:MOV A,25H;
- DEC A;
- CJNE A,#00H,YJJ;
- MOV A,#12;
- YJJ:
- MOV 25H,A;
- SETB 2AH.4;
- AJMP KEY2;
- RJJ1:MOV A,24H;
- DEC A;
- CJNE A,#00H,RJJ;
- MOV 48H,40H;
- DEC 48H;
- MOV A,48H;
- RJJ:
- MOV 24H,A;
- SETB 2AH.3;
- AJMP KEY2;
- SJJ1:MOV A,23H;
- DEC A;
- CJNE A,#0FFH,SJJ;
- MOV A,#23;
- SJJ:
- MOV 23H,A;
- SETB 2AH.0;
- AJMP KEY2;
- FJJ1:MOV A,22H;
- DEC A;
- CJNE A,#0FFH,FJJ;
- MOV A,#59;
- FJJ:
- MOV 22H,A;
- SETB 2AH.1;
- AJMP KEY2;
- MJJ1:MOV A,21H;
- DEC A;
- CJNE A,#0FFH,MJJ;
- MOV A,#59;
- MJJ:
- MOV 21H,A;
- SETB 2AH.2;
- AJMP KEY2;
- ;-----------------功能键处理----------------------
- GL:CLR ET0;
- CLR TR0;
-
- SETB ET1;
- SETB TR1;
-
- JB 2BH.0,YTZ;
- JB 2BH.1,RTZ;
- JB 2BH.2,STZ;
- JB 2BH.3,FTZ;
- JB 2BH.4,MTZ;
- JB 2BH.5,KEYOUT;
- NTZ:MOV 2BH,#01H;
- AJMP KEY2;
- YTZ:MOV 2BH,#02H;
- AJMP KEY2;
- RTZ:MOV 2BH,#04H;
- AJMP KEY2;
- STZ:MOV 2BH,#08H;
- AJMP KEY2;
- FTZ:MOV 2BH,#16;
- AJMP KEY2;
- MTZ:MOV 2BH,#32;
- AJMP KEY2;
-
-
- KEYOUT:;------------------按键退出
- CLR ET1;
- CLR TR1;
- MOV 2AH,#7FH;
- MOV 2BH,#00H;
- MOV 2CH,#00H;
- SETB ET0;
- SETB TR0;
- RET;
- NOP
- NOP
- DISP:MOV DPTR,#TABLE;
-
- JNB 2AH.5,Y_CL;年更新缓存?
- MOV A,26H;
- MOV B,#04;计算是否闰年
- DIV AB;
- MOV A,B;
- JZ NCL;
- MOV 41H,#29;不是闰年2月有28天
- AJMP NYX;
- NCL:MOV 41H,#30;闰年2月有29天
- NYX:MOV A,26H;
- MOV B,#10;
- DIV AB;
- JB 2CH.0,NSD; 年显示是否熄灭
- MOV 36H,A;
- MOV 37H,B;
- NSD:
- CLR 2AH.5;
- MOV R4,#02;
-
- MOV R0,#86H;
- MOV A,37H;
- NCL1:MOV p2,R0;
- ACALL ENABLE;
- MOVC A,@A+DPTR;
- LCALL WRITE2;
- MOV A,36H;
- DEC R0;
- DJNZ R4,NCL1;
- Y_CL:JNB 2AH.4,RCL;月更新缓存?
-
- MOV A,25H;
- CJNE A,#02,Y_CL_1;不是二月,跳转Y_CL2
- MOV 40H,41H;把2月份天数送到40H,
- AJMP SYY;
-
- Y_CL_1: MOV A,25H;8月以上双月31天,8月以下单月31天
- CLR C;
- SUBB A,43H;
- JC DXCL;
- SETB 2AH.7;
- AJMP Y_CL2;
- DXCL: CLR 2AH.7;8月以上2AH.7=0..
- Y_CL2:
- JB 2AH.7,SY2; 计算是大月还是小月(31天还是30天)
- MOV A,25H;
- MOV B,#02;
- DIV AB;
- MOV A,B;
- JZ XY30;双月跳转
- AJMP DY31;
- SY2:
- MOV A,25H;
- MOV B,#02;
- DIV AB;
- MOV A,B;
- JZ DY31;双月跳转
- AJMP XY30;
- DY31:MOV 40H,#32;有31天
- AJMP SYY;
-
- XY30:MOV 40H,#31;30天
-
-
- SYY:JB 2CH.1,YSD;
- MOV A,25H;
- MOV B,#10;
- DIV AB;
-
- MOV 38H,A;
- MOV 39H,B;
- YSD: CLR 2AH.4;
- MOV R4,#02;
- MOV R0,#89H;
- MOV A,39H;
- Y_CL1:MOV p2,R0;
- ACALL ENABLE;
- MOVC A,@A+DPTR;
- LCALL WRITE2;
- MOV A,38H;
- DEC R0;
- DJNZ R4,Y_CL1;
- RCL:JNB 2AH.3,SCL;日更新缓存?
- JB 2CH.2,RSD;
- MOV A,24H;
- MOV B,#10;
- DIV AB;
- MOV 4AH,A;
- MOV 4BH,B;
- RSD:CLR 2AH.3;
- MOV R4,#02;
- MOV R0,#8CH;
- MOV A,4BH;
- RCL1:MOV p2,R0;
- ACALL ENABLE;
- MOVC A,@A+DPTR;
- LCALL WRITE2;
- MOV A,4AH;
- DEC R0;
- DJNZ R4,RCL1;
- SCL:JNB 2AH.0,FCL;时更新缓存?
- JB 2CH.3,SSD;
- MOV A,23H;
- MOV B,#10;
- DIV AB;
- MOV 31H,B;
- MOV 30H,A;
- SSD:CLR 2AH.0;
- MOV R4,#02H;
- MOV R0,#0C5H;显示位置
- MOV A,31H;
-
- SCL1:MOV p2,R0;
- ACALL ENABLE
- MOVC A,@A+DPTR;
- LCALL WRITE2;
- MOV A,30H;
- DEC R0;
- DJNZ R4,SCL1;
- FCL:JNB 2AH.1,MCL;分更新缓存?
- JB 2CH.4,FSD;
- MOV A,22H;
- MOV B,#10;
- DIV AB;
- MOV 33H,B;
- MOV 32H,A;
- FSD:CLR 2AH.1;
- MOV A,33H;
- MOV R0,#0C8H;显示位置
- MOV R4,#02H;
- FCL1:MOV p2,R0;
- ACALL ENABLE
- MOVC A,@A+DPTR;
- LCALL WRITE2;
- MOV A,32H;
- DEC R0;
- DJNZ R4,FCL1;
-
- MCL:
- JNB 2AH.2,NEXTX;秒更新缓存?
- JB 2CH.5,MSD;
- MOV A,21H;
- MOV B,#10;
- DIV AB;
- MOV 35H,B;
- MOV 34H,A;
- MSD:CLR 2AH.2;
- MOV R0,#0CBH;显示位置
- MOV R4,#02H;
- MOV A,35H;
- MCL1:MOV p2,R0;
- ACALL ENABLE
-
- MOVC A,@A+DPTR;
- LCALL WRITE2;
- MOV A,34H;
- DEC R0;
- DJNZ R4,MCL1;
- NEXTX: RET
- NOP
- NOP
- WRITE2:
- mov p2,a
- setb rs
- clr rw
- clr e
- call delay
- setb e
- ret
- ;写指令子程序
- ENABLE:
- CLR RS
- CLR RW
- CLR E
- ACALL DELAY
- SETB E
- RET
- delay:
- mov r7,#25
- d1: mov r6,#255
- d2: djnz r6,$
- djnz r7,d1
- ret
- D20MS: MOV R7,#25;
- D11: MOV R6,#30;
- DJNZ R6,$;
- DJNZ R7,D11;
- RET;
- TABLE: DB '0123456789'
- END
- ; 2006.5.18/2006.6.27修改~
复制代码
最后上照片
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|