📄 lcd1602四线接口应用范例.lst
字号:
(0140) add++;
016C 91800063 LDS R24,add
016E 5F8F SUBI R24,0xFF
016F 93800063 STS add,R24
0171 9543 INC R20
0172 3042 CPI R20,2
0173 F2C8 BCS 0x014D
(0141) }
(0142) LCD_updata;
0174 2422 CLR R2
0175 92200060 STS new,R2
0177 9622 ADIW R28,2
0178 D3C0 RCALL pop_gset2
0179 9508 RET
_LCD_write_string:
e --> R20
s --> R22
y --> R18
x --> R16
017A D3C8 RCALL push_gset2
017B 816C LDD R22,Y+4
017C 817D LDD R23,Y+5
017D 814E LDD R20,Y+6
(0143) }
(0144) /*-----------------------------------------------------------------------
(0145) LCD_write_string : 英文字符串显示函数
(0146)
(0147) 输入参数:*s :英文字符串指针;
(0148) X、Y : 显示字符串的位置
(0149) e : 把从最后一个字符到x=e之间的内容删除
(0150) 编写日期 :2005/10/18
(0151) -----------------------------------------------------------------------*/
(0152) void LCD_write_string(unsigned char x,unsigned char y, const unsigned char *s,unsigned char e)
(0153) {
(0154) if(y<2)
017E 3022 CPI R18,2
017F F550 BCC 0x01AA
(0155) add=y*16+x;//设置起始座标
0180 E180 LDI R24,0x10
0181 9F82 MUL R24,R18
0182 2C20 MOV R2,R0
0183 0E20 ADD R2,R16
0184 92200063 STS add,R2
0186 C023 RJMP 0x01AA
(0156) while (*s)
(0157) {
(0158) if(lcd_data[add]==*s)//如果LCD上显示的数和
0187 E884 LDI R24,0x84
0188 E090 LDI R25,0
0189 91E00063 LDS R30,add
018B 27FF CLR R31
018C 0FE8 ADD R30,R24
018D 1FF9 ADC R31,R25
018E 8020 LDD R2,Z+0
018F 01FB MOVW R30,R22
0190 91E4 LPM R30,0(Z)
0191 162E CP R2,R30
0192 F409 BNE 0x0194
(0159) {} //待写入的数相同的话
0193 C00F RJMP 0x01A3
(0160) else{data[add]=*s;}//要显示的数据存入显存
0194 E684 LDI R24,0x64
0195 E090 LDI R25,0
0196 91E00063 LDS R30,add
0198 27FF CLR R31
0199 0FE8 ADD R30,R24
019A 1FF9 ADC R31,R25
019B 01DB MOVW R26,R22
019C 93FA ST R31,-Y
019D 93EA ST R30,-Y
019E 01FD MOVW R30,R26
019F 91A4 LPM R26,0(Z)
01A0 91E9 LD R30,Y+
01A1 91F9 LD R31,Y+
01A2 83A0 STD Z+0,R26
(0161) s ++;//指针加1
01A3 5F6F SUBI R22,0xFF
01A4 4F7F SBCI R23,0xFF
(0162) add++;//显存地址加1
01A5 91800063 LDS R24,add
01A7 5F8F SUBI R24,0xFF
01A8 93800063 STS add,R24
01AA 01FB MOVW R30,R22
01AB 91E4 LPM R30,0(Z)
01AC 23EE TST R30
01AD F6C9 BNE 0x0187
(0163) }
(0164) if(y==1)
01AE 3021 CPI R18,1
01AF F481 BNE 0x01C0
(0165) e+=16;
01B0 5F40 SUBI R20,0xF0
(0166) for(;e>=add;add++)
01B1 C00E RJMP 0x01C0
(0167) {data[add]=' ';}
01B2 E684 LDI R24,0x64
01B3 E090 LDI R25,0
01B4 91E00063 LDS R30,add
01B6 27FF CLR R31
01B7 0FE8 ADD R30,R24
01B8 1FF9 ADC R31,R25
01B9 E280 LDI R24,0x20
01BA 8380 STD Z+0,R24
01BB 91800063 LDS R24,add
01BD 5F8F SUBI R24,0xFF
01BE 93800063 STS add,R24
01C0 90200063 LDS R2,add
01C2 1542 CP R20,R2
01C3 F770 BCC 0x01B2
(0168) LCD_updata;
01C4 2422 CLR R2
01C5 92200060 STS new,R2
01C7 D371 RCALL pop_gset2
01C8 9508 RET
_LCD_write_number:
c --> R10
b --> R12
lcd --> Y+0
i --> R14
e --> R6
s --> R8
dat --> Y+24
d --> Y+22
y --> Y+20
x --> R14
01C9 933A ST R19,-Y
01CA 932A ST R18,-Y
01CB D371 RCALL push_gset5
01CC 2EE0 MOV R14,R16
01CD 972A SBIW R28,0xA
01CE 8C8C LDD R8,Y+28
01CF 8C9D LDD R9,Y+29
01D0 8C6E LDD R6,Y+30
(0169) }
(0170) /*-----------------------------------------------------------------------
(0171) LCD_write_number : 数字显示函数
(0172)
(0173) 输入参数:
(0174) X、Y : 显示字符串的位置
(0175) d :在第d位插入小数点
(0176) data :要显示的数据 长整形
(0177) *s :数据的单位
(0178) e : 把从最后一个字符到x=e之间的内容删除
(0179) 编写日期 :2005/10/18
(0180) -----------------------------------------------------------------------*/
(0181) void LCD_write_number(unsigned char x,unsigned char y,unsigned char d,unsigned long dat,const unsigned char *s,unsigned char e)
(0182) {
(0183) unsigned char i;
(0184) unsigned char b=0;
01D1 24CC CLR R12
(0185) unsigned char c='.';
01D2 E28E LDI R24,0x2E
01D3 2EA8 MOV R10,R24
(0186) unsigned char lcd[10]={0};
01D4 E288 LDI R24,0x28
01D5 E090 LDI R25,0
01D6 01FE MOVW R30,R28
01D7 E00A LDI R16,0xA
01D8 E010 LDI R17,0
01D9 93FA ST R31,-Y
01DA 93EA ST R30,-Y
01DB 939A ST R25,-Y
01DC 938A ST R24,-Y
01DD D37E RCALL asgncblk
(0187) if(y<2)//如果Y>1则不重新计算地址
01DE 898C LDD R24,Y+20
01DF 3082 CPI R24,2
01E0 F438 BCC 0x01E8
(0188) add=y*16+x;//设置起始座标
01E1 E180 LDI R24,0x10
01E2 880C LDD R0,Y+20
01E3 9D80 MUL R24,R0
01E4 2C20 MOV R2,R0
01E5 0C2E ADD R2,R14
01E6 92200063 STS add,R2
(0189)
(0190) for (i=10;i>0;i--)
01E8 E08A LDI R24,0xA
01E9 2EE8 MOV R14,R24
01EA C036 RJMP 0x0221
(0191) {
(0192) lcd[i]=dat%10+48;
01EB E04A LDI R20,0xA
01EC E050 LDI R21,0
01ED E060 LDI R22,0
01EE E070 LDI R23,0
01EF 01FE MOVW R30,R28
01F0 8C20 LDD R2,Z+24
01F1 8C31 LDD R3,Z+25
01F2 8C42 LDD R4,Z+26
01F3 8C53 LDD R5,Z+27
01F4 937A ST R23,-Y
01F5 936A ST R22,-Y
01F6 935A ST R21,-Y
01F7 934A ST R20,-Y
01F8 0181 MOVW R16,R2
01F9 0192 MOVW R18,R4
01FA D2B7 RCALL mod32u
01FB 0118 MOVW R2,R16
01FC 0129 MOVW R4,R18
01FD E340 LDI R20,0x30
01FE E050 LDI R21,0
01FF E060 LDI R22,0
0200 E070 LDI R23,0
0201 0E24 ADD R2,R20
0202 1E35 ADC R3,R21
0203 1E46 ADC R4,R22
0204 1E57 ADC R5,R23
0205 01CE MOVW R24,R28
0206 2DEE MOV R30,R14
0207 27FF CLR R31
0208 0FE8 ADD R30,R24
0209 1FF9 ADC R31,R25
020A 8220 STD Z+0,R2
(0193) dat=dat/10;
020B E04A LDI R20,0xA
020C E050 LDI R21,0
020D E060 LDI R22,0
020E E070 LDI R23,0
020F 01FE MOVW R30,R28
0210 8C20 LDD R2,Z+24
0211 8C31 LDD R3,Z+25
0212 8C42 LDD R4,Z+26
0213 8C53 LDD R5,Z+27
0214 937A ST R23,-Y
0215 936A ST R22,-Y
0216 935A ST R21,-Y
0217 934A ST R20,-Y
0218 0181 MOVW R16,R2
0219 0192 MOVW R18,R4
021A D295 RCALL div32u
021B 01FE MOVW R30,R28
021C 8F00 STD Z+24,R16
021D 8F11 STD Z+25,R17
021E 8F22 STD Z+26,R18
021F 8F33 STD Z+27,R19
0220 94EA DEC R14
0221 2422 CLR R2
0222 142E CP R2,R14
0223 F408 BCC 0x0225
0224 CFC6 RJMP 0x01EB
(0194) }
(0195)
(0196) for(i=1;i<11;i++)
0225 24EE CLR R14
0226 94E3 INC R14
0227 C079 RJMP 0x02A1
(0197) {
(0198) if(i==11-d)
0228 E08B LDI R24,0xB
0229 880E LDD R0,Y+22
022A 1980 SUB R24,R0
022B 16E8 CP R14,R24
022C F4C1 BNE 0x0245
(0199) {
(0200) if(lcd_data[add]==c)
022D E884 LDI R24,0x84
022E E090 LDI R25,0
022F 91E00063 LDS R30,add
0231 27FF CLR R31
0232 0FE8 ADD R30,R24
0233 1FF9 ADC R31,R25
0234 8020 LDD R2,Z+0
0235 142A CP R2,R10
0236 F409 BNE 0x0238
(0201) {}
0237 C008 RJMP 0x0240
(0202) else
(0203) {data[add]=c;}
0238 E684 LDI R24,0x64
0239 E090 LDI R25,0
023A 91E00063 LDS R30,add
023C 27FF CLR R31
023D 0FE8 ADD R30,R24
023E 1FF9 ADC R31,R25
023F 82A0 STD Z+0,R10
(0204) add++;
0240 91800063 LDS R24,add
0242 5F8F SUBI R24,0xFF
0243 93800063 STS add,R24
(0205) }
(0206) if((lcd[i]-48+b)==0)
0245 01CE MOVW R24,R28
0246 2DEE MOV R30,R14
0247 27FF CLR R31
0248 0FE8 ADD R30,R24
0249 1FF9 ADC R31,R25
024A 8180 LDD R24,Z+0
024B 5380 SUBI R24,0x30
024C 0D8C ADD R24,R12
024D F009 BEQ 0x024F
024E C02B RJMP 0x027A
(0207) {
(0208) if(i>=(10-d))
024F E08A LDI R24,0xA
0250 880E LDD R0,Y+22
0251 1980 SUB R24,R0
0252 16E8 CP R14,R24
0253 F408 BCC 0x0255
0254 C04B RJMP 0x02A0
(0209) {
(0210) if(lcd_data[add]==lcd[i])
0255 01CE MOVW R24,R28
0256 2DEE MOV R30,R14
0257 27FF CLR R31
0258 0FE8 ADD R30,R24
0259 1FF9 ADC R31,R25
025A 8020 LDD R2,Z+0
025B E884 LDI R24,0x84
025C E090 LDI R25,0
025D 91E00063 LDS R30,add
025F 27FF CLR R31
0260 0FE8 ADD R30,R24
0261 1FF9 ADC R31,R25
0262 8030 LDD R3,Z+0
0263 1432 CP R3,R2
0264 F409 BNE 0x0266
(0211) {}
0265 C00E RJMP 0x0274
(0212) else
(0213) {data[add]=lcd[i];}
0266 01CE MOVW R24,R28
0267 2DEE MOV R30,R14
0268 27FF CLR R31
0269 0FE8 ADD R30,R24
026A 1FF9 ADC R31,R25
026B 8020 LDD R2,Z+0
026C E684 LDI R24,0x64
026D E090 LDI R25,0
026E 91E00063 LDS R30,add
0270 27FF CLR R31
0271 0FE8 ADD R30,R24
0272 1FF9 ADC R31,R25
0273 8220 STD Z+0,R2
(0214) add++;
0274 91800063 LDS R24,add
0276 5F8F SUBI R24,0xFF
0277 93800063 STS add,R24
(0215) }
(0216) else
(0217) {}
(0218) }
0279 C026 RJMP 0x02A0
(0219) else
(0220) {
(0221) if(lcd_data[add]==lcd[i])
027A 01CE MOVW R24,R28
027B 2DEE MOV R30,R14
027C 27FF CLR R31
027D 0FE8 ADD R30,R24
027E 1FF9 ADC R31,R25
027F 8020 LDD R2,Z+0
0280 E884 LDI R24,0x84
0281 E090 LDI R25,0
0282 91E00063 LDS R30,add
0284 27FF CLR R31
0285 0FE8 ADD R30,R24
0286 1FF9 ADC R31,R25
0287 8030 LDD R3,Z+0
0288 1432 CP R3,R2
0289 F409 BNE 0x028B
(0222) {}
028A C00E RJMP 0x0299
(0223) else
(0224) {data[add]=lcd[i];}
028B 01CE MOVW R24,R28
028C 2DEE MOV R30,R14
028D 27FF CLR R31
028E 0FE8 ADD R30,R24
028F 1FF9 ADC R31,R25
0290 8020 LDD R2,Z+0
0291 E684 LDI R24,0x64
0292 E090 LDI R25,0
0293 91E00063 LDS R30,add
0295 27FF CLR R31
0296 0FE8 ADD R30,R24
0297 1FF9 ADC R31,R25
0298 8220 STD Z+0,R2
(0225) add++;
0299 91800063 LDS R24,add
029B 5F8F SUBI R24,0xFF
029C 93800063 STS add,R24
(0226) b=1;
029E 24CC CLR R12
029F 94C3 INC R12
02A0 94E3 INC R14
02A1 2D8E MOV R24,R14
02A2 308B CPI R24,0xB
02A3 F408 BCC 0x02A5
02A4 CF83 RJMP 0x0228
02A5 C024 RJMP 0x02CA
(0227) }
(0228) }
(0229) while (*s)
(0230) {
(0231) if(lcd_data[add]==*s)//如果LCD上显示的数和
02A6 E884 LDI R24,0x84
02A7 E090 LDI R25,0
02A8 91E00063 LDS R30,add
02AA 27FF CLR R31
02AB 0FE8 ADD R30,R24
02AC 1FF9 ADC R31,R25
02AD 8020 LDD R2,Z+0
02AE 01F4 MOVW R30,R8
02AF 91E4 LPM R30,0(Z)
02B0 162E CP R2,R30
02B1 F409 BNE 0x02B3
(0232) {} //待写入的数相同的话
02B2 C00F RJMP 0x02C2
(0233) else{data[add]=*s;}//要显示的数据存入显存
02B3 E684 LDI R24,0x64
02B4 E090 LDI R25,0
02B5 91E00063 LDS R30,add
02B7 27FF CLR R31
02B8 0FE8 ADD R30,R24
02B9 1FF9 ADC R31,R25
02BA 01D4 MOVW R26,R8
02BB 93FA ST R31,-Y
02BC 93EA ST R30,-Y
02BD 01FD MOVW R30,R26
02BE 91A4 LPM R26,0(Z)
02BF 91E9 LD R30,Y+
02C0 91F9 LD R31,Y+
02C1 83A0 STD Z+0,R26
(0234) s ++;//指针加1
02C2 01C4 MOVW R24,R8
02C3 9601 ADIW R24,1
02C4 014C MOVW R8,R24
(0235) add++;//显存地址加1
02C5 91800063 LDS R24,add
02C7 5F8F SUBI R24,0xFF
02C8 93800063 STS add,R24
02CA 01F4 MOVW R30,R8
02CB 91E4 LPM R30,0(Z)
02CC 23EE TST R30
02CD F6C1 BNE 0x02A6
(0236) }
(0237) if(y==1)
02CE 898C LDD R24,Y+20
02CF 3081 CPI R24,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -