📄 main.lst
字号:
(0008) PA2 ->RS
(0009) PA3 ->EN
(0010) 地 ->RW
(0011) PA4 ->D4
(0012) PA5 ->D5
(0013) PA6 ->D6
(0014) PA7 ->D7
(0015) 要使用本驱动,改变下面配置信息即可
(0016) -----------------------------------------------------------------*/
(0017) #define LCD_EN_PORT PORTC //以下2个要设为同一个口
(0018) #define LCD_EN_DDR DDRC
(0019) #define LCD_RS_PORT PORTC //以下2个要设为同一个口
(0020) #define LCD_RS_DDR DDRC
(0021) #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
(0022) #define LCD_DATA_DDR DDRA //一定要用高4位
(0023) #define LCD_DATA_PIN PINA
(0024) #define LCD_RS (1<<PC6) //0x04 portC6 out
(0025) #define LCD_EN (1<<PC7) //0x08 portC7 out
(0026) #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out
(0027) /*--------------------------------------------------------------------------------------------------
(0028) 函数说明
(0029) --------------------------------------------------------------------------------------------------*/
(0030) void LCD_init(void);
(0031) void LCD_en_write(void);
(0032) void LCD_write_command(unsigned char command) ;
(0033) void LCD_write_data(unsigned char data);
(0034) void LCD_set_xy (unsigned char x, unsigned char y);
(0035) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0036) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0037)
(0038) //-----------------------------------------------------------------------------------------
(0039)
(0040) #include <iom16v.h>
(0041) #include <macros.h>
(0042) #include "delay.h"
(0043)
(0044) void LCD_init(void) //液晶初始化
(0045) {
(0046) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
0102 B38A IN R24,0x1A
0103 6F80 ORI R24,0xF0
0104 BB8A OUT 0x1A,R24
(0047) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0105 9AA7 SBI 0x14,7
(0048) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0106 9AA6 SBI 0x14,6
(0049) LCD_write_command(0x28);
0107 E208 LDI R16,0x28
0108 D014 RCALL _LCD_write_command
(0050) LCD_en_write();
0109 D00D RCALL _LCD_en_write
(0051) delay_nus(40);
010A E208 LDI R16,0x28
010B E010 LDI R17,0
010C DF40 RCALL _delay_nus
(0052) LCD_write_command(0x28); //4位显示
010D E208 LDI R16,0x28
010E D00E RCALL _LCD_write_command
(0053) LCD_write_command(0x0c); //显示开
010F E00C LDI R16,0xC
0110 D00C RCALL _LCD_write_command
(0054) LCD_write_command(0x01); //清屏
0111 E001 LDI R16,1
0112 D00A RCALL _LCD_write_command
(0055) delay_nms(2);
0113 E002 LDI R16,2
0114 E010 LDI R17,0
0115 DF50 RCALL _delay_nms
0116 9508 RET
(0056) }
(0057)
(0058) void LCD_en_write(void) //液晶使能
(0059) {
(0060) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
0117 9AAF SBI 0x15,7
(0061) delay_nus(1);
0118 E001 LDI R16,1
0119 E010 LDI R17,0
011A DF32 RCALL _delay_nus
(0062) LCD_EN_PORT&=~LCD_EN;
011B 98AF CBI 0x15,7
011C 9508 RET
_LCD_write_command:
command --> R20
011D 940E01CB CALL push_gset1
011F 2F40 MOV R20,R16
(0063) }
(0064)
(0065) void LCD_write_command(unsigned char command) //写指令
(0066) {
(0067) delay_nus(16);
0120 E100 LDI R16,0x10
0121 E010 LDI R17,0
0122 DF2A RCALL _delay_nus
(0068) LCD_RS_PORT&=~LCD_RS; //RS=0
0123 98AE CBI 0x15,6
(0069) LCD_DATA_PORT&=0X0f; //清高四位
0124 B38B IN R24,0x1B
0125 708F ANDI R24,0xF
0126 BB8B OUT 0x1B,R24
(0070) LCD_DATA_PORT|=command&0xf0; //写高四位
0127 2F84 MOV R24,R20
0128 7F80 ANDI R24,0xF0
0129 B22B IN R2,0x1B
012A 2A28 OR R2,R24
012B BA2B OUT 0x1B,R2
(0071) LCD_en_write();
012C DFEA RCALL _LCD_en_write
(0072) command=command<<4; //低四位移到高四位
012D 2F84 MOV R24,R20
012E 708F ANDI R24,0xF
012F 9582 SWAP R24
0130 2F48 MOV R20,R24
(0073) LCD_DATA_PORT&=0x0f; //清高四位
0131 B38B IN R24,0x1B
0132 708F ANDI R24,0xF
0133 BB8B OUT 0x1B,R24
(0074) LCD_DATA_PORT|=command&0xf0; //写低四位
0134 2F84 MOV R24,R20
0135 7F80 ANDI R24,0xF0
0136 B22B IN R2,0x1B
0137 2A28 OR R2,R24
0138 BA2B OUT 0x1B,R2
(0075) LCD_en_write();
0139 DFDD RCALL _LCD_en_write
013A 940E01CE CALL pop_gset1
013C 9508 RET
_LCD_write_data:
data --> R20
013D 940E01CB CALL push_gset1
013F 2F40 MOV R20,R16
(0076)
(0077) }
(0078)
(0079) void LCD_write_data(unsigned char data) //写数据
(0080) {
(0081) delay_nus(16);
0140 E100 LDI R16,0x10
0141 E010 LDI R17,0
0142 DF0A RCALL _delay_nus
(0082) LCD_RS_PORT|=LCD_RS; //RS=1
0143 9AAE SBI 0x15,6
(0083) LCD_DATA_PORT&=0X0f; //清高四位
0144 B38B IN R24,0x1B
0145 708F ANDI R24,0xF
0146 BB8B OUT 0x1B,R24
(0084) LCD_DATA_PORT|=data&0xf0; //写高四位
0147 2F84 MOV R24,R20
0148 7F80 ANDI R24,0xF0
0149 B22B IN R2,0x1B
014A 2A28 OR R2,R24
014B BA2B OUT 0x1B,R2
(0085) LCD_en_write();
014C DFCA RCALL _LCD_en_write
(0086) data=data<<4; //低四位移到高四位
014D 2F84 MOV R24,R20
014E 708F ANDI R24,0xF
014F 9582 SWAP R24
0150 2F48 MOV R20,R24
(0087) LCD_DATA_PORT&=0X0f; //清高四位
0151 B38B IN R24,0x1B
0152 708F ANDI R24,0xF
0153 BB8B OUT 0x1B,R24
(0088) LCD_DATA_PORT|=data&0xf0; //写低四位
0154 2F84 MOV R24,R20
0155 7F80 ANDI R24,0xF0
0156 B22B IN R2,0x1B
0157 2A28 OR R2,R24
0158 BA2B OUT 0x1B,R2
(0089) LCD_en_write();
0159 DFBD RCALL _LCD_en_write
015A 940E01CE CALL pop_gset1
015C 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
015D 940E01C9 CALL push_gset2
015F 2F42 MOV R20,R18
0160 2F60 MOV R22,R16
(0090) }
(0091)
(0092)
(0093) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0094) {
(0095) unsigned char address;
(0096) if (y == 0) address = 0x80 + x;
0161 2344 TST R20
0162 F419 BNE 0x0166
0163 2F46 MOV R20,R22
0164 5840 SUBI R20,0x80
0165 C002 RJMP 0x0168
(0097) else address = 0xc0 + x;
0166 2F46 MOV R20,R22
0167 5440 SUBI R20,0x40
(0098) LCD_write_command( address);
0168 2F04 MOV R16,R20
0169 DFB3 RCALL _LCD_write_command
016A 940E01BD CALL pop_gset2
016C 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
016D 940E01C7 CALL push_gset3
016F 2EA2 MOV R10,R18
0170 2F60 MOV R22,R16
0171 814E LDD R20,Y+6
0172 815F LDD R21,Y+7
(0099) }
(0100)
(0101) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0102) {
(0103) LCD_set_xy( X, Y ); //写地址
0173 2D2A MOV R18,R10
0174 2F06 MOV R16,R22
0175 DFE7 RCALL _LCD_set_xy
0176 C005 RJMP 0x017C
(0104) while (*s) // 写显示字符
(0105) {
(0106) LCD_write_data( *s );
0177 01FA MOVW R30,R20
0178 8100 LDD R16,Z+0
0179 DFC3 RCALL _LCD_write_data
(0107) s ++;
017A 5F4F SUBI R20,0xFF
017B 4F5F SBCI R21,0xFF
017C 01FA MOVW R30,R20
017D 8020 LDD R2,Z+0
017E 2022 TST R2
017F F7B9 BNE 0x0177
0180 940E01C0 CALL pop_gset3
0182 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
0183 940E01C9 CALL push_gset2
0185 2F62 MOV R22,R18
0186 2F40 MOV R20,R16
(0108) }
(0109)
(0110) }
(0111)
(0112) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0113) {
(0114) LCD_set_xy( X, Y ); //写地址
0187 2F26 MOV R18,R22
0188 2F04 MOV R16,R20
0189 DFD3 RCALL _LCD_set_xy
(0115) LCD_write_data( data);
018A 810C LDD R16,Y+4
018B DFB1 RCALL _LCD_write_data
018C 940E01BD CALL pop_gset2
018E 9508 RET
_main:
i --> R20
018F 9721 SBIW R28,1
FILE: D:\avr\+++精华+++\24c02\main.c
(0001) #include <iom16v.h>
(0002) #include "I2C.h"
(0003) #include "1602.h"
(0004) #include "delay.h"
(0005) void main(void)
(0006)
(0007) {
(0008) unsigned char i;
(0009) LCD_init();
0190 DF71 RCALL _LCD_init
0191 C028 RJMP 0x01BA
(0010) while(1)
(0011) {
(0012) I2C_Write('n',0x00);
0192 2722 CLR R18
0193 E60E LDI R16,0x6E
0194 DEE0 RCALL _I2C_Write
(0013) I2C_Write('c',0x01);
0195 E021 LDI R18,1
0196 E603 LDI R16,0x63
0197 DEDD RCALL _I2C_Write
(0014) I2C_Write('e',0x02);
0198 E022 LDI R18,2
0199 E605 LDI R16,0x65
019A DEDA RCALL _I2C_Write
(0015) I2C_Write('p',0x03);
019B E023 LDI R18,3
019C E700 LDI R16,0x70
019D DED7 RCALL _I2C_Write
(0016) I2C_Write('u',0x04);
019E E024 LDI R18,4
019F E705 LDI R16,0x75
01A0 DED4 RCALL _I2C_Write
(0017)
(0018) i=I2C_Read(0x00);
01A1 2700 CLR R16
01A2 2711 CLR R17
01A3 DF0E RCALL _I2C_Read
01A4 2F40 MOV R20,R16
(0019) LCD_write_char(0,0,i);
01A5 8348 STD Y+0,R20
01A6 2722 CLR R18
01A7 2700 CLR R16
01A8 DFDA RCALL _LCD_write_char
(0020) i=I2C_Read(0x01);
01A9 E001 LDI R16,1
01AA E010 LDI R17,0
01AB DF06 RCALL _I2C_Read
(0021) LCD_write_data(i);
01AC DF90 RCALL _LCD_write_data
(0022) i=I2C_Read(0x02);
01AD E002 LDI R16,2
01AE E010 LDI R17,0
01AF DF02 RCALL _I2C_Read
(0023) LCD_write_data(i);
01B0 DF8C RCALL _LCD_write_data
(0024) i=I2C_Read(0x03);
01B1 E003 LDI R16,3
01B2 E010 LDI R17,0
01B3 DEFE RCALL _I2C_Read
(0025) LCD_write_data(i);
01B4 DF88 RCALL _LCD_write_data
(0026) i=I2C_Read(0x04);
01B5 E004 LDI R16,4
01B6 E010 LDI R17,0
01B7 DEFA RCALL _I2C_Read
01B8 2F40 MOV R20,R16
(0027) LCD_write_data(i);
FILE: <library>
01B9 DF83 RCALL _LCD_write_data
01BA CFD7 RJMP 0x0192
01BB 9621 ADIW R28,1
01BC 9508 RET
pop_gset2:
01BD E0E2 LDI R30,2
01BE 940C01CF JMP pop
pop_gset3:
01C0 E0E4 LDI R30,4
01C1 940C01CF JMP pop
push_gset5:
01C3 92FA ST R15,-Y
01C4 92EA ST R14,-Y
push_gset4:
01C5 92DA ST R13,-Y
01C6 92CA ST R12,-Y
push_gset3:
01C7 92BA ST R11,-Y
01C8 92AA ST R10,-Y
push_gset2:
01C9 937A ST R23,-Y
01CA 936A ST R22,-Y
push_gset1:
01CB 935A ST R21,-Y
01CC 934A ST R20,-Y
01CD 9508 RET
pop_gset1:
01CE E0E1 LDI R30,1
pop:
01CF 9149 LD R20,Y+
01D0 9159 LD R21,Y+
01D1 FDE0 SBRC R30,0
01D2 9508 RET
01D3 9169 LD R22,Y+
01D4 9179 LD R23,Y+
01D5 FDE1 SBRC R30,1
01D6 9508 RET
01D7 90A9 LD R10,Y+
01D8 90B9 LD R11,Y+
01D9 FDE2 SBRC R30,2
01DA 9508 RET
01DB 90C9 LD R12,Y+
01DC 90D9 LD R13,Y+
01DD FDE3 SBRC R30,3
01DE 9508 RET
01DF 90E9 LD R14,Y+
01E0 90F9 LD R15,Y+
01E1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -