1、电铃程序;*教学打铃控制器程序*;CPU: AT89S52, Fosc=12MHz;+变量定义 + SET_TIME BIT P1.0 ;时间设定 SET_ALARM BIT P1.1 ;打铃设定 LEFT BIT P1.2 ;左移位 UP BIT P1.3 ;上翻/加1 DOWN BIT P1.4 ;下翻/减1 RIGHT BIT P1.5 ;右移位 ESC BIT P1.6 ;取消/退出 ENTER BIT P1.7 ;确认 KEY_BUF EQU 30H ;原按键状态 KEY_ST EQU 31H ;键闭合标志,ON:0FFH,OFF:00H SCL BIT P3.3 ;IIC时钟线 S
2、DA BIT P3.2 ;IIC数据线 FLASH_S BIT P3.1 ;秒闪 CONTREL BIT P3.4 ;控制;1=ON H_MEM EQU 10H ;时 M_MEM EQU 11H ;分 S_MEM EQU 12H ;秒 CT_50MS EQU 13H ;50mS计数器 NEW_TIME EQU 14H ;时间更新标志,0FFH更新 DIS_MEM1 EQU 15H ;显示数据存储器1 DIS_MEM2 EQU 16H ;显示数据存储器2 DIS_MEM3 EQU 17H ;显示数据存储器3 DIS_BUF1 EQU 20H ;显示缓冲器1(段码,左) DIS_BUF2 EQU
3、21H ;显示缓冲器2(段码) DIS_BUF3 EQU 22H ;显示缓冲器3(段码) DIS_BUF4 EQU 23H ;显示缓冲器4(段码) DIS_BUF5 EQU 24H ;显示缓冲器5(段码) DIS_BUF6 EQU 25H ;显示缓冲器6(段码,右) AL_NUMBER EQU 26H ;打铃序号 AL_TOTA EQU 27H ;打铃点总数 ALARM_ST EQU 28H ;打铃状态,0FFH正在打铃 TIME_OVER EQU 29H ;按键返回时间计数器 TOTA_ADDR EQU 60H ;打铃点总数在24C02中的存储地址 ORG 0000H AJMP START
4、ORG 0002BH AJMP INT_T0 ;T2中断向量 ORG 0030HSTART: MOV SP,#60H CLR CONTREL CLR FLASH_S MOV H_MEM,#12 MOV M_MEM,#0 MOV S_MEM,#0 MOV CT_50MS,#20 MOV NEW_TIME,#0 MOV KEY_ST,#0 MOV R4,#TOTA_ADDR ;从24C02读打铃时间点总数 MOV R0,#AL_TOTA MOV R3,#1 ACALL RD_EEROM MOV A,AL_TOTA ;总数大于0,小于、等于40判断 JZ JMP_RD CLR C SUBB A,#4
5、0 JC RD_AL_LIST MOV AL_TOTA,#0 MOV R4,#TOTA_ADDR MOV R3,#1 MOV R0,#AL_TOTA ACALL WR_EEROM SJMP JMP_RDRD_AL_LIST: MOV A,AL_TOTA ;从24C02读打铃时间表 RL A MOV R3,A ;R0:RAM地址指针,R2:8位移位计数器 ;R3:数据字节计数器 ;R4:24C02 存储地址 MOV R0,#80H MOV R4,#00H ACALL RD_EEROMJMP_RD: MOV TH2,#3CH ;T2工作方式、时间常数 MOV TL2 , #0ABH MOV RCA
6、P2H, #3CH MOV RCAP2L, #0ABH MOV T2CON , #04H SETB ET2 ;开中断 SETB EAWAITE: ACALL DISPLAY ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#00H,KEY_MAIN MOV A,NEW_TIME CJNE A,#0FFH,WAITE MOV NEW_TIME,#0NEW_DIS: MOV A,H_MEM ACALL HBCD MOV DIS_MEM1,A MOV A,M_MEM ACALL HBCD MOV DIS_MEM2,A MOV A,S_MEM ACALL HBCD MOV DI
7、S_MEM3,A ACALL DIS_TIME MOV A,ALARM_ST JNZ CHEK_OFF MOV A,S_MEM JNZ WAITE ACALL CHEK_AL ;打铃检测CHEK_OFF: MOV A,S_MEM CLR C SUBB A,#20 JC WAITE CLR CONTREL MOV ALARM_ST,#0 SJMP WAITE ;SJMP $;*打铃控制子程序*CHEK_AL:MOV A,AL_TOTA JZ CHEK_END MOV R0,#80H MOV R6,AL_TOTACHK_LOOP: MOV A,R0 CJNE A,H_MEM,NEXT_AL_1 I
8、NC R0 MOV A,R0 CJNE A,M_MEM,NEXT_AL_2 SETB CONTREL MOV ALARM_ST,#0FFH SJMP CHEK_ENDNEXT_AL_1:INC R0NEXT_AL_2:INC R0 DJNZ R6,CHK_LOOP CLR CONTREL MOV ALARM_ST,#0CHEK_END:RET;*键盘处理程序段*KEY_MAIN: MOV KEY_ST,#0 JNB SET_TIME,TIME_SET JNB SET_ALARM,JMP_SET_A SJMP NEW_DISJMP_SET_A:AJMP ALARM_SET;=时间设置=TIME_
9、SET: MOV TIME_OVER,#30 MOV R5,H_MEM MOV R6,M_MEM MOV R7,S_MEMSET_H: JNB FLASH_S,GATE_H MOV DIS_MEM1,#0AAH SJMP CLS_HGATE_H: MOV A,R5 ACALL HBCD MOV DIS_MEM1,A MOV A,R6 ACALL HBCD MOV DIS_MEM2,A MOV A,R7 ACALL HBCD MOV DIS_MEM3,ACLS_H: ACALL DIS_TIME ACALL DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_1 MO
10、V NEW_TIME,#0 DJNZ TIME_OVER,JMP_1 AJMP WAITEJMP_1: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,SET_H MOV KEY_ST,#0 MOV TIME_OVER,#30 JNB UP,H_UP JNB DOWN,H_DOWN JNB LEFT,JMP_SET_S JNB RIGHT,SET_M JNB ESC,JMP_ESC JNB ENTER,JMP_OK SJMP SET_HJMP_ESC:AJMP TIME_SET_ESCJMP_OK: AJMP TIME_SET_OKJMP_SET_S: AJ
11、MP SET_SH_UP: CJNE R5,#23,INC_H MOV R5,#0FFHINC_H: INC R5 AJMP GATE_HH_DOWN: CJNE R5,#0,DEC_H MOV R5,#24DEC_H: DEC R5 AJMP GATE_H;=分钟设置=SET_M: JNB FLASH_S,GATE_M MOV DIS_MEM2,#0AAH SJMP CLS_MGATE_M: MOV A,R6 ACALL HBCD MOV DIS_MEM2,A MOV A,R5 ACALL HBCD MOV DIS_MEM1,A MOV A,R7 ACALL HBCD MOV DIS_MEM
12、3,ACLS_M: ACALL DIS_TIME ACALL DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_2 MOV NEW_TIME,#0 DJNZ TIME_OVER,JMP_2 AJMP WAITEJMP_2: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,SET_M MOV KEY_ST,#0 MOV TIME_OVER,#30 JNB UP,M_UP JNB DOWN,M_DOWN JNB LEFT,JMP_SET_H JNB RIGHT,SET_S JNB ESC,TIME_SET_ESC JNB ENTER
13、,TIME_SET_OK SJMP SET_MM_UP: CJNE R6,#59,INC_M MOV R6,#0FFHINC_M: INC R6 AJMP GATE_MM_DOWN: CJNE R6,#0,DEC_M MOV R6,#60DEC_M: DEC R6 AJMP GATE_MJMP_SET_H: AJMP SET_H;=秒设置=SET_S: JNB FLASH_S,GATE_S MOV DIS_MEM3,#0AAH SJMP CLS_SGATE_S: MOV A,R7 ACALL HBCD MOV DIS_MEM3,A MOV A,R5 ACALL HBCD MOV DIS_MEM
14、1,A MOV A,R6 ACALL HBCD MOV DIS_MEM2,ACLS_S: ACALL DIS_TIME ACALL DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_3 MOV NEW_TIME,#0 DJNZ TIME_OVER,JMP_3 AJMP WAITEJMP_3: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,SET_S MOV KEY_ST,#0 MOV TIME_OVER,#30 JNB UP,S_UP JNB DOWN,S_DOWN JNB LEFT,JMP_SET_S_M JNB RIGHT
15、,JMP_S_H JNB ESC,TIME_SET_ESC JNB ENTER,TIME_SET_OK SJMP SET_SJMP_S_H:AJMP SET_HS_UP: CJNE R7,#59,INC_S MOV R7,#0FFHINC_S: INC R7 AJMP GATE_SS_DOWN: CJNE R7,#0,DEC_S MOV R7,#60DEC_S: DEC R7 AJMP GATE_SJMP_SET_S_M: AJMP SET_M;=TIME_SET_ESC: AJMP NEW_DIS ;时间设置取消/返回TIME_SET_OK: MOV S_MEM,R7 ;时间设置确认/返回
16、MOV M_MEM,R6 MOV H_MEM,R5 AJMP NEW_DIS;=打铃设置程序段=ALARM_SET: MOV TIME_OVER,#20 MOV AL_NUMBER,AL_TOTAAL_LIST:MOV A,AL_NUMBER JNZ NUMBER_N MOV DIS_MEM1,#0 MOV DIS_MEM2,#0AAH MOV DIS_MEM3,#0AAH ACALL DIS_TIME AJMP WAITE_ANUMBER_N: DEC A RL A ADD A,#80H MOV R0,A MOV A,AL_NUMBER ACALL HBCD MOV DIS_MEM1,A M
17、OV A,R0 ACALL HBCD MOV DIS_MEM2,A INC R0 MOV A,R0 ACALL HBCD MOV DIS_MEM3,A ACALL DIS_TIMEWAITE_A:ACALL DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_4 MOV NEW_TIME,#0 DJNZ TIME_OVER,JMP_4 AJMP WAITEJMP_4: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,WAITE_A MOV KEY_ST,#0 MOV TIME_OVER,#20 JNB UP,NUM_UP JNB
18、DOWN,NUM_DOWN JNB ESC,JMP_ESC_AL JNB ENTER,JMP_OK_AL JNB SET_ALARM,JMP_DEL_AL JNB SET_TIME,CHANGE_AL SJMP WAITE_AJMP_DEL_AL: AJMP DEL_AL;-NUM_UP: MOV A,AL_NUMBER CJNE A,AL_TOTA,INC_NUM MOV AL_NUMBER,#0FFHINC_NUM:INC AL_NUMBER AJMP AL_LIST;-NUM_DOWN:MOV A,AL_NUMBER CJNE A,#0,DEC_NUM MOV AL_NUMBER,AL_
19、TOTA SJMP J_DECNUMDEC_NUM:DEC AL_NUMBERJ_DECNUM:AJMP AL_LIST;=修改打铃时间点=CHANGE_AL: MOV A,AL_NUMBER JZ JMP_ADD_AL DEC A RL A ADD A,#80H MOV R0,A MOV A,R0 MOV R6,A INC R0 MOV A,R0 MOV R7,A;-时修改-SET_AL_H: JNB FLASH_S,GATE_AL_H MOV DIS_MEM2,#0AAH SJMP CLS_AL_HGATE_AL_H: MOV A,AL_NUMBER ACALL HBCD MOV DIS_
20、MEM1,A MOV A,R6 ACALL HBCD MOV DIS_MEM2,ACLS_AL_H: MOV A,R7 ACALL HBCD MOV DIS_MEM3,A ACALL DIS_TIME ACALL DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_5 MOV NEW_TIME,#0 DJNZ TIME_OVER,JMP_5 AJMP WAITEJMP_5: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,SET_AL_H MOV KEY_ST,#0 MOV TIME_OVER,#20 JNB UP,AL_H_UP
21、 JNB DOWN,AL_H_DOWN JNB LEFT,SET_AL_M JNB RIGHT,SET_AL_M JNB ESC,JMP_AL_LIST JNB ENTER,JMP_SET_AL_OK SJMP SET_AL_HJMP_ESC_AL: AJMP ESC_ALJMP_OK_AL: AJMP OK_ALJMP_ADD_AL: AJMP ADD_ALJMP_SET_AL_OK: AJMP SET_AL_OKJMP_AL_LIST: AJMP AL_LISTAL_H_UP:CJNE R6,#23,INC_H_AL MOV R6,#0FFHINC_H_AL:INC R6 AJMP GAT
22、E_AL_HAL_H_DOWN: CJNE R6,#0,DEC_H_AL MOV R6,#24DEC_H_AL:DEC R6 AJMP GATE_AL_H;-分修改-SET_AL_M: JNB FLASH_S,GATE_AL_M MOV DIS_MEM3,#0AAH SJMP CLS_AL_MGATE_AL_M: MOV A,AL_NUMBER ACALL HBCD MOV DIS_MEM1,A MOV A,R7 ACALL HBCD MOV DIS_MEM3,ACLS_AL_M: MOV A,R6 ACALL HBCD MOV DIS_MEM2,A ACALL DIS_TIME ACALL
23、DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_6 MOV NEW_TIME,#0 DJNZ TIME_OVER,JMP_6 AJMP WAITEJMP_6: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,SET_AL_M MOV KEY_ST,#0 MOV TIME_OVER,#20 JNB UP,AL_M_UP JNB DOWN,AL_M_DOWN JNB LEFT,JMP_SET_AL_H JNB RIGHT,JMP_SET_AL_H JNB ESC,JMP_AL_LIST JNB ENTER,SET_AL_OK SJ
24、MP SET_AL_MJMP_SET_AL_H: AJMP SET_AL_HAL_M_UP:CJNE R7,#59,INC_M_AL MOV R7,#0FFHINC_M_AL:INC R7 AJMP GATE_AL_MAL_M_DOWN: CJNE R7,#0,DEC_M_AL MOV R7,#60DEC_M_AL:DEC R7 AJMP GATE_AL_M;=打铃点设置确认/返回到列表状态=SET_AL_OK:NOP MOV A,AL_NUMBER DEC A RL A ADD A,#80H MOV R0,A MOV A,R6 MOV R0,A INC R0 MOV A,R7 MOV R0,
25、A MOV R0,#80H MOV R2,AL_TOTA ACALL UP_LIST ;调升序排序程序 AJMP ALARM_SET;=增加打铃时间点=ADD_AL: INC AL_TOTA MOV AL_NUMBER,AL_TOTA MOV R6,#08 MOV R7,#0 MOV A,AL_NUMBER DEC A RL A ADD A,#80H MOV R0,A MOV A,R6 MOV R0,A INC R0 MOV A,R7 MOV R0,A AJMP SET_AL_H;=打铃设置取消/返回=ESC_AL: MOV R4,#TOTA_ADDR MOV R0,#AL_TOTA MOV
26、R3,#1 ACALL RD_EEROM MOV A,AL_TOTA JZ EXIT_SET_AL RL A MOV R3,A MOV R0,#80H MOV R4,#00H ACALL RD_EEROMEXIT_SET_AL: AJMP NEW_DIS;=打铃设置确认/返回=OK_AL: MOV R0,#AL_TOTA MOV R3,#1 MOV R4,#TOTA_ADDR ACALL WR_EEROM MOV A,AL_TOTA JZ JMP_NEW_DIS MOV A,AL_TOTA RL A MOV R0,#80H MOV R3,A MOV R4,#0 ACALL WR_EEROMJM
27、P_NEW_DIS: AJMP NEW_DISJMP_AL_SET: AJMP ALARM_SET;=删除打铃时间点=DEL_AL: MOV A,AL_TOTA JZ JMP_AL_SET JNB FLASH_S,GATE_DIS MOV DIS_MEM1,#0AAH MOV DIS_MEM2,#0AAH MOV DIS_MEM3,#0AAH SJMP CLS_DISGATE_DIS: MOV A,AL_NUMBER ACALL HBCD MOV DIS_MEM1,A MOV A,AL_NUMBER DEC A RL A ADD A,#80H MOV R0,A MOV A,R0 ACALL H
28、BCD MOV DIS_MEM2,A INC R0 MOV A,R0 ACALL HBCD MOV DIS_MEM3,ACLS_DIS:ACALL DIS_TIME ACALL DISPLAY MOV A,NEW_TIME CJNE A,#0FFH,JMP_7 MOV NEW_TIME,#0 DJNZ TIME_OVER,JMP_7 AJMP WAITEJMP_7: ACALL KEY_CHECK MOV A,KEY_ST CJNE A,#0FFH,DEL_AL MOV KEY_ST,#0 MOV TIME_OVER,#20 JNB ENTER,DEL_LIST JNB ESC,JMP_AL_SET_D AJMP
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1