📄 lcd_1602_driver.lis
字号:
0584 8E83 std y+6,R24
0586 .dbline 264
0586 ; lcd[7]=s%10+48;
0586 1AE0 ldi R17,10
0588 0889 ldd R16,y+16
058A 00D0 rcall mod8u
058C 802F mov R24,R16
058E 805D subi R24,208 ; addi 48
0590 8F83 std y+7,R24
0592 .dbline 270
0592 ; /*时和分之间的:的闪动效果
0592 ; if(lcd[7]%2)
0592 ; lcd[2]=':';
0592 ; else
0592 ; lcd[2]=' ';*/
0592 ; for (i=0;i<8;i++)
0592 4427 clr R20
0594 25C0 rjmp L91
0596 L88:
0596 .dbline 271
0596 ; {
0596 .dbline 272
0596 ; if(lcd_data[add]==lcd[i])
0596 CE01 movw R24,R28
0598 E42F mov R30,R20
059A FF27 clr R31
059C E80F add R30,R24
059E F91F adc R31,R25
05A0 2080 ldd R2,z+0
05A2 80E0 ldi R24,<_lcd_data
05A4 90E0 ldi R25,>_lcd_data
05A6 E0910000 lds R30,_add
05AA FF27 clr R31
05AC E80F add R30,R24
05AE F91F adc R31,R25
05B0 3080 ldd R3,z+0
05B2 3214 cp R3,R2
05B4 09F4 brne L92
05B6 .dbline 273
05B6 ; {}
05B6 .dbline 273
05B6 0EC0 rjmp L93
05B8 L92:
05B8 .dbline 275
05B8 ; else
05B8 ; {data[add]=lcd[i];}
05B8 .dbline 275
05B8 CE01 movw R24,R28
05BA E42F mov R30,R20
05BC FF27 clr R31
05BE E80F add R30,R24
05C0 F91F adc R31,R25
05C2 2080 ldd R2,z+0
05C4 80E0 ldi R24,<_data
05C6 90E0 ldi R25,>_data
05C8 E0910000 lds R30,_add
05CC FF27 clr R31
05CE E80F add R30,R24
05D0 F91F adc R31,R25
05D2 2082 std z+0,R2
05D4 .dbline 275
05D4 L93:
05D4 .dbline 276
05D4 80910000 lds R24,_add
05D8 8F5F subi R24,255 ; addi 1
05DA 80930000 sts _add,R24
05DE .dbline 277
05DE L89:
05DE .dbline 270
05DE 4395 inc R20
05E0 L91:
05E0 .dbline 270
05E0 4830 cpi R20,8
05E2 C8F2 brlo L88
05E4 .dbline 278
05E4 ; add++;
05E4 ; }
05E4 ; LCD_updata;
05E4 2224 clr R2
05E6 20920000 sts _new,R2
05EA .dbline -2
05EA L77:
05EA 2896 adiw R28,8
05EC 00D0 rcall pop_gset2
05EE .dbline 0 ; func end
05EE 0895 ret
05F0 .dbsym l lcd 0 A[8:8]c
05F0 .dbsym r i 20 c
05F0 .dbsym l s 16 c
05F0 .dbsym l m 14 c
05F0 .dbsym l h 12 c
05F0 .dbsym r y 22 c
05F0 .dbsym r x 20 c
05F0 .dbend
05F0 .dbfunc e LCD_write_new _LCD_write_new fV
05F0 ; address -> R20
05F0 ; new_add -> R22
.even
05F0 _LCD_write_new::
05F0 00D0 rcall push_gset2
05F2 .dbline -1
05F2 .dbline 287
05F2 ; }
05F2 ; /*----------------------------------------------------
05F2 ; LCD_write_new:写显存函数
05F2 ; data[]:32字节的显存
05F2 ; new:显存标号
05F2 ; 编写日期:2005/10/18
05F2 ; -----------------------------------------------------*/
05F2 ; void LCD_write_new(void)
05F2 ; {
05F2 .dbline 289
05F2 ; unsigned char address;
05F2 ; unsigned char new_add=1;//1表示要更新地址
05F2 61E0 ldi R22,1
05F4 4FC0 rjmp L96
05F6 L95:
05F6 .dbline 291
05F6 ; while(new<32)//显存共32个字节,标号从0--31
05F6 ; {
05F6 .dbline 292
05F6 ; if(new==16)//换行
05F6 80910000 lds R24,_new
05FA 8031 cpi R24,16
05FC 09F4 brne L98
05FE .dbline 293
05FE ; new_add=1;
05FE 61E0 ldi R22,1
0600 L98:
0600 .dbline 294
0600 ; if(data[new])//跳过为0的显存
0600 80E0 ldi R24,<_data
0602 90E0 ldi R25,>_data
0604 E0910000 lds R30,_new
0608 FF27 clr R31
060A E80F add R30,R24
060C F91F adc R31,R25
060E 2080 ldd R2,z+0
0610 2220 tst R2
0612 09F4 brne X5
0614 39C0 rjmp L100
0616 X5:
0616 .dbline 295
0616 ; {
0616 .dbline 296
0616 ; if(new_add)//当new_add=0时表示无需更新地址
0616 6623 tst R22
0618 81F0 breq L102
061A .dbline 297
061A ; {
061A .dbline 298
061A ; if(new>15)
061A 8FE0 ldi R24,15
061C 20900000 lds R2,_new
0620 8215 cp R24,R2
0622 18F4 brsh L104
0624 .dbline 299
0624 ; address=0xb0+new;
0624 422D mov R20,R2
0626 4055 subi R20,80 ; addi 176
0628 03C0 rjmp L105
062A L104:
062A .dbline 301
062A ; else
062A ; address=0x80+new;
062A 40910000 lds R20,_new
062E 4058 subi R20,128 ; addi 128
0630 L105:
0630 .dbline 302
0630 ; LCD_write_char(0,address);//设置起始地址
0630 242F mov R18,R20
0632 3327 clr R19
0634 0027 clr R16
0636 1127 clr R17
0638 22DD rcall _LCD_write_char
063A .dbline 303
063A ; }
063A L102:
063A .dbline 304
063A ; LCD_write_char(1,data[new]);//写数据
063A 80E0 ldi R24,<_data
063C 90E0 ldi R25,>_data
063E E0910000 lds R30,_new
0642 FF27 clr R31
0644 E80F add R30,R24
0646 F91F adc R31,R25
0648 2081 ldd R18,z+0
064A 3327 clr R19
064C 01E0 ldi R16,1
064E 10E0 ldi R17,0
0650 16DD rcall _LCD_write_char
0652 .dbline 305
0652 ; lcd_data[new]=data[new];
0652 80E0 ldi R24,<_data
0654 90E0 ldi R25,>_data
0656 E0910000 lds R30,_new
065A FF27 clr R31
065C E80F add R30,R24
065E F91F adc R31,R25
0660 2080 ldd R2,z+0
0662 80E0 ldi R24,<_lcd_data
0664 90E0 ldi R25,>_lcd_data
0666 E0910000 lds R30,_new
066A FF27 clr R31
066C E80F add R30,R24
066E F91F adc R31,R25
0670 2082 std z+0,R2
0672 .dbline 306
0672 ; data[new]=0;//写完数据后,显存清0
0672 80E0 ldi R24,<_data
0674 90E0 ldi R25,>_data
0676 E0910000 lds R30,_new
067A FF27 clr R31
067C E80F add R30,R24
067E F91F adc R31,R25
0680 2224 clr R2
0682 2082 std z+0,R2
0684 .dbline 307
0684 ; new_add=0;
0684 6627 clr R22
0686 .dbline 308
0686 ; }
0686 01C0 rjmp L101
0688 L100:
0688 .dbline 310
0688 ; else
0688 ; new_add=1;
0688 61E0 ldi R22,1
068A L101:
068A .dbline 311
068A 80910000 lds R24,_new
068E 8F5F subi R24,255 ; addi 1
0690 80930000 sts _new,R24
0694 .dbline 312
0694 L96:
0694 .dbline 290
0694 80910000 lds R24,_new
0698 8032 cpi R24,32
069A 08F4 brsh X6
069C ACCF rjmp L95
069E X6:
069E .dbline -2
069E L94:
069E 00D0 rcall pop_gset2
06A0 .dbline 0 ; func end
06A0 0895 ret
06A2 .dbsym r address 20 c
06A2 .dbsym r new_add 22 c
06A2 .dbend
06A2 .dbfunc e LCD_write_CGRAM _LCD_write_CGRAM fV
06A2 ; n -> R20
06A2 ; y -> R18
06A2 ; x -> R16
.even
06A2 _LCD_write_CGRAM::
06A2 00D0 rcall push_gset1
06A4 4A81 ldd R20,y+2
06A6 .dbline -1
06A6 .dbline 322
06A6 ; new++;//
06A6 ; }
06A6 ; }
06A6 ; /*----------------------------------------------------
06A6 ; LCD_write_CGRAM:写CGRAM的函数
06A6 ; 输入参数:
06A6 ; X、Y : 显示数据的起始的位置
06A6 ; n : 存入LCD的图案的编号
06A6 ; 编写日期:2005/10/18
06A6 ; -----------------------------------------------------*/
06A6 ; void LCD_write_CGRAM(unsigned char x,unsigned char y,unsigned char n)
06A6 ; {
06A6 .dbline 323
06A6 ; if(y<2)
06A6 2230 cpi R18,2
06A8 30F4 brsh L107
06AA .dbline 324
06AA ; add=y*16+x;//设置起始座标
06AA 80E1 ldi R24,16
06AC 829F mul R24,R18
06AE 202C mov R2,R0
06B0 200E add R2,R16
06B2 20920000 sts _add,R2
06B6 L107:
06B6 .dbline 325
06B6 ; if(n==0)//0表示空数据
06B6 4423 tst R20
06B8 09F4 brne L109
06BA .dbline 326
06BA ; n+=8;//所以要加上8 (0>8/1>9/2>10...7>15)
06BA 485F subi R20,248 ; addi 8
06BC L109:
06BC .dbline 327
06BC ; data[add]=n;
06BC 80E0 ldi R24,<_data
06BE 90E0 ldi R25,>_data
06C0 E0910000 lds R30,_add
06C4 FF27 clr R31
06C6 E80F add R30,R24
06C8 F91F adc R31,R25
06CA 4083 std z+0,R20
06CC .dbline 328
06CC ; LCD_updata;
06CC 2224 clr R2
06CE 20920000 sts _new,R2
06D2 .dbline -2
06D2 L106:
06D2 00D0 rcall pop_gset1
06D4 .dbline 0 ; func end
06D4 0895 ret
06D6 .dbsym r n 20 c
06D6 .dbsym r y 18 c
06D6 .dbsym r x 16 c
06D6 .dbend
.area lit(rom, con, rel)
0014 L112:
0014 3F01 .byte 63,1
0016 0101 .byte 1,1
0018 0101 .byte 1,1
001A 3F00 .byte 63,0
001C 0004 .byte 0,4
001E 021F .byte 2,31
0020 0204 .byte 2,4
0022 0000 .byte 0,0
0024 0004 .byte 0,4
0026 0E15 .byte 14,21
0028 0404 .byte 4,4
002A 0400
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -