1、STATE DATA 23HALARM BIT STATE.0 ;闹钟是否启用标志1-启用,0-禁止LEAP BIT STATE.1 ;是否闰年标志1-闰年,0-平年KEY_S DATA 24H ;当前扫描键值KEY_V DATA 25H ;上次扫描键值DIS_BUF_U0 DATA 26H ;LCD上排显示缓冲区DIS_BUF_U1 DATA 27HDIS_BUF_U2 DATA 28HDIS_BUF_U3 DATA 29HDIS_BUF_U4 DATA 2AHDIS_BUF_U5 DATA 2BHDIS_BUF_U6 DATA 2CHDIS_BUF_U7 DATA 2DHDIS_BUF_U
2、8 DATA 2EHDIS_BUF_U9 DATA 2FHDIS_BUF_U10 DATA 30HDIS_BUF_U11 DATA 31HDIS_BUF_U12 DATA 32HDIS_BUF_U13 DATA 33HDIS_BUF_U14 DATA 34HDIS_BUF_U15 DATA 35HDIS_BUF_L0 DATA 36H ;LCD下排显示缓冲区DIS_BUF_L1 DATA 37HDIS_BUF_L2 DATA 38HDIS_BUF_L3 DATA 39HDIS_BUF_L4 DATA 3AHDIS_BUF_L5 DATA 3BHDIS_BUF_L6 DATA 3CHDIS_BU
3、F_L7 DATA 3DHDIS_BUF_L8 DATA 3EHDIS_BUF_L9 DATA 3FHDIS_BUF_L10 DATA 40HDIS_BUF_L11 DATA 41HDIS_BUF_L12 DATA 42HDIS_BUF_L13 DATA 43HDIS_BUF_L14 DATA 44HDIS_BUF_L15 DATA 45HFLAG DATA 46H ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒 ;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。DIS_H DATA 47HDIS_M DATA 48HDIS_S DATA 49HDIS_S0
4、DATA 4AHDIS_S1 DATA 4BHDIS_S2 DATA 4CHDIS_S3 DATA 4DHDIS_S4 DATA 4EHDIS_S5 DATA 4FH*初始化* ORG 0000H LJMP START ORG 000BH LJMP TIMER0 ORG 001BH LJMP TIMER1 ORG 0100HSTART: MOV SP,#60H MOV R0,#18H MOV A,#00HMEM_INI: MOV R0,A INC R0 CJNE R0,#5FH,MEM_INI LCALL DELAY_5ms ;初始化LCD MOV R0,#38H ;设置LCD为16X2显示,
5、5X7点阵,八位数据接口 LCALL LCD_WCMD LCALL DELAY_5ms MOV R0,#0CH ;设置LCD开显示及光标形式(光标不闪烁,不显示-) MOV R0,#06H ;LCD显示光标移动设置(光标地址指针加1,整屏显示不移动) MOV R0,#01H ;清除LCD的显示内容第一自定义字符: MOV R0,#40H LCALL lcd_wcmd ;01 000 000第1行地址 (D7D6为地址设定命令形式 D5D4D3为字符存放位置(0-7),D2D1D0为字符行地址(0-7) MOV R0,#1FH LCALL lcd_wdat ;XXX 11111第1行数据(D7D
6、6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) MOV R0,#41H01 000 001第2行地址 MOV R0,#11HXXX 10001第2行数据 MOV R0,#42H01 000 010第3行地址 MOV R0,#15HXXX 10101第3行数据 MOV R0,#43H01 000 011第4行地址第4行数据 MOV R0,#44H01 000 100第5行地址第5行数据 MOV R0,#45H01 000 101第6行地址 MOV R0,#0AHXXX 01010第6行数据 MOV R0,#46H01 000 110第7行地址
7、第7行数据 MOV R0,#47H01 000 111第8行地址 MOV R0,#00HXXX 00000第8行数据第二个自定义字符: MOV R0,#48H01 001 000第1行地址 MOV R0,#01HXXX 00001第1行数据 MOV R0,#49H01 001 001 MOV R0,#1BHXXX 11011 MOV R0,#4AH01 001 010 MOV R0,#1DHXXX 11101 MOV R0,#4BH01 001 011 MOV R0,#19HXXX 11001 MOV R0,#4CH01 001 100 MOV R0,#4DH01 001 101 MOV R0
8、,#4EH01 001 110 MOV R0,#4FH01 001 111 MOV YEAR,#5 ;置年初值 MOV MONTH,#1 ;置月初值 MOV DATE,#1 ;置日初值 MOV DIS_S0,#35H ;8 MOV DIS_S1,#31H ;9 MOV DIS_S2,#43H ;s MOV DIS_S3,#35H ;5 MOV DIS_S4,#31H ;1 MOV DIS_S5,#20H ; MOV R1,#00H ;显示一自定义字符 LCALL WEEK_PRO LCALL UPDATE_BUF LCALL DISPLAY_PRO ;屏显初始化*主程序*MAIN: MOV I
9、E,#8AH ;CPU开中断,Timer0,Timer1开中断 MOV TMOD,#11H ;Timer0,Timer1工作于模式1, 16位定时方式 MOV TH0,#0DCH ;Timer0置10ms定时初值 MOV TL0,#00H MOV TH1,#0FFH ;Timer1置闹钟声音初值 MOV TL1,#00H SETB ALARM ;初始启动闹钟功能 CLR TR1 ;Timer1禁止 SETB TR0 ;Timer0启动 MOV KEY_V,#03HMAIN_1: LCALL KEY_SCAN MOV A,KEY_S XRL A,KEY_V JZ MAIN_1 MOV KEY_V
10、,KEY_S MOV A,KEY_V XRL A,#01H JNZ MAIN_2 CLR TR0 ;进入调整状态,禁止Timer0 MOV IE,#00H ;CPU禁止中断 LCALL KEY_PRE_PRO ;PRE按键按下,调用PRE按键处理程序 SJMP MAIN_1MAIN_2: XRL A,#02H JNZ MAIN_1 LCALL KEY_ADJ_PRO ;ADJ按键按下,调用PRE按键处理程序*按键扫描程序*KEY_SCAN: CLR A MOV P1,#0FFH MOV C,PRE MOV ACC.1,C MOV C,ADJ MOV ACC.0,C MOV KEY_S,A ;本
11、次扫描键值存入KEY_S RET*PRE按键处理程序*KEY_PRE_PRO: INC FLAG MOV R4,FLAG CJNE R4,#1,KEY_PRE_1 ;注意,该指令不改变操作 MOV R0,#0EH LCALL LCD_WCMD ;显示光标_,整个光标不闪烁 MOV DIS_S0,#61H ;a MOV DIS_S1,#6cH ;l MOV DIS_S2,#61H ; MOV DIS_S3,#72H ;r MOV DIS_S4,#6dH ;m MOV DIS_S5,#3aH ;: MOV R1,#50H ; MOV DIS_H,HOUR_ARM MOV DIS_M,MIN_ARM
12、 MOV DIS_S,SEC_ARM更新屏显内容 LCALL LCD_POS ;使光标位于第一个调整项下 JMP KEY_PRE_EKEY_PRE_1: CJNE R4,#2,KEY_PRE_2光标置小时报警设置位置KEY_PRE_2: CJNE R4,#3,KEY_PRE_3光标置分钟报警设置位置KEY_PRE_3: CJNE R4,#4,KEY_PRE_4光标置秒时报警设置位置KEY_PRE_4: CJNE R4,#5,KEY_PRE_5 MOV DIS_S0,#74H ;t MOV DIS_S1,#69H ;i MOV DIS_S2,#6dH ; MOV DIS_S3,#65H ;e M
13、OV DIS_S4,#3aH ; MOV DIS_H,HOUR MOV DIS_M,MIN MOV DIS_S,SEC MOV R0,#05H光标置年调整位置KEY_PRE_5: CJNE R4,#6, KEY_PRE_6 MOV R0,#08H光标置月调整位置KEY_PRE_6: CJNE R4,#7,KEY_PRE_7 MOV R0,#0bH光标置日调整位置KEY_PRE_7: CJNE R4,#8,KEY_PRE_8光标置时调整位置KEY_PRE_8: CJNE R4,#9,KEY_PRE_9 MOV R0,#4cH光标置分调整位置KEY_PRE_9: CJNE R4,#10,KEY_P
14、RE_10 MOV R0,#4fH光标置秒调整位置KEY_PRE_10: MOV FLAG,#0 ;FLAG到11,就清零 MOV R0,#0CH设置LCD开显示及光标不闪烁,不显示CPU开中断,TIMER0,TIMER1开中断启动TIMER0KEY_PRE_E:*ADJ按键处理程序*KEY_ADJ_PRO: MOV R5,FLAG CJNE R5,#0,KEY_ADJ_0 ;FLAG=0,如果有闹钟声音,就停止闹钟声音 MOV C,TR1 JNC KEY_ADJ_A CLR TR1KEY_ADJ_A: JMP KEY_ADJ_EKEY_ADJ_0: CJNE R5,#1,KEY_ADJ_1
15、;FLAG=1,调整是否启用闹钟 CPL ALARM LCALL DISPLAY_PRO LCALL LCD_POSKEY_ADJ_1: CJNE R5,#2,KEY_ADJ_2 ;FLAG=2,调整闹钟时 INC HOUR_ARM MOV A,HOUR_ARM CJNE A,#24,KEY_ADJ_1_1 MOV HOUR_ARM,#0KEY_ADJ_1_1:KEY_ADJ_2: CJNE R5,#3,KEY_ADJ_3 ;FLAG=3,调整闹钟分 INC MIN_ARM MOV A,MIN_ARM CJNE A,#60,KEY_ADJ_2_1 MOV MIN_ARM,#0KEY_ADJ_2
16、_1:KEY_ADJ_3: CJNE R5,#4,KEY_ADJ_4 ;FLAG=4,调整闹钟秒 INC SEC_ARM MOV A,SEC_ARM CJNE A,#60,KEY_ADJ_3_1 MOV SEC_ARM,#0KEY_ADJ_3_1:KEY_ADJ_4: CJNE R5,#5,KEY_ADJ_5 ;FLAG=5,调整年 INC YEAR MOV A,YEAR CJNE A,#100,KEY_ADJ_4_1 MOV YEAR,#0KEY_ADJ_4_1:KEY_ADJ_5: CJNE R5,#6,KEY_ADJ_6 ;FLAG=6,调整月 INC MONTH MOV A,MONTH
17、 CJNE A,#13,KEY_ADJ_5_1 MOV MONTH,#1KEY_ADJ_5_1:KEY_ADJ_6: CJNE R5,#7,KEY_ADJ_7 ;FLAG=7,调整日 INC DATE XRL A,#2 JNZ KEY_ADJ_6_2 ;不是二月跳转 MOV A,DATE ; MOV C,LEAP ;判断是否闰年 JC KEY_ADJ_6_1 XRL A,#29 ;平年二月日期28天 JNZ KEY_ADJ_6_5 JMP KEY_ADJ_6_4KEY_ADJ_6_1: XRL A,#30 ;闰年二月日期29天 JMP KEY_ADJ_6_4 ;跳转到月处理KEY_ADJ_6_
18、2: XRL A,#4 JZ KEY_ADJ_6_3 XRL A,#6 XRL A,#9 XRL A,#11 MOV A,DATE XRL A,#32 ;大月日期31天KEY_ADJ_6_3: XRL A,#31 ;小月日期30天KEY_ADJ_6_4: MOV DATE,#1KEY_ADJ_6_5: MOV R0,#0BHKEY_ADJ_7: CJNE R5,#8,KEY_ADJ_8 ;FLAG=8,调整时 INC HOUR MOV A,HOUR CJNE A,#24,KEY_ADJ_7_1 MOV HOUR,#0KEY_ADJ_7_1:KEY_ADJ_8: CJNE R5,#9,KEY_ADJ_9 ;FLAG=9,调整分 INC MIN MOV A,MIN CJNE A,#60,KEY_ADJ_8_1 MOV MIN,#0KEY_ADJ_8_1:KEY_ADJ_9: CJNE R5,#10,KEY_ADJ_E ;FLAG=10,调整秒 INC SEC MOV A,SEC CJNE A,#60,KEY_ADJ_9_1 MOV SEC,#0KEY_ADJ_9_1:KEY_ADJ_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1