📄 lcd1602drive.lst
字号:
__start:
__text_start:
0032 E5CF LDI R28,0x5F
0033 E0D4 LDI R29,4
0034 BFCD OUT 0x3D,R28
0035 BFDE OUT 0x3E,R29
0036 51C0 SUBI R28,0x10
0037 40D0 SBCI R29,0
0038 EA0A LDI R16,0xAA
0039 8308 STD Y+0,R16
003A 2400 CLR R0
003B E7E0 LDI R30,0x70
003C E0F0 LDI R31,0
003D E010 LDI R17,0
003E 37E0 CPI R30,0x70
003F 07F1 CPC R31,R17
0040 F011 BEQ 0x0043
0041 9201 ST R0,Z+
0042 CFFB RJMP 0x003E
0043 8300 STD Z+0,R16
0044 E5E4 LDI R30,0x54
0045 E0F0 LDI R31,0
0046 E6A0 LDI R26,0x60
0047 E0B0 LDI R27,0
0048 E010 LDI R17,0
0049 36E4 CPI R30,0x64
004A 07F1 CPC R31,R17
004B F021 BEQ 0x0050
004C 95C8 LPM
004D 9631 ADIW R30,1
004E 920D ST R0,X+
004F CFF9 RJMP 0x0049
0050 940E0086 CALL _main
_exit:
0052 CFFF RJMP _exit
FILE: D:\Backup\我的文档\MYDESG~1\AVR\ICC\lcd1602drive\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) -----------------------------------------------------------------------*/
(0008)
(0009) void delay_1us(void) //1us延时函数
(0010) {
(0011) asm("nop");
_delay_1us:
0053 0000 NOP
0054 9508 RET
_delay_nus:
i --> R20
n --> R22
0055 940E013F CALL push_gset2
0057 01B8 MOVW R22,R16
(0012) }
(0013)
(0014) void delay_nus(unsigned int n) //N us延时函数
(0015) {
(0016) unsigned int i=0;
0058 2744 CLR R20
0059 2755 CLR R21
(0017) for (i=0;i<n;i++)
005A C003 RJMP 0x005E
(0018) delay_1us();
005B DFF7 RCALL _delay_1us
005C 5F4F SUBI R20,0xFF
005D 4F5F SBCI R21,0xFF
005E 1746 CP R20,R22
005F 0757 CPC R21,R23
0060 F3D0 BCS 0x005B
0061 940E0133 CALL pop_gset2
0063 9508 RET
(0019) }
(0020)
(0021) void delay_1ms(void) //1ms延时函数
(0022) {
(0023) unsigned int i;
(0024) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0064 2700 CLR R16
0065 2711 CLR R17
0066 C002 RJMP 0x0069
0067 5F0F SUBI R16,0xFF
0068 4F1F SBCI R17,0xFF
0069 3704 CPI R16,0x74
006A E0E4 LDI R30,4
006B 071E CPC R17,R30
006C F3D0 BCS 0x0067
006D 9508 RET
_delay_nms:
i --> R20
n --> R22
006E 940E013F CALL push_gset2
0070 01B8 MOVW R22,R16
(0025) }
(0026)
(0027) void delay_nms(unsigned int n) //N ms延时函数
(0028) {
(0029) unsigned int i=0;
0071 2744 CLR R20
0072 2755 CLR R21
(0030) for (i=0;i<n;i++)
0073 C003 RJMP 0x0077
(0031) delay_1ms();
0074 DFEF RCALL _delay_1ms
0075 5F4F SUBI R20,0xFF
0076 4F5F SBCI R21,0xFF
0077 1746 CP R20,R22
0078 0757 CPC R21,R23
0079 F3D0 BCS 0x0074
007A 940E0133 CALL pop_gset2
007C 9508 RET
FILE: D:\Backup\我的文档\MYDESG~1\AVR\ICC\lcd1602drive\lcd1602.c
(0001) /*----------------------------------------------------
(0002) 主函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008)
(0009) #include "LCD1602.h"
(0010)
(0011)
(0012) void init_devices(void)
(0013) {
(0014) CLI(); //disable all interrupts
_init_devices:
007D 94F8 BCLR 7
(0015) LCD_init();
007E 940E00A1 CALL _LCD_init
(0016) MCUCR = 0x00;
0080 2422 CLR R2
0081 BE25 OUT 0x35,R2
(0017) GICR = 0x00;
0082 BE2B OUT 0x3B,R2
(0018) TIMSK = 0x00; //timer interrupt sources
0083 BE29 OUT 0x39,R2
(0019) SEI(); //re-enable interrupts
0084 9478 BSET 7
0085 9508 RET
_main:
0086 9722 SBIW R28,2
(0020) }
(0021)
(0022) void main(void)
(0023) {
(0024) init_devices();
0087 DFF5 RCALL _init_devices
(0025) LCD_write_string(1,0,"Hi!!");
0088 E68B LDI R24,0x6B
0089 E090 LDI R25,0
008A 8399 STD Y+1,R25
008B 8388 STD Y+0,R24
008C 2722 CLR R18
008D E001 LDI R16,1
008E 940E0111 CALL _LCD_write_string
(0026) for(;;)
(0027) {
(0028) LCD_write_string(0,1,"archeng504");
0090 E680 LDI R24,0x60
0091 E090 LDI R25,0
0092 8399 STD Y+1,R25
0093 8388 STD Y+0,R24
0094 E021 LDI R18,1
0095 2700 CLR R16
0096 940E0111 CALL _LCD_write_string
(0029) LCD_write_char(6,0,'8');
0098 E388 LDI R24,0x38
0099 8388 STD Y+0,R24
009A 2722 CLR R18
009B E006 LDI R16,6
009C 940E0127 CALL _LCD_write_char
009E CFF1 RJMP 0x0090
009F 9622 ADIW R28,2
00A0 9508 RET
FILE: D:\Backup\我的文档\MYDESG~1\AVR\ICC\lcd1602drive\lcd1602_init.c
(0001) /*----------------------------------------------------
(0002) 液晶LCD1602C 使用4条数据线(D4~D7)
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008) #include "LCD1602.h"
(0009)
(0010) void LCD_init(void) //液晶初始化
(0011) {
(0012) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
00A1 B381 IN R24,0x11
00A2 6F80 ORI R24,0xF0
00A3 BB81 OUT 0x11,R24
(0013) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
00A4 9A8A SBI 0x11,2
(0014) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
00A5 9A88 SBI 0x11,0
(0015) LCD_write_command(0x28);
00A6 E208 LDI R16,0x28
00A7 D017 RCALL _LCD_write_command
(0016) LCD_en_write();
00A8 D00F RCALL _LCD_en_write
(0017) delay_nus(40);
00A9 E208 LDI R16,0x28
00AA E010 LDI R17,0
00AB 940E0055 CALL _delay_nus
(0018) LCD_write_command(0x28); //4位显示
00AD E208 LDI R16,0x28
00AE D010 RCALL _LCD_write_command
(0019) LCD_write_command(0x0c); //显示开
00AF E00C LDI R16,0xC
00B0 D00E RCALL _LCD_write_command
(0020) LCD_write_command(0x01); //清屏
00B1 E001 LDI R16,1
00B2 D00C RCALL _LCD_write_command
(0021) delay_nms(2);
00B3 E002 LDI R16,2
00B4 E010 LDI R17,0
00B5 940E006E CALL _delay_nms
00B7 9508 RET
(0022) }
(0023)
(0024) void LCD_en_write(void) //液晶使能
(0025) {
(0026) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00B8 9A92 SBI 0x12,2
(0027) delay_nus(1);
00B9 E001 LDI R16,1
00BA E010 LDI R17,0
00BB 940E0055 CALL _delay_nus
(0028) LCD_EN_PORT&=~LCD_EN;
00BD 9892 CBI 0x12,2
00BE 9508 RET
_LCD_write_command:
command --> R20
00BF 940E0141 CALL push_gset1
00C1 2F40 MOV R20,R16
(0029) }
(0030)
(0031) void LCD_write_command(unsigned char command) //写指令
(0032) {
(0033) delay_nus(16);
00C2 E100 LDI R16,0x10
00C3 E010 LDI R17,0
00C4 940E0055 CALL _delay_nus
(0034) LCD_RS_PORT&=~LCD_RS; //RS=0
00C6 9890 CBI 0x12,0
(0035) LCD_DATA_PORT&=0X0f; //清高四位
00C7 B382 IN R24,0x12
00C8 708F ANDI R24,0xF
00C9 BB82 OUT 0x12,R24
(0036) LCD_DATA_PORT|=command&0xf0; //写高四位
00CA 2F84 MOV R24,R20
00CB 7F80 ANDI R24,0xF0
00CC B222 IN R2,0x12
00CD 2A28 OR R2,R24
00CE BA22 OUT 0x12,R2
(0037) LCD_en_write();
00CF DFE8 RCALL _LCD_en_write
(0038) command=command<<4; //低四位移到高四位
00D0 2F84 MOV R24,R20
00D1 708F ANDI R24,0xF
00D2 9582 SWAP R24
00D3 2F48 MOV R20,R24
(0039) LCD_DATA_PORT&=0x0f; //清高四位
00D4 B382 IN R24,0x12
00D5 708F ANDI R24,0xF
00D6 BB82 OUT 0x12,R24
(0040) LCD_DATA_PORT|=command&0xf0; //写低四位
00D7 2F84 MOV R24,R20
00D8 7F80 ANDI R24,0xF0
00D9 B222 IN R2,0x12
00DA 2A28 OR R2,R24
00DB BA22 OUT 0x12,R2
(0041) LCD_en_write();
00DC DFDB RCALL _LCD_en_write
00DD 940E0144 CALL pop_gset1
00DF 9508 RET
_LCD_write_data:
data --> R20
00E0 940E0141 CALL push_gset1
00E2 2F40 MOV R20,R16
(0042)
(0043) }
(0044)
(0045) void LCD_write_data(unsigned char data) //写数据
(0046) {
(0047) delay_nus(16);
00E3 E100 LDI R16,0x10
00E4 E010 LDI R17,0
00E5 940E0055 CALL _delay_nus
(0048) LCD_RS_PORT|=LCD_RS; //RS=1
00E7 9A90 SBI 0x12,0
(0049) LCD_DATA_PORT&=0X0f; //清高四位
00E8 B382 IN R24,0x12
00E9 708F ANDI R24,0xF
00EA BB82 OUT 0x12,R24
(0050) LCD_DATA_PORT|=data&0xf0; //写高四位
00EB 2F84 MOV R24,R20
00EC 7F80 ANDI R24,0xF0
00ED B222 IN R2,0x12
00EE 2A28 OR R2,R24
00EF BA22 OUT 0x12,R2
(0051) LCD_en_write();
00F0 DFC7 RCALL _LCD_en_write
(0052) data=data<<4; //低四位移到高四位
00F1 2F84 MOV R24,R20
00F2 708F ANDI R24,0xF
00F3 9582 SWAP R24
00F4 2F48 MOV R20,R24
(0053) LCD_DATA_PORT&=0X0f; //清高四位
00F5 B382 IN R24,0x12
00F6 708F ANDI R24,0xF
00F7 BB82 OUT 0x12,R24
(0054) LCD_DATA_PORT|=data&0xf0; //写低四位
00F8 2F84 MOV R24,R20
00F9 7F80 ANDI R24,0xF0
00FA B222 IN R2,0x12
00FB 2A28 OR R2,R24
00FC BA22 OUT 0x12,R2
(0055) LCD_en_write();
00FD DFBA RCALL _LCD_en_write
00FE 940E0144 CALL pop_gset1
0100 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
0101 940E013F CALL push_gset2
0103 2F42 MOV R20,R18
0104 2F60 MOV R22,R16
(0056) }
(0057)
(0058)
(0059) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0060) {
(0061) unsigned char address;
(0062) if (y == 0) address = 0x80 + x;
0105 2344 TST R20
0106 F419 BNE 0x010A
0107 2F46 MOV R20,R22
0108 5840 SUBI R20,0x80
0109 C002 RJMP 0x010C
(0063) else address = 0xc0 + x;
010A 2F46 MOV R20,R22
010B 5440 SUBI R20,0x40
(0064) LCD_write_command( address);
010C 2F04 MOV R16,R20
010D DFB1 RCALL _LCD_write_command
010E 940E0133 CALL pop_gset2
0110 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
0111 940E013D CALL push_gset3
0113 2EA2 MOV R10,R18
0114 2F60 MOV R22,R16
0115 814E LDD R20,Y+6
0116 815F LDD R21,Y+7
(0065) }
(0066)
(0067) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0068) {
(0069) LCD_set_xy( X, Y ); //写地址
0117 2D2A MOV R18,R10
0118 2F06 MOV R16,R22
0119 DFE7 RCALL _LCD_set_xy
011A C005 RJMP 0x0120
(0070) while (*s) // 写显示字符
(0071) {
(0072) LCD_write_data( *s );
011B 01FA MOVW R30,R20
011C 8100 LDD R16,Z+0
011D DFC2 RCALL _LCD_write_data
(0073) s ++;
011E 5F4F SUBI R20,0xFF
011F 4F5F SBCI R21,0xFF
0120 01FA MOVW R30,R20
0121 8020 LDD R2,Z+0
0122 2022 TST R2
0123 F7B9 BNE 0x011B
0124 940E0136 CALL pop_gset3
0126 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
0127 940E013F CALL push_gset2
0129 2F62 MOV R22,R18
012A 2F40 MOV R20,R16
(0074) }
(0075)
(0076) }
(0077)
(0078) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0079) {
(0080) LCD_set_xy( X, Y ); //写地址
012B 2F26 MOV R18,R22
012C 2F04 MOV R16,R20
012D DFD3 RCALL _LCD_set_xy
(0081) LCD_write_data( data);
FILE: <library>
012E 810C LDD R16,Y+4
012F DFB0 RCALL _LCD_write_data
0130 940E0133 CALL pop_gset2
0132 9508 RET
pop_gset2:
0133 E0E2 LDI R30,2
0134 940C0145 JMP pop
pop_gset3:
0136 E0E4 LDI R30,4
0137 940C0145 JMP pop
push_gset5:
0139 92FA ST R15,-Y
013A 92EA ST R14,-Y
push_gset4:
013B 92DA ST R13,-Y
013C 92CA ST R12,-Y
push_gset3:
013D 92BA ST R11,-Y
013E 92AA ST R10,-Y
push_gset2:
013F 937A ST R23,-Y
0140 936A ST R22,-Y
push_gset1:
0141 935A ST R21,-Y
0142 934A ST R20,-Y
0143 9508 RET
pop_gset1:
0144 E0E1 LDI R30,1
pop:
0145 9149 LD R20,Y+
0146 9159 LD R21,Y+
0147 FDE0 SBRC R30,0
0148 9508 RET
0149 9169 LD R22,Y+
014A 9179 LD R23,Y+
014B FDE1 SBRC R30,1
014C 9508 RET
014D 90A9 LD R10,Y+
014E 90B9 LD R11,Y+
014F FDE2 SBRC R30,2
0150 9508 RET
0151 90C9 LD R12,Y+
0152 90D9 LD R13,Y+
0153 FDE3 SBRC R30,3
0154 9508 RET
0155 90E9 LD R14,Y+
0156 90F9 LD R15,Y+
0157 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -