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