|
- ;时控开关项目起始时间2015、8、29
- ORG 0000H
- ;***1602端口定义开始
- RS EQU P1.0
- RW EQU P1.1
- E EQU P1.2
- HOUR10 EQU 30H;小时十位
- HOUR1 EQU 31H ;小时个位
- MINTE10 EQU 32H ;分钟十位 缓冲区
- MINTE1 EQU 33H ;分钟个位
- SCNEDS10 EQU 34H ;秒十位
- SCNEDS1 EQU 35H ;秒个位
- ;*****按键设置
- SCNEDS EQU 36H ;秒
- MINTE EQU 37H ;分
- HOUR EQU 38H ;时
- SETMY1 EQU 39H ;选择秒寄存器
- SETTM1 EQU 40H ;选择秒设定时间
- SETMY2 EQU 41H ;选择分寄存器 缓冲区
- SETTM2 EQU 42H ;选择分设定时间
- SETMY3 EQU 43H ;选择时寄存器
- SETTM3 EQU 44H ;选择时设定时间
- ;按键设置用*********
- ;*****************闹钟设置用
- STARTHOUR10 EQU 45H
- STARTHOUR1 EQU 46H
- STARTMINTE10 EQU 47H ;闹钟开始时间
- STARTMINTE1 EQU 48H
- ;;*****************8 区间有效缓冲区
- STOPHOUR10 EQU 49H
- STOPHOUR1 EQU 50H ; 闹钟停止时间
- STOPMINTE10 EQU 51H
- STOPMINTE1 EQU 52H
- ;*****************闹钟设置用
- STARTMINTE EQU 53H
- STOPMINTE EQU 54H
- STARTHOUR EQU 55H
- STOPHOUR EQU 56H
-
-
-
- ;***1602端口定义结束
- ;1302*****端口定义开始
- MOV DPTR,#TAB
- CE EQU P3.5
- IO EQU P3.3
- SCLK EQU P3.4
- AJMP MAIN
- ;1302*******端口定义结束
-
- ORG 0030H
- MAIN:;主函数
- lcall SETTIME ;设置时钟
- LCALL SETCLOCK
- START:LCALL DATE1302 ; 读1302实时数据
- AJMP MAIN
- ;**************************************************************************************
- ;S设置液晶 *
- ; *
- ;**************************************************************************************
- INIT:; 液晶初始化开始 /
- ;********* /
- LCALL DELAY15MS
- LCALL WRINSTRUCT;写指令
-
- MOV P0,#38H ;设置61*2显示,5*7点阵,8位数据口
- LCALL PULSE;高脉冲
- ;*****
- LCALL DELAY5MS
- MOV P0,#38H ;设置61*2显示,5*7点阵,8位数据口
- LCALL PULSE;高脉冲
- LCALL DELAY5MS
- MOV P0,#38H ;设置61*2显示,5*7点阵,8位数据口
- LCALL PULSE;高脉冲
- ;**************
- MOV P0,#06H ;设置1602为读写一个字符后地址指针加一,且光标加一
- LCALL PULSE;高脉冲
- ;*****
- LCALL DELAY5MS
- ;**************
- MOV P0,#0FH;设置1602位为开显示显示光标且闪烁
- LCALL PULSE;高脉冲
- ;*****
- LCALL DELAY5MS
- ;**************
- MOV P0,#01H ;清屏
- LCALL PULSE;高脉冲
- ;**************
- LCALL DELAY5MS
- ;**************
- RET ; 液晶初始化结束
- ;**********************************************************************************
- DATE1302:; 读1302实时数据开始
- LCALL REST
- lcall write1302 ;设置时钟写入1302芯片
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop ;哈哈哈原来如此!这里果然得加延时,不加的话1302反应不过来啊,哈哈哈
- nop ;至今天我终于把DS1302`搞定了,这也是努力得来的啊,我虽然笨,但别人做到了,我通过努力也一定办得到。
- ;至今天板子上的器件都搞定了2010年8月1日,这个值得纪念的 日子,
- nop ;
- nop
- nop
- nop
- nop
- KK: MOV A,#81H
- LCALL READ1302
- MOV 55H,A
- ANL A,#0FH ; 秒处理
- MOV SCNEDS1,A
- MOV A,55H
- SWAP A
- ANL A,#0FH
- MOV SCNEDS10,A
- MOV A,#83H
- LCALL READ1302
- MOV 55H,A
- ANL A,#0FH ;分钟处理
- MOV MINTE1,A
- MOV A,55H
- SWAP A
- ANL A,#0FH
- MOV MINTE10,A
- MOV A,#85H
- LCALL READ1302
- MOV 55H,A
- ANL A,#0FH
- MOV HOUR1,A ;小时处理
- MOV A,55H
- SWAP A
- ANL A,#03H
- MOV HOUR10,A
- LCALL DELAY900MS
- LCALL CLOCKS ;定时器查询
- LCALL DISPLAY1602;液晶显示
- AJMP KK
-
-
-
- RET ; 读1302实时数据结束
- ;***********************************************************************************
- DISPLAY1602:;1602液晶显示开始
- LCALL INIT ;液晶初始化
- ;第一行显示TIME**:**:
- LCALL WRINSTRUCT;写指令
- MOV P0,#82H;从02号地址开始显示
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- LCALL WDATE;写数据
- MOV P0,#54H;显示T;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#49H;显示I; TIME
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#4DH;显示M;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#45H;显示E;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,HOUR10
- MOVC A,@A+DPTR;显示小时十位;
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,HOUR1;显示小时个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
-
- MOV P0,#3AH;显示:;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,MINTE10;显示分钟十位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,MINTE1;显示分钟个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
-
- MOV P0,#3AH;显示:;
- LCALL PULSE;高脉冲
-
- LCALL DELAY1MS
- MOV A,SCNEDS10;显示秒十位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,SCNEDS1;显示秒个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- ;******************************************************第二行显示,以上是第一行显示
- LCALL DELAY20MS
- LCALL WRINSTRUCT;写指令
- MOV P0,#0C0H;从第二行00号40H显示地址开始显示
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- LCALL WDATE;写数据
- MOV P0,#53H;显示S;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#54H;显示T; STR
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#52H;显示R;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STARTHOUR10
- MOVC A,@A+DPTR;显示定时开始小时十位;
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STARTHOUR1;显示定时开始小时个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
-
- MOV P0,#3AH;显示:;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STARTMINTE10;显示定时开始分钟十位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STARTMINTE1;显示定时开始分钟个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- ;××××××××××××××××××××××以上是开始闹钟设置时间显示××××××××××××××××××××××××××××
- LCALL DELAY1MS
- LCALL WDATE;写数据
- MOV P0,#53H;显示S;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#54H;显示T; STP
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV P0,#50H;显示P;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STOPHOUR10
- MOVC A,@A+DPTR;显示定时结束小时十位;
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STOPHOUR1;显示定时结束小时个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
-
- MOV P0,#3AH;显示:;
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STOPMINTE10;显示定时结束分钟十位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
- LCALL DELAY1MS
- MOV A,STOPMINTE1;显示定时结束分钟个位;
- MOVC A,@A+DPTR
- MOV P0,A
- LCALL PULSE;高脉冲
-
-
-
-
-
-
-
-
- RET;1602液晶显示结束
- ;************************************************************************************
- SETTIME: ;按键设置时间开始
- MOV P2,#0FH
- LCALL DISPLAY1602
- pp:JB P2.0,$
- LCALL DELAY20MS
- JB P2.0,PP
- ;**************
- CLR P1.7
- LCALL DELAY20MS ;蜂鸣器
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- MOV SETMY1,#80H;秒指令
- LCALL DISPLAY1602
- JB P2.1,$
- LCALL DELAY20MS
- L3:JB P2.1,YY1
- LCALL DELAY20MS
- JB P2.1,L3
- MOV B,#10
- MOV A,SCNEDS
- DIV AB
- CJNE A,#05,LINE1
- MOV A,B
- CJNE A,#09,LINE1
- MOV SETTM1,#00H
- MOV SCNEDS,#00H
- AJMP O1
- LINE1:CLR C;#########################||||特别注意这里啊C一定要清零,负责DA转换是不对的|||||||=+++++++++++++++vvvvvvvvvvvvvvbbbbbbbbbb
- MOV A,SETTM1 ;设置加秒时间
- INC A
- DA A
- MOV SETTM1,A
-
- ;*************************
- INC SCNEDS;用来同步显示
- O1:MOV A,SCNEDS
- MOV B,#10
- DIV AB
- MOV SCNEDS10,A
- MOV SCNEDS1,B ; 秒处理
-
- LCALL DISPLAY1602
- ;********************
- YY1: JB P2.0,L3
- ;************************************已上是秒设置
- LCALL DISPLAY1602
- pp2:JB P2.0,$
- LCALL DELAY20MS
- JB P2.0,PP2
- ;**************
- CLR P1.7
- LCALL DELAY20MS
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- MOV SETMY2,#82H;分指令
- LCALL DISPLAY1602
- JB P2.1,$
- L32:JB P2.1,YY2
- LCALL DELAY20MS
- JB P2.1,L32
- MOV B,#10
- MOV A,MINTE
- DIV AB
- CJNE A,#05,LINE2
- MOV A,B
- CJNE A,#09,LINE2
- MOV SETTM2,#00H
- MOV MINTE,#00H
- AJMP O2
- LINE2:
- CLR C ;######################################||||特别注意这里啊C一定要清零,负责DA转换是不对的|||||||=+++++++++++++++vvvvvvvvvvvvvvbbbbbbbbbb
- MOV A,SETTM2 ;设置加分时间
- INC A
- DA A
- MOV SETTM2,A
- ;*************************
- INC MINTE;用来同步显示
- O2:MOV A,MINTE
- MOV B,#10
- DIV AB
- MOV MINTE10,A
- MOV MINTE1,B
- LCALL DISPLAY1602
- ;********************
- YY2: JB P2.0,L32
- ;**************************已上是分设置
- LCALL DISPLAY1602
- pp3:JB P2.0,$
- LCALL DELAY20MS
- JB P2.0,PP3
- ;**************
- CLR P1.7
- LCALL DELAY20MS
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- MOV SETMY3,#84H ;小时指令
- LCALL DISPLAY1602
- JB P2.1,$
- LCALL DELAY20MS
- L33:JB P2.1,YY3
- LCALL DELAY20MS;去抖动
- JB P2.1,L33
- MOV B,#10
- MOV A,HOUR
- DIV AB
- CJNE A,#02,LINE3
- MOV A,B
- CJNE A,#03,LINE3
- MOV SETTM3,#00H
- MOV HOUR,#00H
- AJMP O3
- LINE3:CLR C;################################# ||||特别注意这里啊C一定要清零,负责DA转换是不对的妈个比我费了老大的时|||||||=+++++++++++++++vvvvvvvvvvvvvvbbbbbbbbbb
- MOV A,SETTM3
- INC A
- DA A
- MOV SETTM3,A ;设置加时时间
- ;*************************
- INC HOUR;用来同步显示
- O3:MOV A,HOUR
- MOV B,#10
- DIV AB
- MOV HOUR10,A
- MOV HOUR1,B
- LCALL DISPLAY1602
- ;********************
- YY3: JB P2.0,L33
- ;******************************已上是时设置
- RET ;按键设置时间结束
- ;*************************************************************************************
- ;************************************************************************************
- SETCLOCK: ;按键设置闹钟开始
- UR1:JB P2.0,$
- LCALL DELAY20MS ;进入定时器开始时间设制 ××设置完时间按下2.0则进入设置定时器模式,按2.1加2.2减设置想要退出则按2.0键
- JB P2.0,UR1
- ;**************
- CLR P1.7
- LCALL DELAY20MS
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- LCALL DISPLAY1602
- JB P2.1,$;很重要啊,关键啊,如果没有则直接向下了,正是他
- LCALL DELAY20MS
- UR2:JB P2.1,YF
- LCALL DELAY20MS;去抖动
- JB P2.1,UR2
- ;********************
-
- MOV B,#10
- MOV A,STARTMINTE
- DIV AB
- CJNE A,#05,LINE21
- MOV A,B
- CJNE A,#09,LINE21
- MOV STARTMINTE,#00H
- AJMP O21
- LINE21:INC STARTMINTE ;闹钟开始时间设置加分
- O21:MOV A,STARTMINTE
- MOV B,#10
- DIV AB
- MOV STARTMINTE10,A
- MOV STARTMINTE1,B
-
- LCALL DISPLAY1602
- ;********************
-
- YF: JB P2.0,UR2
- ;**************
- CLR P1.7
- LCALL DELAY20MS
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- JB P2.1,$;很重要啊,关键啊,如果没有则直接向下了,正是他
- LCALL DELAY20MS
- UR22:JB P2.1,YF2
- LCALL DELAY20MS;去抖动
- JB P2.1,UR22
- MOV B,#10
- MOV A,STARTHOUR
- DIV AB
- CJNE A,#02,LINE22
- MOV A,B
- CJNE A,#03,LINE22
- MOV STARTHOUR,#00H
- SJMP O22
- LINE22:INC STARTHOUR ;闹钟开始时间置加时
- O22:MOV A,STARTHOUR
- MOV B,#10
- DIV AB
- MOV STARTHOUR10,A
- MOV STARTHOUR1,B
- LCALL DISPLAY1602
- ;********************
- YF2: JB P2.0,UR22
- ;***************
- ;******************************************************************************
- ;**************
- CLR P1.7
- LCALL DELAY20MS
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- JB P2.1,$;很重要啊,关键啊,如果没有则直接向下了,正是他
- LCALL DELAY20MS
- UR23:JB P2.1,YF3
- LCALL DELAY20MS;去抖动
- JB P2.1,UR23
- MOV B,#10
- MOV A,STOPMINTE
- DIV AB
- CJNE A,#05,LINE23
- MOV A,B
- CJNE A,#09,LINE23
- MOV STOPMINTE,#00H
- SJMP O23
- LINE23:INC STOPMINTE ;闹钟结束时间设置加分
- O23:MOV A,STOPMINTE
- MOV B,#10
- DIV AB
- MOV STOPMINTE10,A
- MOV STOPMINTE1,B
- LCALL DISPLAY1602
- ;********************
- YF3: JB P2.0,UR23
- ;***************
- ;**************
- CLR P1.7
- LCALL DELAY20MS
- LCALL DELAY20MS
- SETB P1.7
- ;*****************
- JB P2.1,$;很重要啊,关键啊,如果没有则直接向下了,正是他
- LCALL DELAY20MS
- UR24:JB P2.1,YF4
- LCALL DELAY20MS;去抖动
- JB P2.1,UR24
- MOV B,#10
- MOV A,STOPHOUR
- DIV AB
- CJNE A,#02,LINE24
- MOV A,B
- CJNE A,#03,LINE24
- MOV STOPHOUR,#00H
- SJMP O24
- LINE24:INC STOPHOUR ;闹钟结束时间设置加时
- O24:MOV A,STOPHOUR
- MOV B,#10
- DIV AB
- MOV STOPHOUR10,A
- MOV STOPHOUR1,B
- LCALL DISPLAY1602
- ;********************
- YF4: JB P2.0,UR24
- ;***************
- RET
-
- CLOCKS: ;定时器查询
- MOV A,HOUR10
- CJNE A,STARTHOUR10,ED
- MOV A,HOUR1
- CJNE A,STARTHOUR1,ED
- MOV A,MINTE10 ;闹钟开始时间
- CJNE A,STARTMINTE10,ED
- MOV A,MINTE1
- CJNE A,STARTMINTE1,ED
- clr P1.7
- ED:
- MOV A,HOUR10
- CJNE A,STOPHOUR10,EN
- MOV A,HOUR1
- CJNE A,STOPHOUR1,EN
- MOV A,MINTE10 ;闹钟停止时间
- CJNE A,STOPMINTE10,EN
- MOV A,MINTE1
- CJNE A,STOPMINTE1,EN
- setb P1.7
- EN:RET ;按键设置闹钟结束
- ;*************************************************************************************
- DELAY5MS:MOV R6,#0FH
- DL1:
- MOV R5,#98H
- DJNZ R5,$ ;延时5ms
- DJNZ R6,DL1
- RET
- DELAY20MS: MOV R7,#01H
- DL111:
- MOV R6,#0DEH
- DL011:
- MOV R5,#28H
- DJNZ R5,$
- DJNZ R6,DL011
- DJNZ R7,DL111
- RET
- WRINSTRUCT :
- CLR RS
- CLR RW ;写指令允许
- CLR E
- RET
- WDATE:
- SETB RS
- CLR RW ;写数据允许 1602使用区
- CLR E
- RET
- PULSE:;高脉冲
- SETB E
- NOP
- NOP
- NOP
- CLR E
- RET
- DELAY1MS:
- MOV R6,#66H
- DL10:
- MOV R5,#03H
- DJNZ R5,$ ;延时1ms
- DJNZ R6,DL10
- RET
- DELAY15MS:
-
- MOV R6,#33H ;延时15ms
- DL20:
- MOV R5,#86H
- DJNZ R5,$
- DJNZ R6,DL20
- RET
- DELAY900MS:
- MOV R7,#7FH
- DL1E:
- MOV R6,#80H
- DL0E:
- MOV R5,#18H
- DJNZ R5,$
- DJNZ R6,DL0E
- DJNZ R7,DL1E
- RET
- ;********以下是1302时钟程序开始***********************以下是1302时钟程序开始 ***********************************
- deley:mov r0,#001h
- loop:mov r1,#0ffh
- lo:nop
- nop
- nop ;延时子程序
- NOP
- NOP
- NOP
- djnz r1,lo
- djnz r0,loop
- ret
- ;**********1302
- READ1302:;注意这里啊,这里的读贝内置到肚里面,原因再与如果分开在时序上是不成立的,
- CLR SCLK
- SETB CE
- SETB IO
- NOP
- NOP
- CLR C
- NOP
- NOP
- MOV R1,#08
- Ro:
- CLR SCLK
- RRC A
- MOV IO,C
- NOP
- SETB SCLK
- NOP
- NOP
- DJNZ R1,Ro
-
- mov r1,#08
- RUD:
- setb sclk
- NOP
- NOP
- CLR SCLK
- NOP
- NOP
- MOV C,IO
- NOP
- RRC A
- DJNZ R1,RUD
- CLR SCLK
- CLR CE
- RET
- ;************1302
- write1302:LCALL DELAY5MS
- mov a,SETMY1;选择秒寄存器
- LCALL WRITE1
- mov a,SETTM1;选择秒时间
- LCALL WRITE2
- LCALL DELAY10US
- mov a,SETMY2;分寄存器
- LCALL WRITE1
- mov a,SETTM2;设分时间
- LCALL WRITE2
- LCALL DELAY10US
- mov a,SETMY3;时寄存器
- LCALL WRITE1
- mov a,SETTM3 ;设为20,am,24小时制
- LCALL WRITE2
- RET
- WRITE1:clr sclk
- SETB CE
-
- MOV R1,#08
- WUR: RRC A
- MOV IO,C
- NOP
- NOP
-
- SETB SCLK
- NOP
- NOP
- CLR SCLK
- DJNZ R1,WUR
- RET
-
- WRITE2: MOV R1,#08
- WURt: RRC A
- MOV IO,C
- NOP
- NOP
- NOP
- SETB SCLK
- NOP
- NOP
- CLR SCLK
- DJNZ R1,WURt
- CLR SCLK
- NOP
- NOP
- NOP
- CLR CE
- RET
- ;********1302
-
- REST:CLR SCLK
- CLR CE
- clr io
- clr c
- NOP
- NOP
- NOP
- NOP
- NOP
- RET
- ;********1302
- DELAY10US:
- NOP
- NOP
- NOP
- NOP ;延时10us
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- RET
- ;1302程序结束*********************************************************
- TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
- END;2015年8月30日于天津,完成主体9月1日完成初步修饰
复制代码
|
|