📄 lcd1602四线接口应用范例.lst
字号:
02D0 F491 BNE 0x02E3
(0238) e+=16;
02D1 2D86 MOV R24,R6
02D2 5F80 SUBI R24,0xF0
02D3 2E68 MOV R6,R24
(0239) for(;e>=add;add++)
02D4 C00E RJMP 0x02E3
(0240) {data[add]=' ';}
02D5 E684 LDI R24,0x64
02D6 E090 LDI R25,0
02D7 91E00063 LDS R30,add
02D9 27FF CLR R31
02DA 0FE8 ADD R30,R24
02DB 1FF9 ADC R31,R25
02DC E280 LDI R24,0x20
02DD 8380 STD Z+0,R24
02DE 91800063 LDS R24,add
02E0 5F8F SUBI R24,0xFF
02E1 93800063 STS add,R24
02E3 90200063 LDS R2,add
02E5 1462 CP R6,R2
02E6 F770 BCC 0x02D5
(0241) LCD_updata;
02E7 2422 CLR R2
02E8 92200060 STS new,R2
02EA 962A ADIW R28,0xA
02EB D24F RCALL pop_gset5
02EC 9622 ADIW R28,2
02ED 9508 RET
_LCD_write_time:
lcd --> Y+0
i --> R20
s --> Y+16
m --> Y+14
h --> Y+12
y --> R22
x --> R20
02EE D254 RCALL push_gset2
02EF 2F62 MOV R22,R18
02F0 2F40 MOV R20,R16
02F1 9728 SBIW R28,0x8
(0242) }
(0243) /*-----------------------------------------------------------------------
(0244) LCD_write_time : 数字显示函数
(0245)
(0246) 输入参数:
(0247) X、Y : 显示数据的起始的位置
(0248) h,m,s :时,分,秒
(0249) 编写日期 :2005-10-19
(0250) -----------------------------------------------------------------------*/
(0251) void LCD_write_time(unsigned char x,unsigned char y,unsigned char h,unsigned char m,unsigned char s)
(0252) {
(0253) unsigned char i;
(0254) unsigned char lcd[8]={0};
02F2 E382 LDI R24,0x32
02F3 E090 LDI R25,0
02F4 01FE MOVW R30,R28
02F5 E008 LDI R16,0x8
02F6 E010 LDI R17,0
02F7 93FA ST R31,-Y
02F8 93EA ST R30,-Y
02F9 939A ST R25,-Y
02FA 938A ST R24,-Y
02FB D260 RCALL asgncblk
(0255) if(y<2)
02FC 3062 CPI R22,2
02FD F430 BCC 0x0304
(0256) add=y*16+x;//设置起始座标LCD_set_xy( X, Y );
02FE E180 LDI R24,0x10
02FF 9F86 MUL R24,R22
0300 2C20 MOV R2,R0
0301 0E24 ADD R2,R20
0302 92200063 STS add,R2
(0257) lcd[0]=h/10+48;
0304 E01A LDI R17,0xA
0305 850C LDD R16,Y+12
0306 D21C RCALL div8u
0307 2F80 MOV R24,R16
0308 5D80 SUBI R24,0xD0
0309 8388 STD Y+0,R24
(0258) lcd[1]=h%10+48;
030A E01A LDI R17,0xA
030B 850C LDD R16,Y+12
030C D214 RCALL mod8u
030D 2F80 MOV R24,R16
030E 5D80 SUBI R24,0xD0
030F 8389 STD Y+1,R24
(0259) lcd[2]=':';
0310 E38A LDI R24,0x3A
0311 838A STD Y+2,R24
(0260) lcd[3]=m/10+48;
0312 E01A LDI R17,0xA
0313 850E LDD R16,Y+14
0314 D20E RCALL div8u
0315 2F80 MOV R24,R16
0316 5D80 SUBI R24,0xD0
0317 838B STD Y+3,R24
(0261) lcd[4]=m%10+48;
0318 E01A LDI R17,0xA
0319 850E LDD R16,Y+14
031A D206 RCALL mod8u
031B 2F80 MOV R24,R16
031C 5D80 SUBI R24,0xD0
031D 838C STD Y+4,R24
(0262) lcd[5]=':';
031E E38A LDI R24,0x3A
031F 838D STD Y+5,R24
(0263) lcd[6]=s/10+48;
0320 E01A LDI R17,0xA
0321 8908 LDD R16,Y+16
0322 D200 RCALL div8u
0323 2F80 MOV R24,R16
0324 5D80 SUBI R24,0xD0
0325 838E STD Y+6,R24
(0264) lcd[7]=s%10+48;
0326 E01A LDI R17,0xA
0327 8908 LDD R16,Y+16
0328 D1F8 RCALL mod8u
0329 2F80 MOV R24,R16
032A 5D80 SUBI R24,0xD0
032B 838F STD Y+7,R24
(0265) /*时和分之间的:的闪动效果
(0266) if(lcd[7]%2)
(0267) lcd[2]=':';
(0268) else
(0269) lcd[2]=' ';*/
(0270) for (i=0;i<8;i++)
032C 2744 CLR R20
032D C025 RJMP 0x0353
(0271) {
(0272) if(lcd_data[add]==lcd[i])
032E 01CE MOVW R24,R28
032F 2FE4 MOV R30,R20
0330 27FF CLR R31
0331 0FE8 ADD R30,R24
0332 1FF9 ADC R31,R25
0333 8020 LDD R2,Z+0
0334 E884 LDI R24,0x84
0335 E090 LDI R25,0
0336 91E00063 LDS R30,add
0338 27FF CLR R31
0339 0FE8 ADD R30,R24
033A 1FF9 ADC R31,R25
033B 8030 LDD R3,Z+0
033C 1432 CP R3,R2
033D F409 BNE 0x033F
(0273) {}
033E C00E RJMP 0x034D
(0274) else
(0275) {data[add]=lcd[i];}
033F 01CE MOVW R24,R28
0340 2FE4 MOV R30,R20
0341 27FF CLR R31
0342 0FE8 ADD R30,R24
0343 1FF9 ADC R31,R25
0344 8020 LDD R2,Z+0
0345 E684 LDI R24,0x64
0346 E090 LDI R25,0
0347 91E00063 LDS R30,add
0349 27FF CLR R31
034A 0FE8 ADD R30,R24
034B 1FF9 ADC R31,R25
034C 8220 STD Z+0,R2
(0276) add++;
034D 91800063 LDS R24,add
034F 5F8F SUBI R24,0xFF
0350 93800063 STS add,R24
0352 9543 INC R20
0353 3048 CPI R20,0x8
0354 F2C8 BCS 0x032E
(0277) }
(0278) LCD_updata;
0355 2422 CLR R2
0356 92200060 STS new,R2
0358 9628 ADIW R28,0x8
0359 D1DF RCALL pop_gset2
035A 9508 RET
_LCD_write_new:
address --> R20
new_add --> R22
035B D1E7 RCALL push_gset2
(0279) }
(0280) /*----------------------------------------------------
(0281) LCD_write_new:写显存函数
(0282) data[]:32字节的显存
(0283) new:显存标号
(0284) 编写日期:2005/10/18
(0285) -----------------------------------------------------*/
(0286) void LCD_write_new(void)
(0287) {
(0288) unsigned char address;
(0289) unsigned char new_add=1;//1表示要更新地址
035C E061 LDI R22,1
035D C04F RJMP 0x03AD
(0290) while(new<32)//显存共32个字节,标号从0--31
(0291) {
(0292) if(new==16)//换行
035E 91800060 LDS R24,new
0360 3180 CPI R24,0x10
0361 F409 BNE 0x0363
(0293) new_add=1;
0362 E061 LDI R22,1
(0294) if(data[new])//跳过为0的显存
0363 E684 LDI R24,0x64
0364 E090 LDI R25,0
0365 91E00060 LDS R30,new
0367 27FF CLR R31
0368 0FE8 ADD R30,R24
0369 1FF9 ADC R31,R25
036A 8020 LDD R2,Z+0
036B 2022 TST R2
036C F409 BNE 0x036E
036D C039 RJMP 0x03A7
(0295) {
(0296) if(new_add)//当new_add=0时表示无需更新地址
036E 2366 TST R22
036F F081 BEQ 0x0380
(0297) {
(0298) if(new>15)
0370 E08F LDI R24,0xF
0371 90200060 LDS R2,new
0373 1582 CP R24,R2
0374 F418 BCC 0x0378
(0299) address=0xb0+new;
0375 2D42 MOV R20,R2
0376 5540 SUBI R20,0x50
0377 C003 RJMP 0x037B
(0300) else
(0301) address=0x80+new;
0378 91400060 LDS R20,new
037A 5840 SUBI R20,0x80
(0302) LCD_write_char(0,address);//设置起始地址
037B 2F24 MOV R18,R20
037C 2733 CLR R19
037D 2700 CLR R16
037E 2711 CLR R17
037F DD22 RCALL _LCD_write_char
(0303) }
(0304) LCD_write_char(1,data[new]);//写数据
0380 E684 LDI R24,0x64
0381 E090 LDI R25,0
0382 91E00060 LDS R30,new
0384 27FF CLR R31
0385 0FE8 ADD R30,R24
0386 1FF9 ADC R31,R25
0387 8120 LDD R18,Z+0
0388 2733 CLR R19
0389 E001 LDI R16,1
038A E010 LDI R17,0
038B DD16 RCALL _LCD_write_char
(0305) lcd_data[new]=data[new];
038C E684 LDI R24,0x64
038D E090 LDI R25,0
038E 91E00060 LDS R30,new
0390 27FF CLR R31
0391 0FE8 ADD R30,R24
0392 1FF9 ADC R31,R25
0393 8020 LDD R2,Z+0
0394 E884 LDI R24,0x84
0395 E090 LDI R25,0
0396 91E00060 LDS R30,new
0398 27FF CLR R31
0399 0FE8 ADD R30,R24
039A 1FF9 ADC R31,R25
039B 8220 STD Z+0,R2
(0306) data[new]=0;//写完数据后,显存清0
039C E684 LDI R24,0x64
039D E090 LDI R25,0
039E 91E00060 LDS R30,new
03A0 27FF CLR R31
03A1 0FE8 ADD R30,R24
03A2 1FF9 ADC R31,R25
03A3 2422 CLR R2
03A4 8220 STD Z+0,R2
(0307) new_add=0;
03A5 2766 CLR R22
(0308) }
03A6 C001 RJMP 0x03A8
(0309) else
(0310) new_add=1;
03A7 E061 LDI R22,1
(0311) new++;//
03A8 91800060 LDS R24,new
03AA 5F8F SUBI R24,0xFF
03AB 93800060 STS new,R24
03AD 91800060 LDS R24,new
03AF 3280 CPI R24,0x20
03B0 F408 BCC 0x03B2
03B1 CFAC RJMP 0x035E
03B2 D186 RCALL pop_gset2
03B3 9508 RET
_LCD_write_CGRAM:
n --> R20
y --> R18
x --> R16
03B4 D190 RCALL push_gset1
03B5 814A LDD R20,Y+2
(0312) }
(0313) }
(0314) /*----------------------------------------------------
(0315) LCD_write_CGRAM:写CGRAM的函数
(0316) 输入参数:
(0317) X、Y : 显示数据的起始的位置
(0318) n : 存入LCD的图案的编号
(0319) 编写日期:2005/10/18
(0320) -----------------------------------------------------*/
(0321) void LCD_write_CGRAM(unsigned char x,unsigned char y,unsigned char n)
(0322) {
(0323) if(y<2)
03B6 3022 CPI R18,2
03B7 F430 BCC 0x03BE
(0324) add=y*16+x;//设置起始座标
03B8 E180 LDI R24,0x10
03B9 9F82 MUL R24,R18
03BA 2C20 MOV R2,R0
03BB 0E20 ADD R2,R16
03BC 92200063 STS add,R2
(0325) if(n==0)//0表示空数据
03BE 2344 TST R20
03BF F409 BNE 0x03C1
(0326) n+=8;//所以要加上8 (0>8/1>9/2>10...7>15)
03C0 5F48 SUBI R20,0xF8
(0327) data[add]=n;
03C1 E684 LDI R24,0x64
03C2 E090 LDI R25,0
03C3 91E00063 LDS R30,add
03C5 27FF CLR R31
03C6 0FE8 ADD R30,R24
03C7 1FF9 ADC R31,R25
03C8 8340 STD Z+0,R20
(0328) LCD_updata;
03C9 2422 CLR R2
03CA 92200060 STS new,R2
03CC D17B RCALL pop_gset1
03CD 9508 RET
_LCD_init_CGRAM:
ads --> R20
CGRAM --> Y+0
y --> R20
x --> R22
03CE D174 RCALL push_gset2
03CF 97EF SBIW R28,0x3F
03D0 9721 SBIW R28,1
(0329) }
(0330) /*----------------------------------------------------
(0331) LCD_init_CGRAM:初始化CGRAM的函数
(0332)
(0333) 编写日期:2005/10/18
(0334) -----------------------------------------------------*/
(0335) void LCD_init_CGRAM(void)
(0336) {
(0337) unsigned char CGRAM[8][8]=//CGRAM图案的定义
(0338) { //1 2 3 4 5 6 7 x
03D1 E38A LDI R24,0x3A
03D2 E090 LDI R25,0
03D3 01FE MOVW R30,R28
03D4 E400 LDI R16,0x40
03D5 E010 LDI R17,0
03D6 93FA ST R31,-Y
03D7 93EA ST R30,-Y
03D8 939A ST R25,-Y
03D9 938A ST R24,-Y
03DA D181 RCALL asgncblk
(0339) {0x3F,0x01,0x01,0x01,0x01,0x01,0x3F,0x00},//0
(0340) {0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00},//1
(0341) {0x00,0x04,0x0E,0x15,0x04,0x04,0x04,0x00},//2
(0342) {0x00,0x1F,0x15,0x0E,0x04,0x04,0x04,0x00},//3
(0343) {0x00,0x1F,0x15,0x0A,0x04,0x04,0x04,0x00},//4
(0344) {0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x00},//5
(0345) {0x08,0x0C,0x0A,0x09,0x0A,0x0C,0x08,0x00},//6
(0346) {0x08,0x0C,0x0E,0x0F,0x0E,0x0C,0x08,0x00},//7
(0347) };
(0348) unsigned char ads=0x40;
03DB E440 LDI R20,0x40
(0349) unsigned char x,y;
(0350)
(0351) LCD_write_char(0,ads);//写地址
03DC 2F24 MOV R18,R20
03DD 2733 CLR R19
03DE 2700 CLR R16
03DF 2711 CLR R17
03E0 DCC1 RCALL _LCD_write_char
(0352) for(y=0;y<8;y++)
03E1 2744 CLR R20
03E2 C015 RJMP 0x03F8
(0353) {
(0354) for(x=0;x<8;x++)
03E3 2766 CLR R22
03E4 C010 RJMP 0x03F5
(0355) {
(0356) LCD_write_char(1,CGRAM[y][x]);
03E5 E088 LDI R24,0x8
03E6 9F84 MUL R24,R20
03E7 0110 MOVW R2,R0
03E8 01CE MOVW R24,R28
03E9 0E28 ADD R2,R24
03EA 1E39 ADC R3,R25
03EB 2FE6 MOV R30,R22
03EC 27FF CLR R31
03ED 0DE2 ADD R30,R2
03EE 1DF3 ADC R31,R3
03EF 8120 LDD R18,Z+0
03F0 2733 CLR R19
03F1 E001 LDI R16,1
03F2 E010 LDI R17,0
03F3 DCAE RCALL _LCD_write_char
03F4 9563 INC R22
03F5 3068 CPI R22,0x8
03F6 F370 BCS 0x03E5
03F7 9543 INC R20
03F8 3048 CPI R20,0x8
03F9 F348 BCS 0x03E3
03FA 96EF ADIW R28,0x3F
03FB 9621 ADIW R28,1
03FC D13C RCALL pop_gset2
03FD 9508 RET
_main:
03FE 9729 SBIW R28,0x9
FILE: E:\刻录的\电子技术\项目\驱动程序\LCD1602四线接口应用范例\main.c
(0001) //项目名称:LCD1602四线接口应用范例
(0002) //功能描述:测试4位数据线接口的LCD1602的驱动程序
(0003) //外部模块:LCD1602
(0004) //连接方法: 本例子的接线请参照LCD_1602.H中的定义
(0005) //如果要更改端口,只要修改LCD_1602.H上的定义即可
(0006) //外部时钟: 8MHz
(0007) //开发人员:书生
(0008) //开发日期:2006年2月13日凌晨
(0009) //*********************************************************
(0010) #include <iom8v.h>
(0011) #include <macros.h>
(0012) #include "LCD_1602.h"
(0013)
(0014) unsigned char hour,min,sec,time;
(0015) unsigned int BT1_time,BT1_T,D882_P;
(0016) void delay_nms(unsigned int n);
(0017) void delay_nus(unsigned int n);
(0018) /*----------------------------------
(0019) 主程序
(0020) -----------------------------------*/
(0021) void main(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -