使用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