智能时控开关设计.docx
《智能时控开关设计.docx》由会员分享,可在线阅读,更多相关《智能时控开关设计.docx(17页珍藏版)》请在冰点文库上搜索。
智能时控开关设计
;系统晶振是11.0592MHz
Z8279EQU0FF82H;8279状态/命令口地址
D8279EQU0FF80H;8279数据口地址
LEDMODEQU00H;左边输入八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQEQU2FH;扫描速率
LEDCLSEQU0C1H;清除显示RAM
LEDWR0EQU80H;设定的将要写入的显示RAM地址
READKBEQU40H;读FIFORAM地址0的命令字
ORG0000H
AJMPSTART
ORG001BH;INTT1入口地址
AJMPINT_T1
ORG0040H
START:
MOVSP,#60H
LCALLINIT8279;初始化8279
MOVR3,#0H;时
MOVR2,#0H;分
MOVR7,#0H;秒
MOVR0,#0H;10毫秒
MOVR6,#0FFH;标志
MOVTMOD,#10H
MOVTL1,#00H;10毫秒的时间常数
MOVTH1,#0DCH
LCALLDIS_mS
SETBET1
SETBEA;允许中断z
SETB4BH;三个定时端子禁止
SETB4CH
SETB4DH
MOV09H,#23H
MOV0CH,#23H
MOV0FH,#23H
MOVR1,#09H;定时时刻的存储起始地址
WAIT:
LCALLGETKEY;读键盘
CJNEA,#0FFH,CONT;判断是否有键输入
MOVA,B
CJNEA,#3CH,KEY_A;输入键是'C',转CLEAR_T
LCALLCLEAR_T
KEY_A:
CJNEA,#3AH,KEY_D;输入键是'A',转START_T
LCALLSTART_T
KEY_D:
CJNEA,#3DH,KEY_B;输入键是'D',转STOP_T
LCALLSTOP_T
KEY_B:
CJNEA,#3BH,KEY_F;输入键是'B',转SET_T
LCALLSET_T
KEY_F:
CJNEA,#3FH,KEY_E;输入键是'F',转SET_F
LCALLSET_F
KEY_E:
CJNEA,#3EH,CONT;输入键是'E',转MONITOR
AJMPSTOP_LIGHT
CONT:
CJNER6,#0FFH,WAIT;若无秒标志则循环
LCALLDISPLAY;显示时间
MOVR6,#0;清标志
TIMEON:
MOVA,R7;判断定时1是否来到(秒,分,时)
CJNEA,0BH,T2
MOVA,R2
CJNEA,0AH,T2
MOVA,R3
CJNEA,09H,T2
LCALLTIMEONREPLAY1;转定时响应程序1
T2:
MOVA,R7;判断定时2是否来到(秒,分,时)
CJNEA,0EH,T3
MOVA,R2
CJNEA,0DH,T3
MOVA,R3
CJNEA,0CH,T3
LCALLTIMEONREPLAY2;转定时响应程序2
T3:
MOVA,R7;判断定时3是否来到(秒,分,时)
CJNEA,11H,WAIT
MOVA,R2
CJNEA,10H,WAIT
MOVA,R3
CJNEA,0FH,WAIT
LCALLTIMEONREPLAY3;转定时响应程序3
SJMPWAIT;循环
STOP_LIGHT:
SETB4BH
SETB4CH
SETB4DH
MOVR1,#09H
SJMPWAIT;停止灯闪烁
CLEAR_TIMER:
;定时时间清零子程序
MOV0BH,#0H;小时清零
MOV0AH,#0H;分钟清零
MOV09H,#0H;秒清零
MOVR6,#0FFH;置秒标志
LCALLDIS_mS;显示毫秒
RET
CLEAR_T:
;时间清零子程序
CLRTR1;关计数器
MOVR3,#0H;小时清零
MOVR2,#0H;分钟清零
MOVR7,#0H;秒清零
MOVR0,#0H;10毫秒清零
MOVR6,#0FFH;置秒标志
LCALLDIS_mS;显示毫秒
RET
START_T:
;电子钟计时子程序
SETBTR1
RET
STOP_T:
;电子钟停止计时子程序
CLRTR1
RET
SET_F:
CLRTR1;设置定时值子程序
MOVR4,#7
LCALLGETWORD;读小时数
CJNEA,#0FFH,INVALID_TIEMR;判断输入合法性
MOVA,B
ADDA,#232
JCINVALID_TIEMR;判断输入小时值<24
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOV@R1,A;保存输入的值
INCR1
MOVR4,#5
LCALLGETWORD;读分钟数
CJNEA,#0FFH,INVALID_TIEMR;判断输入合法性
MOVA,B
ADDA,#196
JCINVALID_TIEMR;判断输入分钟数<60
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOV@R1,A;保存输入的值
INCR1
MOVR4,#3
LCALLGETWORD;读分钟数
CJNEA,#0FFH,INVALID_TIEMR;判断输入合法性
MOVA,B
ADDA,#196
JCINVALID_TIEMR;判断输入分钟值<60
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOV@R1,A;保存输入的值
INCR1
AJMPBACK
INVALID_TIEMR:
LCALLCLEAR_TIMER;定时时间清零
BACK:
RET
TIMEONREPLAY1:
;转定时响应程序1
CLR4BH
RET
TIMEONREPLAY2:
;转定时响应程序2
CLR4CH
RET
TIMEONREPLAY3:
;转定时响应程序3
CLR4DH
RET
SET_T:
;设置初值子程序
CLRTR1;关计数器
MOVR4,#7
LCALLGETWORD;读小时数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
ADDA,#232
JCINVALID;判断输入小时值<24
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR3,A;保存输入的值
MOVR4,#5
LCALLGETWORD;读分钟数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
ADDA,#196
JCINVALID;判断输入分钟数<60
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR2,A;保存输入的值
MOVR4,#3
LCALLGETWORD;读分钟数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
ADDA,#196
JCINVALID;判断输入分钟值<60
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;保存输入的值
MOVR4,#1
LCALLGETWORD;读10毫秒数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR0,A;保存输入的值
AJMPSET_TOK
INVALID:
LCALLCLEAR_T;时间清零
SET_TOK:
LCALLDIS_mS;显示10毫秒
LCALLDISPLAY;显示时间
RET
GETWORD:
;读数子程序
WKEY1:
LCALLGETKEY;读键盘
CJNEA,#0FFH,WKEY1;无键输入,则再读
MOVA,B
ADDA,#0C6H
JCERROR1;判断输入是否大于9
MOVA,B
SUBBA,#30H
JCERROR1;判断输入是否小于0
MOVR5,A
LCALLDISLED;显示输入的字符
MOVB,#10
MULAB
PUSHACC;保存输入的值
WKEY2:
LCALLGETKEY;读键盘
CJNEA,#0FFH,WKEY2;无键输入则再读
MOVA,B
ADDA,#0C6H;判断输入是否大于9
JCERROR2
MOVA,B
SUBBA,#30H;判断输入是否小于0
JCERROR2
DECR4
MOVR5,A
LCALLDISLED;显示输入的字符
MOVB,A
POPACC
ADDA,B
MOVB,A;把得到的值存在B
MOVA,#0FFH;置合法输入标志
AJMPKEYOK
ERROR2:
POPACC
ERROR1:
MOVA,#0;置非法输入标志
KEYOK:
RET
INIT8279:
;8279初始化子程序
PUSHDPH;保存现场
PUSHDPL
PUSHACC
LCALLDELAY;延时
MOVDPTR,#Z8279
MOVA,#LEDMOD;置8279工作方式
MOVX@DPTR,A
MOVA,#LEDFEQ;置键盘扫描速率
MOVX@DPTR,A
MOVA,#LEDCLS;清除LED显示
MOVX@DPTR,A
POPACC;恢复现场
POPDPL
POPDPH
RET
;读取键盘子程序
;输入:
无;输出:
B:
读到的键码A:
按键的标志
GETKEY:
PUSHDPH;保存现场
PUSHDPL
PUSHPSW
MOVDPTR,#Z8279
MOVXA,@DPTR;读8279状态
ANLA,#07H;屏蔽D7-D3
JNZGETVAL;判断是否有键输入
MOVA,#0H;置标志(无键输入)
SJMPNKBHIT
GETVAL:
MOVA,#READKB;读FIFORAM命令
MOVX@DPTR,A
MOVDPTR,#D8279
MOVXA,@DPTR;读键
ANLA,#3FH;屏蔽SHIFT和CTRL键
MOVDPTR,#KEYCODE;键码表起始地址
MOVCA,@A+DPTR;查表
MOVB,A;置返回键值
MOVA,#0FFH;置标志(有键输入)
NKBHIT:
POPPSW;恢复现场
POPDPL
POPDPH
RET
;显示字符子程序
;输入:
R4,位置R5,值
DISLED:
PUSHDPH;保存现场
PUSHDPL
PUSHACC
MOVA,#LEDWR0;置显示起始地址
ADDA,R4;加位置偏移量
MOVDPTR,#Z8279
MOVX@DPTR,A;设定显示位置
MOVDPTR,#LEDSEG;置显示常数表起始位置
MOVA,R5
MOVCA,@A+DPTR;查表
MOVDPTR,#D8279
MOVX@DPTR,A;显示数据
POPACC;恢复现场
POPDPL
POPDPH
RET
DELAY:
;延时子程序
PUSH0;保存现场
PUSH1
MOV0,#0H
DELAY1:
MOV1,#0H
DJNZ1,$
DJNZ0,DELAY1
POP1;恢复现场
POP0
RET
DIS_mS:
MOVA,R0
ANLA,#0FH
MOVR5,A
MOVR4,#0
LCALLDISLED;显示10毫秒低位
MOVA,R0
SWAPA;高低半字节交换
ANLA,#0FH
MOVR5,A
MOVR4,#1
LCALLDISLED;显示10毫秒高位
RET
INT_T1:
;INT_T1中断服务子程序
PUSHDPH;保护现场
PUSHDPL
PUSHACC
PUSHPSW
CLRTR1
MOVTL1,#00H;10毫秒定时常数
MOVTH1,#0DCH
SETBTR1
MOVA,R0
ADDA,#1;10毫秒数加1
DAA
MOVR0,A
LCALLDIS_mS;显示10毫秒
CJNER0,#0,EXIT;判断10毫秒=0
MOVR6,#0FFH;置秒标志
CJNER7,#59H,SECOND;判断秒=59
MOVR7,#99H
CJNER2,#59H,MINUTE;判断分=59
MOVR2,#99H
CJNER3,#23H,HOUR;判断时=23
MOVR3,#99H
HOUR:
MOVA,R3
ADDA,#1;时加1
DAA
MOVR3,A
MINUTE:
MOVA,R2
ADDA,#1;分加1
DAA
MOVR2,A
SECOND:
MOVA,R7
ADDA,#1;秒加1
DAA
MOVR7,A
EXIT:
POPPSW;恢复现场
POPACC
POPDPL
POPDPH
RETI;中断返回
DISPLAY:
MOVA,R3
ANLA,#0FH
ADDA,#10H
MOVR5,A
MOVR4,#6
LCALLDISLED;显示小时低位
MOVA,R3
SWAPA
ANLA,#0FH
MOVR5,A
MOVR4,#7
LCALLDISLED;显示小时高位
MOVA,R2
ANLA,#0FH
ADDA,#10H
MOVR5,A
MOVR4,#4
LCALLDISLED;显示分钟低位
MOVA,R2
SWAPA
ANLA,#0FH
MOVR5,A
MOVR4,#5
LCALLDISLED;显示分钟高位
MOVA,R7
ANLA,#0FH
ADDA,#10H
MOVR5,A
MOVR4,#2
LCALLDISLED;显示秒低位
MOVA,R7
SWAPA
ANLA,#0FH
MOVR5,A
MOVR4,#3
LCALLDISLED;显示秒高位
JNB4BH,LIGHT1
JLIGHT2:
JNB4CH,LIGHT2
JLIGHT3:
JNB4DH,LIGHT3
BACK1:
RET
LIGHT1:
CPLP1.1
AJMPJLIGHT2
LIGHT2:
CPLP1.2
AJMPJLIGHT3
LIGHT3:
CPLP1.3
AJMPBACK1
;LED显示常数表
LEDSEG:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H;'0,1,2,3,4,5,6,7'
DB7FH,6FH,77H,7CH,39H,5EH,79H,71H;'8,9,A,B,C,D,E,F'
DB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H;'0.,1.,2.,3.,4.,5.,6.,7.'
DB0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H;'8.,9.,A.,B.,C.,D.,E.,F.'
DB6DH,02H,08H,00H,59H,0FH,76H;'U,-,_,,I,O,P,'
;键盘键码表
KEYCODE:
DB30H,31H,32H,33H,34H,35H,36H,37H;'1,2,Q,W,A,S,+,Z'
DB38H,39H,3AH,3BH,3CH,3DH,3EH,3FH;'3,4,E,R,D,F,X,C'
END
F