📄 lcd_1602_driver.lis
字号:
045E ; LCD_write_time : 数字显示函数
045E ;
045E ; 输入参数:
045E ; X、Y : 显示数据的起始的位置
045E ; h,m,s :时,分,秒
045E ; 编写日期 :2005-10-19
045E ; -----------------------------------------------------------------------*/
045E ; void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s,unsigned char z)
045E ; {
045E .dbline 253
045E ; unsigned char i;
045E ; unsigned char lcd[8]={0};
045E 80E0 ldi R24,<L69
0460 90E0 ldi R25,>L69
0462 FE01 movw R30,R28
0464 08E0 ldi R16,8
0466 10E0 ldi R17,0
0468 FA93 st -y,R31
046A EA93 st -y,R30
046C 9A93 st -y,R25
046E 8A93 st -y,R24
0470 00D0 rcall asgncblk
0472 .dbline 254
0472 ; if(y<2)
0472 8A2D mov R24,R10
0474 8230 cpi R24,2
0476 30F4 brsh L70
0478 .dbline 255
0478 ; add=y*16+x;//设置起始座标LCD_set_xy( X, Y );
0478 80E1 ldi R24,16
047A 8A9D mul R24,R10
047C 202C mov R2,R0
047E 240E add R2,R20
0480 20920000 sts _add,R2
0484 L70:
0484 .dbline 256
0484 ; lcd[0]=h/10+48;
0484 1AE0 ldi R17,10
0486 0E85 ldd R16,y+14
0488 00D0 rcall div8u
048A 802F mov R24,R16
048C 805D subi R24,208 ; addi 48
048E 8883 std y+0,R24
0490 .dbline 257
0490 ; lcd[1]=h%10+48;
0490 1AE0 ldi R17,10
0492 0E85 ldd R16,y+14
0494 00D0 rcall mod8u
0496 802F mov R24,R16
0498 805D subi R24,208 ; addi 48
049A 8983 std y+1,R24
049C .dbline 258
049C ; lcd[2]=':';
049C 8AE3 ldi R24,58
049E 8A83 std y+2,R24
04A0 .dbline 259
04A0 ; lcd[3]=m/10+48;
04A0 1AE0 ldi R17,10
04A2 0889 ldd R16,y+16
04A4 00D0 rcall div8u
04A6 802F mov R24,R16
04A8 805D subi R24,208 ; addi 48
04AA 8B83 std y+3,R24
04AC .dbline 260
04AC ; lcd[4]=m%10+48;
04AC 1AE0 ldi R17,10
04AE 0889 ldd R16,y+16
04B0 00D0 rcall mod8u
04B2 802F mov R24,R16
04B4 805D subi R24,208 ; addi 48
04B6 8C83 std y+4,R24
04B8 .dbline 261
04B8 ; lcd[5]=':';
04B8 8AE3 ldi R24,58
04BA 8D83 std y+5,R24
04BC .dbline 262
04BC ; lcd[6]=s/10+48;
04BC 1AE0 ldi R17,10
04BE 0A89 ldd R16,y+18
04C0 00D0 rcall div8u
04C2 802F mov R24,R16
04C4 805D subi R24,208 ; addi 48
04C6 8E83 std y+6,R24
04C8 .dbline 263
04C8 ; lcd[7]=s%10+48;
04C8 1AE0 ldi R17,10
04CA 0A89 ldd R16,y+18
04CC 00D0 rcall mod8u
04CE 802F mov R24,R16
04D0 805D subi R24,208 ; addi 48
04D2 8F83 std y+7,R24
04D4 .dbline 264
04D4 ; if(z==5){if(lcd[7]%2)
04D4 6530 cpi R22,5
04D6 51F4 brne L79
04D8 .dbline 264
04D8 .dbline 264
04D8 12E0 ldi R17,2
04DA 082F mov R16,R24
04DC 00D0 rcall mod8u
04DE 0023 tst R16
04E0 19F0 breq L81
04E2 .dbline 265
04E2 ; lcd[2]=':';
04E2 8AE3 ldi R24,58
04E4 8A83 std y+2,R24
04E6 02C0 rjmp L82
04E8 L81:
04E8 .dbline 267
04E8 80E2 ldi R24,32
04EA 8A83 std y+2,R24
04EC L82:
04EC .dbline 267
04EC ; else
04EC ; lcd[2]=' ';}
04EC L79:
04EC .dbline 269
04EC ;
04EC ; for (i=0;i<z;i++)
04EC 4427 clr R20
04EE 25C0 rjmp L89
04F0 L86:
04F0 .dbline 270
04F0 ; {
04F0 .dbline 271
04F0 ; if(lcd_data[add]==lcd[i])
04F0 CE01 movw R24,R28
04F2 E42F mov R30,R20
04F4 FF27 clr R31
04F6 E80F add R30,R24
04F8 F91F adc R31,R25
04FA 2080 ldd R2,z+0
04FC 80E0 ldi R24,<_lcd_data
04FE 90E0 ldi R25,>_lcd_data
0500 E0910000 lds R30,_add
0504 FF27 clr R31
0506 E80F add R30,R24
0508 F91F adc R31,R25
050A 3080 ldd R3,z+0
050C 3214 cp R3,R2
050E 09F4 brne L90
0510 .dbline 272
0510 ; {}
0510 .dbline 272
0510 0EC0 rjmp L91
0512 L90:
0512 .dbline 274
0512 ; else
0512 ; {data[add]=lcd[i];}
0512 .dbline 274
0512 CE01 movw R24,R28
0514 E42F mov R30,R20
0516 FF27 clr R31
0518 E80F add R30,R24
051A F91F adc R31,R25
051C 2080 ldd R2,z+0
051E 80E0 ldi R24,<_data
0520 90E0 ldi R25,>_data
0522 E0910000 lds R30,_add
0526 FF27 clr R31
0528 E80F add R30,R24
052A F91F adc R31,R25
052C 2082 std z+0,R2
052E .dbline 274
052E L91:
052E .dbline 275
052E 80910000 lds R24,_add
0532 8F5F subi R24,255 ; addi 1
0534 80930000 sts _add,R24
0538 .dbline 276
0538 L87:
0538 .dbline 269
0538 4395 inc R20
053A L89:
053A .dbline 269
053A 4617 cp R20,R22
053C C8F2 brlo L86
053E .dbline 277
053E ; add++;
053E ; }
053E ; LCD_updata;
053E 2224 clr R2
0540 20920000 sts _new,R2
0544 .dbline -2
0544 L68:
0544 2896 adiw R28,8
0546 00D0 rcall pop_gset3
0548 .dbline 0 ; func end
0548 0895 ret
054A .dbsym l lcd 0 A[8:8]c
054A .dbsym r i 20 c
054A .dbsym r z 22 c
054A .dbsym l s 18 c
054A .dbsym l m 16 c
054A .dbsym l h 14 c
054A .dbsym r y 10 c
054A .dbsym r x 20 c
054A .dbend
054A .dbfunc e LCD_write_new _LCD_write_new fV
054A ; address -> R20
054A ; new_add -> R22
.even
054A _LCD_write_new::
054A 00D0 rcall push_gset2
054C .dbline -1
054C .dbline 286
054C ; }
054C ; /*----------------------------------------------------
054C ; LCD_write_new:写显存函数
054C ; data[]:32字节的显存
054C ; new:显存标号
054C ; 编写日期:2005/10/18
054C ; -----------------------------------------------------*/
054C ; void LCD_write_new(void)
054C ; {
054C .dbline 288
054C ; unsigned char address;
054C ; unsigned char new_add=1;//1表示要更新地址
054C 61E0 ldi R22,1
054E 4FC0 rjmp L94
0550 L93:
0550 .dbline 290
0550 ; while(new<32)//显存共32个字节,标号从0--31
0550 ; {
0550 .dbline 291
0550 ; if(new==16)//换行
0550 80910000 lds R24,_new
0554 8031 cpi R24,16
0556 09F4 brne L96
0558 .dbline 292
0558 ; new_add=1;
0558 61E0 ldi R22,1
055A L96:
055A .dbline 293
055A ; if(data[new])//跳过为0的显存
055A 80E0 ldi R24,<_data
055C 90E0 ldi R25,>_data
055E E0910000 lds R30,_new
0562 FF27 clr R31
0564 E80F add R30,R24
0566 F91F adc R31,R25
0568 2080 ldd R2,z+0
056A 2220 tst R2
056C 09F4 brne X5
056E 39C0 rjmp L98
0570 X5:
0570 .dbline 294
0570 ; {
0570 .dbline 295
0570 ; if(new_add)//当new_add=0时表示无需更新地址
0570 6623 tst R22
0572 81F0 breq L100
0574 .dbline 296
0574 ; {
0574 .dbline 297
0574 ; if(new>15)
0574 8FE0 ldi R24,15
0576 20900000 lds R2,_new
057A 8215 cp R24,R2
057C 18F4 brsh L102
057E .dbline 298
057E ; address=0xb0+new;
057E 422D mov R20,R2
0580 4055 subi R20,80 ; addi 176
0582 03C0 rjmp L103
0584 L102:
0584 .dbline 300
0584 ; else
0584 ; address=0x80+new;
0584 40910000 lds R20,_new
0588 4058 subi R20,128 ; addi 128
058A L103:
058A .dbline 301
058A ; LCD_write_char(0,address);//设置起始地址
058A 242F mov R18,R20
058C 3327 clr R19
058E 0027 clr R16
0590 1127 clr R17
0592 71DD rcall _LCD_write_char
0594 .dbline 302
0594 ; }
0594 L100:
0594 .dbline 303
0594 ; LCD_write_char(1,data[new]);//写数据
0594 80E0 ldi R24,<_data
0596 90E0 ldi R25,>_data
0598 E0910000 lds R30,_new
059C FF27 clr R31
059E E80F add R30,R24
05A0 F91F adc R31,R25
05A2 2081 ldd R18,z+0
05A4 3327 clr R19
05A6 01E0 ldi R16,1
05A8 10E0 ldi R17,0
05AA 65DD rcall _LCD_write_char
05AC .dbline 304
05AC ; lcd_data[new]=data[new];
05AC 80E0 ldi R24,<_data
05AE 90E0 ldi R25,>_data
05B0 E0910000 lds R30,_new
05B4 FF27 clr R31
05B6 E80F add R30,R24
05B8 F91F adc R31,R25
05BA 2080 ldd R2,z+0
05BC 80E0 ldi R24,<_lcd_data
05BE 90E0 ldi R25,>_lcd_data
05C0 E0910000 lds R30,_new
05C4 FF27 clr R31
05C6 E80F add R30,R24
05C8 F91F adc R31,R25
05CA 2082 std z+0,R2
05CC .dbline 305
05CC ; data[new]=0;//写完数据后,显存清0
05CC 80E0 ldi R24,<_data
05CE 90E0 ldi R25,>_data
05D0 E0910000 lds R30,_new
05D4 FF27 clr R31
05D6 E80F add R30,R24
05D8 F91F adc R31,R25
05DA 2224 clr R2
05DC 2082 std z+0,R2
05DE .dbline 306
05DE ; new_add=0;
05DE 6627 clr R22
05E0 .dbline 307
05E0 ; }
05E0 01C0 rjmp L99
05E2 L98:
05E2 .dbline 309
05E2 ; else
05E2 ; new_add=1;
05E2 61E0 ldi R22,1
05E4 L99:
05E4 .dbline 310
05E4 80910000 lds R24,_new
05E8 8F5F subi R24,255 ; addi 1
05EA 80930000 sts _new,R24
05EE .dbline 311
05EE L94:
05EE .dbline 289
05EE 80910000 lds R24,_new
05F2 8032 cpi R24,32
05F4 08F4 brsh X6
05F6 ACCF rjmp L93
05F8 X6:
05F8 .dbline -2
05F8 L92:
05F8 00D0 rcall pop_gset2
05FA .dbline 0 ; func end
05FA 0895 ret
05FC .dbsym r address 20 c
05FC .dbsym r new_add 22 c
05FC .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\刻录的\电子技术\项目\电池放电器\软件V2.0\LCD_1602_Driver.c
0000 _add::
0000 .blkb 1
0001 .dbsym e add _add c
0001 _data::
0001 .blkb 32
0021 .dbsym e data _data A[32:32]c
0021 _lcd_data::
0021 .blkb 32
0041 .dbsym e lcd_data _lcd_data A[32:32]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -