使用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!
๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅),加油加油~(单片机好好玩!)