📄 lcd1602.lis
字号:
00B4 7070 andi R23,0
00B6 .dbline 103
00B6 ; if(x) //第二行
00B6 6030 cpi R22,0
00B8 6707 cpc R22,R23
00BA 09F0 breq L20
00BC X2:
00BC .dbline 104
00BC ; tmp|=0x40;
00BC 4064 ori R20,64
00BE L20:
00BE .dbline 105
00BE ; tmp|=0x80;
00BE 4068 ori R20,128
00C0 .dbline 106
00C0 ; lcd_write_cmd(tmp,0);
00C0 2227 clr R18
00C2 042F mov R16,R20
00C4 D8DF xcall _lcd_write_cmd
00C6 .dbline -2
00C6 L19:
00C6 0E940000 xcall pop_gset2
00CA .dbline 0 ; func end
00CA 0895 ret
00CC .dbsym r tmp 20 I
00CC .dbsym r y 20 I
00CC .dbsym r x 22 I
00CC .dbend
00CC .dbfunc e lcd_write_byte _lcd_write_byte fV
00CC ; byte -> R20
.even
00CC _lcd_write_byte::
00CC 0E940000 xcall push_gset1
00D0 402F mov R20,R16
00D2 .dbline -1
00D2 .dbline 110
00D2 ; }
00D2 ;
00D2 ; void lcd_write_byte(char byte) //写字节
00D2 ; {
00D2 .dbline 111
00D2 ; lcd_wait_enable();
00D2 B7DF xcall _lcd_wait_enable
00D4 .dbline 112
00D4 ; set_rs();
00D4 AB9A sbi 0x15,3
00D6 .dbline 113
00D6 ; clr_rw();
00D6 AC98 cbi 0x15,4
00D8 .dbline 114
00D8 ; delay_nus(1);
00D8 01E0 ldi R16,1
00DA 10E0 ldi R17,0
00DC 92DF xcall _delay_nus
00DE .dbline 115
00DE ; Data_PORT=byte;
00DE 4BBB out 0x1b,R20
00E0 .dbline 116
00E0 ; set_en();
00E0 AD9A sbi 0x15,5
00E2 .dbline 117
00E2 ; delay_nus(2);
00E2 02E0 ldi R16,2
00E4 10E0 ldi R17,0
00E6 8DDF xcall _delay_nus
00E8 .dbline 118
00E8 ; clr_en();
00E8 AD98 cbi 0x15,5
00EA .dbline -2
00EA L22:
00EA 0E940000 xcall pop_gset1
00EE .dbline 0 ; func end
00EE 0895 ret
00F0 .dbsym r byte 20 c
00F0 .dbend
00F0 .dbfunc e lcd_disp_char _lcd_disp_char fV
00F0 ; ch -> y+4
00F0 ; y -> R22,R23
00F0 ; x -> R20,R21
.even
00F0 _lcd_disp_char::
00F0 0E940000 xcall push_gset2
00F4 B901 movw R22,R18
00F6 A801 movw R20,R16
00F8 .dbline -1
00F8 .dbline 122
00F8 ; }
00F8 ;
00F8 ; void lcd_disp_char(int x,int y,char ch) //写字串
00F8 ; {
00F8 .dbline 123
00F8 ; lcd_set_xy(x,y);
00F8 9B01 movw R18,R22
00FA 8A01 movw R16,R20
00FC D4DF xcall _lcd_set_xy
00FE .dbline 124
00FE ; lcd_write_byte(ch);
00FE 0C81 ldd R16,y+4
0100 E5DF xcall _lcd_write_byte
0102 .dbline -2
0102 L23:
0102 0E940000 xcall pop_gset2
0106 .dbline 0 ; func end
0106 0895 ret
0108 .dbsym l ch 4 c
0108 .dbsym r y 22 I
0108 .dbsym r x 20 I
0108 .dbend
0108 .dbfunc e lcd_disp_string _lcd_disp_string fV
0108 ; i -> R20
0108 ; s -> R22,R23
0108 ; y -> R10,R11
0108 ; x -> R12,R13
.even
0108 _lcd_disp_string::
0108 0E940000 xcall push_gset4
010C 5901 movw R10,R18
010E 6801 movw R12,R16
0110 2197 sbiw R28,1
0112 6985 ldd R22,y+9
0114 7A85 ldd R23,y+10
0116 .dbline -1
0116 .dbline 128
0116 ; }
0116 ;
0116 ; void lcd_disp_string(int x,int y,char *s) //写字串,支持换行
0116 ; {
0116 .dbline 129
0116 ; unsigned char i=0;
0116 4427 clr R20
0118 2DC0 xjmp L26
011A L25:
011A .dbline 131
011A ; while (*s)
011A ; {
011A .dbline 132
011A ; if(y+i<16)
011A 242E mov R2,R20
011C 3324 clr R3
011E C501 movw R24,R10
0120 820D add R24,R2
0122 931D adc R25,R3
0124 8031 cpi R24,16
0126 E0E0 ldi R30,0
0128 9E07 cpc R25,R30
012A 74F4 brge L28
012C .dbline 133
012C ; {
012C .dbline 134
012C ; lcd_disp_char(x,y+i,*s);
012C FB01 movw R30,R22
012E 2080 ldd R2,z+0
0130 2882 std y+0,R2
0132 242E mov R2,R20
0134 3324 clr R3
0136 9501 movw R18,R10
0138 220D add R18,R2
013A 331D adc R19,R3
013C 8601 movw R16,R12
013E D8DF xcall _lcd_disp_char
0140 .dbline 135
0140 ; s++;
0140 6F5F subi R22,255 ; offset = 1
0142 7F4F sbci R23,255
0144 .dbline 136
0144 ; i++;
0144 4395 inc R20
0146 .dbline 137
0146 ; }
0146 16C0 xjmp L29
0148 L28:
0148 .dbline 139
0148 ; else
0148 ; {
0148 .dbline 140
0148 ; delay_nus(50); //换行至少延时20us,否则会造成显示不正常
0148 02E3 ldi R16,50
014A 10E0 ldi R17,0
014C 5ADF xcall _delay_nus
014E .dbline 141
014E ; lcd_disp_char(x^1,y+i-16,*s);
014E FB01 movw R30,R22
0150 2080 ldd R2,z+0
0152 2882 std y+0,R2
0154 242E mov R2,R20
0156 3324 clr R3
0158 9501 movw R18,R10
015A 220D add R18,R2
015C 331D adc R19,R3
015E 2051 subi R18,16
0160 3040 sbci R19,0
0162 81E0 ldi R24,1
0164 90E0 ldi R25,0
0166 8601 movw R16,R12
0168 0827 eor R16,R24
016A 1927 eor R17,R25
016C C1DF xcall _lcd_disp_char
016E .dbline 142
016E ; s++;
016E 6F5F subi R22,255 ; offset = 1
0170 7F4F sbci R23,255
0172 .dbline 143
0172 ; i++;
0172 4395 inc R20
0174 .dbline 144
0174 ; }
0174 L29:
0174 .dbline 145
0174 L26:
0174 .dbline 130
0174 FB01 movw R30,R22
0176 2080 ldd R2,z+0
0178 2220 tst R2
017A 09F0 breq X3
017C CECF xjmp L25
017E X3:
017E .dbline -2
017E L24:
017E 2196 adiw R28,1
0180 0E940000 xcall pop_gset4
0184 .dbline 0 ; func end
0184 0895 ret
0186 .dbsym r i 20 c
0186 .dbsym r s 22 pc
0186 .dbsym r y 10 I
0186 .dbsym r x 12 I
0186 .dbend
0186 .dbfunc e lcd_init _lcd_init fV
.even
0186 _lcd_init::
0186 .dbline -1
0186 .dbline 149
0186 ; }
0186 ; }
0186 ;
0186 ; void lcd_init(void) //初始化液晶
0186 ; {
0186 .dbline 150
0186 ; Open_Ctrl();
0186 88EB ldi R24,184
0188 84BB out 0x14,R24
018A .dbline 151
018A ; Data_out();
018A 8FEF ldi R24,255
018C 8ABB out 0x1a,R24
018E .dbline 152
018E ; lcd_write_cmd(0x38,0); //显示模式设置(不测试忙信号)共三次
018E 2227 clr R18
0190 08E3 ldi R16,56
0192 71DF xcall _lcd_write_cmd
0194 .dbline 153
0194 ; delay_nms(5);
0194 05E0 ldi R16,5
0196 10E0 ldi R17,0
0198 44DF xcall _delay_nms
019A .dbline 154
019A ; lcd_write_cmd(0x38,0);
019A 2227 clr R18
019C 08E3 ldi R16,56
019E 6BDF xcall _lcd_write_cmd
01A0 .dbline 155
01A0 ; delay_nms(5);
01A0 05E0 ldi R16,5
01A2 10E0 ldi R17,0
01A4 3EDF xcall _delay_nms
01A6 .dbline 156
01A6 ; lcd_write_cmd(0x38,0);
01A6 2227 clr R18
01A8 08E3 ldi R16,56
01AA 65DF xcall _lcd_write_cmd
01AC .dbline 157
01AC ; delay_nms(5);
01AC 05E0 ldi R16,5
01AE 10E0 ldi R17,0
01B0 38DF xcall _delay_nms
01B2 .dbline 159
01B2 ;
01B2 ; lcd_write_cmd(0x38,1); //8位数据口,2行显示,5*7点阵
01B2 21E0 ldi R18,1
01B4 08E3 ldi R16,56
01B6 5FDF xcall _lcd_write_cmd
01B8 .dbline 160
01B8 ; lcd_write_cmd(0x08,1); //显示关
01B8 21E0 ldi R18,1
01BA 08E0 ldi R16,8
01BC 5CDF xcall _lcd_write_cmd
01BE .dbline 161
01BE ; lcd_write_cmd(0x01,1); //清屏
01BE 21E0 ldi R18,1
01C0 01E0 ldi R16,1
01C2 59DF xcall _lcd_write_cmd
01C4 .dbline 162
01C4 ; lcd_write_cmd(0x06,1); //数据读,写后AC自增1,画面不动
01C4 21E0 ldi R18,1
01C6 06E0 ldi R16,6
01C8 56DF xcall _lcd_write_cmd
01CA .dbline 163
01CA ; lcd_write_cmd(0x0C,1); //显示开
01CA 21E0 ldi R18,1
01CC 0CE0 ldi R16,12
01CE 53DF xcall _lcd_write_cmd
01D0 .dbline -2
01D0 L30:
01D0 .dbline 0 ; func end
01D0 0895 ret
01D2 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -