📄 lcd_1602_driver.lis
字号:
0276 FD01 movw R30,R26
0278 A491 lpm R26,Z
027A E991 ld R30,y+
027C F991 ld R31,y+
027E A083 std z+0,R26
0280 .dbline 160
0280 L35:
0280 .dbline 161
0280 6F5F subi R22,255 ; offset = 1
0282 7F4F sbci R23,255
0284 .dbline 162
0284 80910000 lds R24,_add
0288 8F5F subi R24,255 ; addi 1
028A 80930000 sts _add,R24
028E .dbline 163
028E L32:
028E .dbline 156
028E FB01 movw R30,R22
0290 E491 lpm R30,Z
0292 EE23 tst R30
0294 C9F6 brne L31
0296 .dbline 164
0296 ; s ++;//指针加1
0296 ; add++;//显存地址加1
0296 ; }
0296 ; if(y==1)
0296 2130 cpi R18,1
0298 81F4 brne L41
029A .dbline 165
029A ; e+=16;
029A 405F subi R20,240 ; addi 16
029C .dbline 166
029C ; for(;e>=add;add++)
029C 0EC0 rjmp L41
029E L38:
029E .dbline 167
029E .dbline 167
029E 80E0 ldi R24,<_data
02A0 90E0 ldi R25,>_data
02A2 E0910000 lds R30,_add
02A6 FF27 clr R31
02A8 E80F add R30,R24
02AA F91F adc R31,R25
02AC 80E2 ldi R24,32
02AE 8083 std z+0,R24
02B0 .dbline 167
02B0 L39:
02B0 .dbline 166
02B0 80910000 lds R24,_add
02B4 8F5F subi R24,255 ; addi 1
02B6 80930000 sts _add,R24
02BA L41:
02BA .dbline 166
02BA 20900000 lds R2,_add
02BE 4215 cp R20,R2
02C0 70F7 brsh L38
02C2 .dbline 168
02C2 ; {data[add]=' ';}
02C2 ; LCD_updata;
02C2 2224 clr R2
02C4 20920000 sts _new,R2
02C8 .dbline -2
02C8 L28:
02C8 00D0 rcall pop_gset2
02CA .dbline 0 ; func end
02CA 0895 ret
02CC .dbsym r e 20 c
02CC .dbsym r s 22 pkc
02CC .dbsym r y 18 c
02CC .dbsym r x 16 c
02CC .dbend
.area lit(rom, con, rel)
0002 L43:
0002 00 .byte 0
0003 000000000000000000 .byte 0,0,0,0,0,0,0,0,0
.area text(rom, con, rel)
02CC .dbfile E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\LCD_1602_Driver.c
02CC .dbfunc e LCD_write_number _LCD_write_number fV
02CC ; c -> R10
02CC ; b -> R12
02CC ; lcd -> y+0
02CC ; i -> R14
02CC ; e -> R6
02CC ; s -> R8,R9
02CC ; dat -> y+24
02CC ; d -> y+22
02CC ; y -> y+20
02CC ; x -> R14
.even
02CC _LCD_write_number::
02CC 3A93 st -y,r19
02CE 2A93 st -y,r18
02D0 00D0 rcall push_gset5
02D2 E02E mov R14,R16
02D4 2A97 sbiw R28,10
02D6 8C8C ldd R8,y+28
02D8 9D8C ldd R9,y+29
02DA 6E8C ldd R6,y+30
02DC .dbline -1
02DC .dbline 182
02DC ; }
02DC ; /*-----------------------------------------------------------------------
02DC ; LCD_write_number : 数字显示函数
02DC ;
02DC ; 输入参数:
02DC ; X、Y : 显示字符串的位置
02DC ; d :在第d位插入小数点
02DC ; data :要显示的数据 长整形
02DC ; *s :数据的单位
02DC ; e : 把从最后一个字符到x=e之间的内容删除
02DC ; 编写日期 :2005/10/18
02DC ; -----------------------------------------------------------------------*/
02DC ; void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
02DC ; {
02DC .dbline 184
02DC ; unsigned char i;
02DC ; unsigned char b=0;
02DC CC24 clr R12
02DE .dbline 185
02DE ; unsigned char c='.';
02DE 8EE2 ldi R24,46
02E0 A82E mov R10,R24
02E2 .dbline 186
02E2 ; unsigned char lcd[10]={0};
02E2 80E0 ldi R24,<L43
02E4 90E0 ldi R25,>L43
02E6 FE01 movw R30,R28
02E8 0AE0 ldi R16,10
02EA 10E0 ldi R17,0
02EC FA93 st -y,R31
02EE EA93 st -y,R30
02F0 9A93 st -y,R25
02F2 8A93 st -y,R24
02F4 00D0 rcall asgncblk
02F6 .dbline 187
02F6 ; if(y<2)//如果Y>1则不重新计算地址
02F6 8C89 ldd R24,y+20
02F8 8230 cpi R24,2
02FA 38F4 brsh L44
02FC .dbline 188
02FC ; add=y*16+x;//设置起始座标
02FC 80E1 ldi R24,16
02FE 0C88 ldd R0,y+20
0300 809D mul R24,R0
0302 202C mov R2,R0
0304 2E0C add R2,R14
0306 20920000 sts _add,R2
030A L44:
030A .dbline 190
030A ;
030A ; for (i=10;i>0;i--)
030A 8AE0 ldi R24,10
030C E82E mov R14,R24
030E 36C0 rjmp L49
0310 L46:
0310 .dbline 191
0310 .dbline 192
0310 4AE0 ldi R20,10
0312 50E0 ldi R21,0
0314 60E0 ldi R22,0
0316 70E0 ldi R23,0
0318 FE01 movw R30,R28
031A 208C ldd R2,z+24
031C 318C ldd R3,z+25
031E 428C ldd R4,z+26
0320 538C ldd R5,z+27
0322 7A93 st -y,R23
0324 6A93 st -y,R22
0326 5A93 st -y,R21
0328 4A93 st -y,R20
032A 8101 movw R16,R2
032C 9201 movw R18,R4
032E 00D0 rcall mod32u
0330 1801 movw R2,R16
0332 2901 movw R4,R18
0334 40E3 ldi R20,48
0336 50E0 ldi R21,0
0338 60E0 ldi R22,0
033A 70E0 ldi R23,0
033C 240E add R2,R20
033E 351E adc R3,R21
0340 461E adc R4,R22
0342 571E adc R5,R23
0344 CE01 movw R24,R28
0346 EE2D mov R30,R14
0348 FF27 clr R31
034A E80F add R30,R24
034C F91F adc R31,R25
034E 2082 std z+0,R2
0350 .dbline 193
0350 4AE0 ldi R20,10
0352 50E0 ldi R21,0
0354 60E0 ldi R22,0
0356 70E0 ldi R23,0
0358 FE01 movw R30,R28
035A 208C ldd R2,z+24
035C 318C ldd R3,z+25
035E 428C ldd R4,z+26
0360 538C ldd R5,z+27
0362 7A93 st -y,R23
0364 6A93 st -y,R22
0366 5A93 st -y,R21
0368 4A93 st -y,R20
036A 8101 movw R16,R2
036C 9201 movw R18,R4
036E 00D0 rcall div32u
0370 FE01 movw R30,R28
0372 008F std z+24,R16
0374 118F std z+25,R17
0376 228F std z+26,R18
0378 338F std z+27,R19
037A .dbline 194
037A L47:
037A .dbline 190
037A EA94 dec R14
037C L49:
037C .dbline 190
037C 2224 clr R2
037E 2E14 cp R2,R14
0380 08F4 brsh X1
0382 C6CF rjmp L46
0384 X1:
0384 .dbline 196
0384 ; {
0384 ; lcd[i]=dat%10+48;
0384 ; dat=dat/10;
0384 ; }
0384 ;
0384 ; for(i=1;i<11;i++)
0384 EE24 clr R14
0386 E394 inc R14
0388 79C0 rjmp L53
038A L50:
038A .dbline 197
038A ; {
038A .dbline 198
038A ; if(i==11-d)
038A 8BE0 ldi R24,11
038C 0E88 ldd R0,y+22
038E 8019 sub R24,R0
0390 E816 cp R14,R24
0392 C1F4 brne L54
0394 .dbline 199
0394 ; {
0394 .dbline 200
0394 ; if(lcd_data[add]==c)
0394 80E0 ldi R24,<_lcd_data
0396 90E0 ldi R25,>_lcd_data
0398 E0910000 lds R30,_add
039C FF27 clr R31
039E E80F add R30,R24
03A0 F91F adc R31,R25
03A2 2080 ldd R2,z+0
03A4 2A14 cp R2,R10
03A6 09F4 brne L56
03A8 .dbline 201
03A8 ; {}
03A8 .dbline 201
03A8 08C0 rjmp L57
03AA L56:
03AA .dbline 203
03AA ; else
03AA ; {data[add]=c;}
03AA .dbline 203
03AA 80E0 ldi R24,<_data
03AC 90E0 ldi R25,>_data
03AE E0910000 lds R30,_add
03B2 FF27 clr R31
03B4 E80F add R30,R24
03B6 F91F adc R31,R25
03B8 A082 std z+0,R10
03BA .dbline 203
03BA L57:
03BA .dbline 204
03BA ; add++;
03BA 80910000 lds R24,_add
03BE 8F5F subi R24,255 ; addi 1
03C0 80930000 sts _add,R24
03C4 .dbline 205
03C4 ; }
03C4 L54:
03C4 .dbline 206
03C4 ; if((lcd[i]-48+b)==0)
03C4 CE01 movw R24,R28
03C6 EE2D mov R30,R14
03C8 FF27 clr R31
03CA E80F add R30,R24
03CC F91F adc R31,R25
03CE 8081 ldd R24,z+0
03D0 8053 subi R24,48
03D2 8C0D add R24,R12
03D4 09F0 breq X2
03D6 2BC0 rjmp L58
03D8 X2:
03D8 .dbline 207
03D8 ; {
03D8 .dbline 208
03D8 ; if(i>=(10-d))
03D8 8AE0 ldi R24,10
03DA 0E88 ldd R0,y+22
03DC 8019 sub R24,R0
03DE E816 cp R14,R24
03E0 08F4 brsh X3
03E2 4BC0 rjmp L59
03E4 X3:
03E4 .dbline 209
03E4 ; {
03E4 .dbline 210
03E4 ; if(lcd_data[add]==lcd[i])
03E4 CE01 movw R24,R28
03E6 EE2D mov R30,R14
03E8 FF27 clr R31
03EA E80F add R30,R24
03EC F91F adc R31,R25
03EE 2080 ldd R2,z+0
03F0 80E0 ldi R24,<_lcd_data
03F2 90E0 ldi R25,>_lcd_data
03F4 E0910000 lds R30,_add
03F8 FF27 clr R31
03FA E80F add R30,R24
03FC F91F adc R31,R25
03FE 3080 ldd R3,z+0
0400 3214 cp R3,R2
0402 09F4 brne L62
0404 .dbline 211
0404 ; {}
0404 .dbline 211
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -