使用ZLG7289,51单片机驱动的带有按键功能的时钟小程序

按键功能说明:

KEY0:闪烁显示小时,并修改小时

KEY1:闪烁显示分钟,并修改分钟

KEY2:闪烁显示秒钟,并修改秒钟

KEY12:确认修改,修改结束

KEY13:上调时间

KEY15:下调时间

  1     ;*******ZLG7289 PARAMETERS*******
  2     ZLG_BIT_CNT    EQU    30H    ;The number of data sended    ;循环次数
  3     ZLG_REC_BUF    EQU    31H    ;The buffer of data received    ;做接收缓冲,传过来什么先放在该变量中
  4     ZLG_SEND_BUF    EQU    32H    ;The buffer of data sended    ;做发送缓冲,
  5     ZLG_DECIMAL    EQU    33H    ;The digit of decimal        ;要显示的十进制的数字
  6 
  7     ZLG_CS        EQU    P0.0    ;/CS  of ZLG7289            ;四根引脚线:/CS,CLK,DATA,/KEY
  8     ZLG_CLK        EQU    P0.1    ;CLK  of ZLG7289
  9     ZLG_DATA    EQU    P0.2    ;DIO  of ZLG7289
 10     ZLG_KEY        EQU    P0.3    ;/KEY of ZLG7289            ;key:告诉cpu有按键
 11                                     ;定义的几个变量四根线将ZLG和cpu连起来
 12     SECOND        EQU    34H    ;second
 13     MIN        EQU    35H    ;min
 14     HOUR        EQU    36H    ;hour
 15     VAR_TIMER    EQU    37H    ;Soft timer
 16     ;*******DELAY PARAMETERS*******
 17     VAR_DELAY        EQU    71H    ;The variable for delay function
 18 ;******************************************************
 19     org    0000H
 20     ljmp    MAIN
 21     org    000BH
 22     jmp    interrupt_T0
 23     org    000BH
 24     jmp    intreeupt_T_REFRESH
 25 ;******************************************************
 26 
 27     org    0030H
 28 MAIN:
 29     setb    ZLG_CS                ;先关闭
 30     setb    ZLG_KEY                ;先关闭
 31     setb    ZLG_DATA            ;先关闭
 32     call    delay_50            ;给时间上电各自启动,让ZLG正常上电
 33 
 34     mov    ZLG_SEND_BUF,#10100100B        ;Initialize ZLG7289,初始化zlg放到变量里
 35     call    zlg_send            ;调用一个发送函数
 36     setb    ZLG_CS                ;Set standby mode
 37     /*Initilize the var*/
 38     mov    SECOND,#50        
 39     mov    MIN,#59
 40     mov    HOUR,#03
 41     mov    VAR_TIMER,#00H
 42 
 43     /*Initialize T0*/
 44     mov    TMOD,#01H
 45     mov    TH0,#0B1H    ;20ms,load number
 46     mov    TL0,#0E0H
 47     setb    TR0        ;Start T0
 48     setb    ET0        ;Enable T0 inerrupt
 49     setb    EA        ;Enable interrupt
 50     ;mov    IE,#82H        ;#10000010B
 51 
 52     /*Initialize intreeupt_T_REFRESH*/
 53     mov    TMOD,#01H
 54     mov    TH0,#0B1H    ;20ms,load number
 55     mov    TL0,#0E0H
 56     setb    TR0        ;Start T0
 57     setb    ET0        ;Enable T0 inerrupt
 58     setb    EA        ;Enable interrupt
 59     ;mov    IE,#82H        ;#10000010B
 60 
 61     ;*******display num : hour, minutes,second***************
 62     ;***************second*******************
 63 
 64     mov    b,#10                ;b:低位
 65     mov    a,SECOND            ;
 66     div    ab
 67     mov    ZLG_DECIMAL,a
 68     mov    ZLG_SEND_BUF,#10000000B        ;显示位1
 69     lcall    zlg_send
 70     mov    ZLG_SEND_BUF,b
 71     
 72     lcall    zlg_send
 73     setb    ZLG_CS
 74     
 75     mov    ZLG_SEND_BUF,#10000001B        ;显示位2
 76     lcall    zlg_send
 77     mov    ZLG_SEND_BUF,ZLG_DECIMAL
 78     lcall    zlg_send
 79     setb    ZLG_CS
 80     ;**************"-"*************************
 81     mov    ZLG_SEND_BUF,#10000010B        ;显示位3
 82     lcall    zlg_send
 83     mov    ZLG_SEND_BUF,#00001010B    
 84     lcall    zlg_send
 85     setb    ZLG_CS
 86     ;**************MIN*************************
 87     
 88     mov    b,#10                ;b:min低位
 89     mov    a,MIN            ;
 90     div    ab
 91     mov    ZLG_DECIMAL,a
 92     mov    ZLG_SEND_BUF,#10000011B        ;显示位4
 93     lcall    zlg_send
 94     mov    ZLG_SEND_BUF,b
 95     
 96     lcall    zlg_send
 97     setb    ZLG_CS
 98     
 99     mov    ZLG_SEND_BUF,#10000100B        ;显示位5
100     lcall    zlg_send
101     mov    ZLG_SEND_BUF,ZLG_DECIMAL
102     lcall    zlg_send
103     setb    ZLG_CS
104     ;**************"-"*************************
105     mov    ZLG_SEND_BUF,#10000101B        ;显示位6
106     lcall    zlg_send
107     mov    ZLG_SEND_BUF,#00001010B
108     lcall    zlg_send
109     setb    ZLG_CS
110 
111     ;**************HOUR*************************
112     
113     mov    b,#10                ;b:min低位
114     mov    a,HOUR            ;
115     div    ab
116     mov    ZLG_DECIMAL,a
117     mov    ZLG_SEND_BUF,#10000110B        ;显示位7
118     lcall    zlg_send
119     mov    ZLG_SEND_BUF,b
120     
121     lcall    zlg_send
122     setb    ZLG_CS
123     
124     mov    ZLG_SEND_BUF,#10000111B        ;显示位8
125     lcall    zlg_send
126     mov    ZLG_SEND_BUF,ZLG_DECIMAL
127     lcall    zlg_send
128     setb    ZLG_CS
129     ;*******display num  over**************************
130     
131 
132 MAIN_LOOP:
133     
134     jb    ZLG_KEY,$            ;Wait for keyboard,等待按键按下,不知道几号键,64个按键中的一个
135                         ;如果按键按下去:
136     mov    ZLG_SEND_BUF,#00010101B        ;Send the command of reading keyboard
137     lcall    zlg_send            ;发一个读按键的指令
138     lcall    zlg_receive            ;Read the data of keyboard,接收
139     setb    ZLG_CS                ;Set standby mode
140     jnb    ZLG_KEY,$            ;Wait the key to pop,等待按键放开
141     
142     mov    a,ZLG_REC_BUF
143     cjne    a,#00,KEY_01
144 KEY_00:
145     mov    ZLG_SEND_BUF,#10001000B        ;闪烁显示:hour
146     lcall    zlg_send
147     mov    ZLG_SEND_BUF,#00111111B        ;
148     lcall    zlg_send
149     setb    ZLG_CS
150     call    HOUR_ALTER
151     
152 KEY_01:
153     cjne    a,#01,KEY_02
154     mov    ZLG_SEND_BUF,#10001000B        ;闪烁显示:min
155     lcall    zlg_send
156     mov    ZLG_SEND_BUF,#11100111B        
157     lcall    zlg_send
158     setb    ZLG_CS
159     call    MIN_ALTER
160 KEY_02:
161     cjne    a,#02,KEY_EXIT
162     mov    ZLG_SEND_BUF,#10001000B        ;闪烁显示:second
163     lcall    zlg_send
164     mov    ZLG_SEND_BUF,#11111100B        
165     lcall    zlg_send
166     setb    ZLG_CS
167     call    SECOND_ALTER
168 KEY_EXIT:
169     jmp    MAIN_LOOP
170 
171     ret                    ;main return
172 ;*****************************************************************
173 SECOND_ALTER:
174     jb    ZLG_KEY,$            ;Wait for keyboard?
175     mov    ZLG_SEND_BUF,#00010101B        ;Send the command of reading keyboard
176     lcall    zlg_send            
177     lcall    zlg_receive            ;Read the data of keyboard,
178     setb    ZLG_CS                ;Set standby mode
179     jnb    ZLG_KEY,$            ;Wait the key to pop
180     
181     mov    a,ZLG_REC_BUF
182     cjne    a,#12,SECOND_ADD
183 SECOND_EXIT:
184     ret
185 SECOND_ADD:
186     cjne    a,#15,SECOND_SUB
187     mov    a,SECOND
188     inc    a
189     mov    SECOND,a
190     cjne    a,#59,SECOND_RE
191 SECOND_ADD_RESRT:
192     mov    SECOND,#00
193     jmp    SECOND_EXIT    
194 
195 SECOND_SUB:
196     cjne    a,#07,SECOND_RE
197     mov    a,SECOND
198     dec    a
199     mov    SECOND,a
200     cjne    a,#00,SECOND_RE
201 SECOND_SUB_RESET:
202     mov    SECOND,#59
203 SECOND_RE:
204     jmp    SECOND_ALTER
205 ;*****************************************************************
206 MIN_ALTER:
207     ;CLR    TR0
208     jb    ZLG_KEY,$            ;Wait for keyboard,等待按键按下,不知道几号键,64个按键中的一个
209                         ;如果按键按下去:
210     mov    ZLG_SEND_BUF,#00010101B        ;Send the command of reading keyboard
211     lcall    zlg_send                ;发一个读按键的指令
212     lcall    zlg_receive            ;Read the data of keyboard,接收
213     setb    ZLG_CS                ;Set standby mode
214     jnb    ZLG_KEY,$            ;Wait the key to pop,等待按键放开
215     
216     mov    a,ZLG_REC_BUF
217     cjne    a,#12,MIN_ADD
218 MIN_EXIT:
219     ret
220 MIN_ADD:
221     cjne    a,#15,MIN_SUB
222     mov    a,MIN
223     inc    a
224     mov    MIN,a
225     cjne    a,#59,MIN_RE
226 MIN_ADD_RESRT:
227     mov    MIN,#00
228     jmp    MIN_EXIT    
229 
230 MIN_SUB:
231     cjne    a,#07,MIN_RE
232     mov    a,MIN
233     dec    a
234     mov    MIN,a
235     cjne    a,#00,MIN_RE
236 MIN_SUB_RESET:
237     mov    MIN,#59
238 MIN_RE:
239     jmp    MIN_ALTER
240 
241 ;*****************************************************************
242 
243 HOUR_ALTER:
244     ;CLR    TR0
245     jb    ZLG_KEY,$            ;Wait for keyboard,等待按键按下,不知道几号键,64个按键中的一个
246                         ;如果按键按下去:
247     mov    ZLG_SEND_BUF,#00010101B        ;Send the command of reading keyboard
248     lcall    zlg_send                ;发一个读按键的指令
249     lcall    zlg_receive            ;Read the data of keyboard,接收
250     setb    ZLG_CS                ;Set standby mode
251     jnb    ZLG_KEY,$            ;Wait the key to pop,等待按键放开
252     
253     mov    a,ZLG_REC_BUF
254     cjne    a,#12,HOUR_ADD
255 HOUR_EXIT:
256     ret
257 HOUR_ADD:
258     cjne    a,#15,HOUR_SUB
259     mov    a,HOUR
260     inc    a
261     mov    HOUR,a
262     cjne    a,#59,HOUR_RE
263 HOUR_ADD_RESRT:
264     mov    HOUR,#00
265     jmp    HOUR_EXIT    
266 HOUR_SUB:
267     cjne    a,#07,HOUR_RE
268     mov    a,HOUR
269     dec    a
270     mov    HOUR,a
271     cjne    a,#00,HOUR_RE
272 HOUR_SUB_RESET:
273     mov    HOUR,#24
274 HOUR_RE:
275     jmp    HOUR_ALTER
276 
277 ;*****************************************************************
278 
279 interrupt_T0:
280     push    acc        ;Pay attention to here
281     push    psw
282 
283     ;Reset T0,must be done
284     ;clr    TF0        ;auto clear the tag of overflow
285     mov    TH0,#0B1H    ;20ms,reload number
286     mov    TL0,#0E0H
287 
288     inc    VAR_TIMER    ;Add 20ms
289     /*If VAR_TIMER=50,then time for 1s */
290     mov    a,VAR_TIMER
291     cjne    a,#50,INT_T0_EXIT
292 
293     mov    VAR_TIMER,#00H
294     call    NUM_ADD_SECOND    
295 
296 INT_T0_EXIT:
297     pop    psw
298     pop    acc
299 
300 reti
301 ;*****************************************************************
302 intreeupt_T_REFRESH:
303     push    acc        ;Pay attention to here
304     push    psw
305 
306     ;Reset T0,must be done
307     ;clr    TF0        ;auto clear the tag of overflow
308     mov    TH0,#0B1H    ;20ms,reload number
309     mov    TL0,#0E0H
310 
311     inc    VAR_TIMER    ;Add 20ms
312     /*If VAR_TIMER=50,then time for 1s */
313     mov    a,VAR_TIMER
314     cjne    a,#50,INT_T0_EXIT
315 
316     mov    VAR_TIMER,#00H
317     Lcall    NUM_ADD_SECOND
318     call    DISPALY_NUM
319 
320 INT_T0_EXIT_RE:
321     pop    psw
322     pop    acc
323 
324 reti
325 ;*****************************************************************
326 ;Send a byte to MCU with higer bit first
327 zlg_send:
328     mov    ZLG_BIT_CNT,#8        ;Set the number of data sended,发送:循环8次,左移
329     clr    ZLG_CS            ;Set set ZLG7289 ready,T1
330     call    delay_50;T1
331 
332 ZLG_SEND_LP:
333     ;Send a bit
334     mov    a,ZLG_SEND_BUF
335     rlc    a
336     mov    ZLG_SEND_BUF,a
337     mov    ZLG_DATA,c
338     nop                ;Wait for data to ready
339     nop
340 
341     setb    ZLG_CLK            ;T2,拉高拉低直接setb clr时间不够:74164位ns级+delay
342     lcall    delay_8            ;delay一个8微秒或者8个nop,然后再处理下一位
343     clr    ZLG_CLK            ;T3
344     lcall    delay_8
345     
346     djnz    ZLG_BIT_CNT,ZLG_SEND_LP    ;Loop to next bit
347 
348     ;clr    ZLG_DATA
349 
350     ret
351 ;*****************************************************************
352 ;Receive a byte to ZLG7289 with higer bit first
353 zlg_receive:
354     mov    ZLG_BIT_CNT,#8        ;Set the number of data received
355     clr    ZLG_CS                ;Set set ZLG7289 ready,T1
356     lcall    delay_50
357 
358 ZLG_REC_LP:
359     ;Receive a bit
360     setb    ZLG_CLK            ;T6
361     lcall    delay_8
362 
363     mov    c,ZLG_DATA
364     mov    a,ZLG_REC_BUF
365     rlc    a
366     mov    ZLG_REC_BUF,acc
367 
368     clr    ZLG_CLK            ;T7
369     lcall    delay_8
370 
371     djnz    ZLG_BIT_CNT,ZLG_REC_LP    ;Loop to next bit、
372 
373     clr    ZLG_DATA
374 
375     ret
376 
377 ;****************************************************
378 DISPALY_NUM:
379 ;*******display num : hour, minutes,second***************
380     ;***************second*******************
381 
382     mov    b,#10                ;b:低位
383     mov    a,SECOND            ;
384     div    ab
385     mov    ZLG_DECIMAL,a
386     mov    ZLG_SEND_BUF,#10000000B        ;显示位1
387     lcall    zlg_send
388     mov    ZLG_SEND_BUF,b
389     
390     lcall    zlg_send
391     setb    ZLG_CS
392     
393     mov    ZLG_SEND_BUF,#10000001B        ;显示位2
394     lcall    zlg_send
395     mov    ZLG_SEND_BUF,ZLG_DECIMAL
396     lcall    zlg_send
397     setb    ZLG_CS
398     ;**************"-"*************************
399     mov    ZLG_SEND_BUF,#10000010B        ;显示位3
400     lcall    zlg_send
401     mov    ZLG_SEND_BUF,#00001010B    
402     lcall    zlg_send
403     setb    ZLG_CS
404     ;**************MIN*************************
405     
406     mov    b,#10                ;b:min低位
407     mov    a,MIN            ;
408     div    ab
409     mov    ZLG_DECIMAL,a
410     mov    ZLG_SEND_BUF,#10000011B        ;显示位4
411     lcall    zlg_send
412     mov    ZLG_SEND_BUF,b
413     
414     lcall    zlg_send
415     setb    ZLG_CS
416     
417     mov    ZLG_SEND_BUF,#10000100B        ;显示位5
418     lcall    zlg_send
419     mov    ZLG_SEND_BUF,ZLG_DECIMAL
420     lcall    zlg_send
421     setb    ZLG_CS
422     ;**************"-"*************************
423     mov    ZLG_SEND_BUF,#10000101B        ;显示位6
424     lcall    zlg_send
425     mov    ZLG_SEND_BUF,#00001010B
426     lcall    zlg_send
427     setb    ZLG_CS
428 
429     ;**************HOUR*************************
430     
431     mov    b,#10                ;b:min低位
432     mov    a,HOUR            ;
433     div    ab
434     mov    ZLG_DECIMAL,a
435     mov    ZLG_SEND_BUF,#10000110B        ;显示位7
436     lcall    zlg_send
437     mov    ZLG_SEND_BUF,b
438     
439     lcall    zlg_send
440     setb    ZLG_CS
441     
442     mov    ZLG_SEND_BUF,#10000111B        ;显示位8
443     lcall    zlg_send
444     mov    ZLG_SEND_BUF,ZLG_DECIMAL
445     lcall    zlg_send
446     setb    ZLG_CS
447     ;*******display num  over**************************
448     RET
449 ;****************************************************
450 
451 NUM_ADD_SECOND:
452     ;Get previos value
453     mov    a,SECOND
454     inc    a
455     mov    SECOND,a
456     cjne    a,#60,NUM_ADD_EXIT
457 NUM_ADD_RESET_SECOND:
458     mov    SECOND,#00        
459 
460 NUM_ADD_MIN:
461     mov    a,MIN
462     inc    a
463     mov    MIN,a
464     cjne    a,#60,NUM_ADD_EXIT
465 
466 NUM_ADD_RESET_MIN:
467     mov    MIN,#00        ;        
468 
469 NUM_ADD_HOUR:
470     mov    a,HOUR
471     inc    a
472     mov    HOUR,a
473     cjne    a,#24,NUM_ADD_EXIT
474 
475 NUM_ADD_RESET_HOUR:
476     mov    HOUR,#00
477 NUM_ADD_EXIT:    
478     ret
479 ;*****************************************************************
480 ;Delay for (50+2) us
481 delay_50:
482     mov    VAR_DELAY,#25
483     djnz    VAR_DELAY,$
484     ret
485 ;*****************************************************************
486 ;Delay for (8+2) us
487 delay_8:
488     mov    VAR_DELAY,#4
489     djnz    VAR_DELAY,$
490     ret
491 ;*****************************************************************
492 END

 实验周结束啦!虽然好累好累,但调试成功,做出来的小程序管用的时候,就感觉this is the moment!

๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅),加油加油~(单片机好好玩!)

posted on 2022-11-23 22:34  罗小罗佳油  阅读(249)  评论(0编辑  收藏  举报