使用ZLG7289,51单片机驱动的时钟显示小程序

  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 
 13     SECOND        EQU    34H    ;second
 14     MIN        EQU    35H    ;min
 15     HOUR        EQU    36H    ;hour
 16     VAR_TIMER    EQU    37H    ;Soft timer,溢出次数
 17 
 18 
 19     ;*******DELAY PARAMETERS*******
 20     VAR_DELAY        EQU    71H    ;The variable for delay function
 21 ;******************************************************
 22     org    0000H
 23     ljmp    MAIN
 24 
 25     org    000BH
 26     jmp    interrupt_T0
 27 ;******************************************************
 28 
 29     org    0030H
 30 MAIN:
 31 
 32     setb    ZLG_CS                ;先关闭
 33     setb    ZLG_KEY                ;先关闭
 34     setb    ZLG_DATA                ;先关闭
 35     call    delay_50                ;给时间上电各自启动,让ZLG正常上电
 36 
 37     mov    ZLG_SEND_BUF,#10100100B        ;Initialize ZLG7289,初始化zlg放到变量里
 38     call    zlg_send                ;调用一个发送函数
 39     setb    ZLG_CS                ;Set standby mode
 40 
 41     /*Initilize the var*/
 42     mov    SECOND,#50        
 43     mov    MIN,#12
 44     mov    HOUR,#14
 45     mov    VAR_TIMER,#00H
 46 
 47     /*Initialize T0*/
 48     mov    TMOD,#01H
 49     mov    TH0,#0B1H    ;20ms,load number
 50     mov    TL0,#0E0H
 51     setb    TR0        ;Start T0
 52     setb    ET0        ;Enable T0 inerrupt
 53     setb    EA        ;Enable interrupt
 54     ;mov    IE,#82H        ;#10000010B
 55 
 56 
 57 MAIN_LOOP:
 58     ;*******display num : hour, minutes,second***************
 59     ;***************second*******************
 60 
 61     mov    b,#10                ;b:低位
 62     mov    a,SECOND            ;
 63     div    ab
 64     mov    ZLG_DECIMAL,a
 65 
 66     mov    ZLG_SEND_BUF,#10000000B        ;显示位1
 67     lcall    zlg_send
 68     mov    ZLG_SEND_BUF,ZLG_DECIMAL
 69     
 70     lcall    zlg_send
 71     setb    ZLG_CS
 72     
 73     mov    ZLG_SEND_BUF,#10000001B        ;显示位2
 74     lcall    zlg_send
 75     mov    ZLG_SEND_BUF,b
 76     lcall    zlg_send
 77     setb    ZLG_CS
 78 
 79     ;**************"-"*************************
 80     mov    ZLG_SEND_BUF,#10000010B        ;显示位3
 81     lcall    zlg_send
 82     mov    ZLG_SEND_BUF,#00001010B    
 83     lcall    zlg_send
 84     setb    ZLG_CS
 85 
 86     ;**************MIN*************************
 87     
 88     mov    b,#10                ;b:min低位
 89     mov    a,MIN            ;
 90     div    ab
 91     mov    ZLG_DECIMAL,a
 92 
 93     mov    ZLG_SEND_BUF,#10000011B        ;显示位4
 94     lcall    zlg_send
 95     mov    ZLG_SEND_BUF,ZLG_DECIMAL
 96     
 97     lcall    zlg_send
 98     setb    ZLG_CS
 99     
100     mov    ZLG_SEND_BUF,#10000100B        ;显示位5
101     lcall    zlg_send
102     mov    ZLG_SEND_BUF,b
103     lcall    zlg_send
104     setb    ZLG_CS
105 
106     ;**************"-"*************************
107     mov    ZLG_SEND_BUF,#10000101B        ;显示位6
108     lcall    zlg_send
109     mov    ZLG_SEND_BUF,#00001010B
110     lcall    zlg_send
111     setb    ZLG_CS
112 
113 
114     ;**************HOUR*************************
115     
116     mov    b,#10                ;b:min低位
117     mov    a,HOUR            ;
118     div    ab
119     mov    ZLG_DECIMAL,a
120 
121     mov    ZLG_SEND_BUF,#10000110B        ;显示位7
122     lcall    zlg_send
123     mov    ZLG_SEND_BUF,ZLG_DECIMAL
124     
125     lcall    zlg_send
126     setb    ZLG_CS
127     
128     mov    ZLG_SEND_BUF,#10000111B        ;显示位8
129     lcall    zlg_send
130     mov    ZLG_SEND_BUF,b
131     lcall    zlg_send
132     setb    ZLG_CS
133 
134     
135 
136     mov    ZLG_SEND_BUF,#10001000B        ;闪烁显示:闪烁控制
137     lcall    zlg_send
138     mov    ZLG_SEND_BUF,#11111100B        ;1-7段闪烁,第8段不闪烁
139     lcall    zlg_send
140     setb    ZLG_CS
141 
142 ;WAIT_KEY_POP:
143     jnb    ZLG_KEY,$        ;Wait the key to pop,等待按键放开
144     
145     ajmp    MAIN_LOOP        ;再回到主程序,等待按键按下去
146 
147     ;JMP    $
148     ret                ;main return
149 ;*****************************************************************
150 
151 
152 interrupt_T0:
153     push    acc        ;Pay attention to here
154     push    psw
155 
156     ;Reset T0,must be done
157     ;clr    TF0        ;auto clear the tag of overflow
158     mov    TH0,#0B1H    ;20ms,reload number
159     mov    TL0,#0E0H
160 
161     inc    VAR_TIMER    ;Add 20ms
162     /*If VAR_TIMER=50,then time for 1s */
163     mov    a,VAR_TIMER
164     cjne    a,#50,INT_T0_EXIT
165 
166     mov    VAR_TIMER,#00H
167     call    NUM_ADD_SECOND    
168 
169 INT_T0_EXIT:
170     pop    psw
171     pop    acc
172 
173 reti
174 ;*****************************************************************
175 ;Send a byte to MCU with higer bit first
176 zlg_send:
177     mov    ZLG_BIT_CNT,#8        ;Set the number of data sended,发送:循环8次,左移
178     clr    ZLG_CS            ;Set set ZLG7289 ready,T1
179     call    delay_50;T1
180 
181 ZLG_SEND_LP:
182     ;Send a bit
183     mov    a,ZLG_SEND_BUF
184     rlc    a
185     mov    ZLG_SEND_BUF,a
186     mov    ZLG_DATA,c
187     nop                ;Wait for data to ready
188     nop
189 
190     setb    ZLG_CLK            ;T2,拉高拉低直接setb clr时间不够:74164位ns级+delay
191     lcall    delay_8            ;delay一个8微秒或者8个nop,然后再处理下一位
192     clr    ZLG_CLK            ;T3
193     lcall    delay_8
194     
195     djnz    ZLG_BIT_CNT,ZLG_SEND_LP    ;Loop to next bit
196 
197     ;clr    ZLG_DATA
198 
199     ret
200 ;*****************************************************************
201 ;Receive a byte to ZLG7289 with higer bit first
202 zlg_receive:
203     mov    ZLG_BIT_CNT,#8        ;Set the number of data received
204     clr    ZLG_CS                ;Set set ZLG7289 ready,T1
205     lcall    delay_50
206 
207 ZLG_REC_LP:
208     ;Receive a bit
209     setb    ZLG_CLK            ;T6
210     lcall    delay_8
211 
212     mov    c,ZLG_DATA
213     mov    a,ZLG_REC_BUF
214     rlc    a
215     mov    ZLG_REC_BUF,acc
216 
217     clr    ZLG_CLK            ;T7
218     lcall    delay_8
219 
220     djnz    ZLG_BIT_CNT,ZLG_REC_LP    ;Loop to next bit、
221 
222     clr    ZLG_DATA
223 
224     ret
225 
226 ;****************************************************
227 
228 NUM_ADD_SECOND:
229     ;Get previos value
230     mov    a,SECOND
231     inc    a
232     mov    SECOND,a
233     cjne    a,#59,NUM_ADD_EXIT
234 
235 
236 
237 NUM_ADD_RESET_SECOND:
238     
239     mov    SECOND,#00        ;
240     ;应该调用的是分钟数+1
241 
242 
243 NUM_ADD_MIN:
244     
245     ;到了59min,分钟数清零,没到加一
246     ;判断MIN是不是59,是的话清零,不是+1
247     ;get previous value
248     mov    a,MIN
249     inc    a
250     mov    MIN,a
251     cjne    a,#59,NUM_ADD_EXIT
252 
253 NUM_ADD_RESET_MIN:
254     
255     mov    MIN,#00        ;
256     
257 NUM_ADD_HOUR:
258     
259     ;到了59hour。小时数清零,没到加一
260     ;判断HOUR是不是59,是的话清零,不是+1
261     ;get previous value
262     mov    a,HOUR
263     inc    a
264     mov    HOUR,a
265     cjne    a,#24,NUM_ADD_EXIT
266 
267 NUM_ADD_RESET_HOUR:
268     
269     mov    HOUR,#00
270 
271 NUM_ADD_EXIT:    
272     
273     ret
274 
275 ;*****************************************************************
276 ;Delay for (50+2) us
277 delay_50:
278     mov    VAR_DELAY,#25
279     djnz    VAR_DELAY,$
280     ret
281 ;*****************************************************************
282 ;Delay for (8+2) us
283 delay_8:
284     mov    VAR_DELAY,#4
285     djnz    VAR_DELAY,$
286     ret
287 ;*****************************************************************
288 END

 

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