📄 lcd1602.lst
字号:
__start:
__text_start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E7E0 LDI R30,0x70
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 37E0 CPI R30,0x70
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E2E6 LDI R30,0x26
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E6 CPI R30,0x36
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D039 RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: C:\DOCUME~1\Myers\桌面\2121\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) -----------------------------------------------------------------------*/
(0007)
(0008) void delay_1us(void) //1us延时函数
(0009) {
(0010) asm("nop");
_delay_1us:
003B 0000 NOP
003C 9508 RET
_delay_nus:
i --> R20
n --> R22
003D D0DA RCALL push_gset2
003E 01B8 MOVW R22,R16
(0011) }
(0012)
(0013) void delay_nus(unsigned int n) //N us延时函数
(0014) {
(0015) unsigned int i=0;
003F 2744 CLR R20
0040 2755 CLR R21
(0016) for (i=0;i<n;i++)
0041 C003 RJMP 0x0045
(0017) delay_1us();
0042 DFF8 RCALL _delay_1us
0043 5F4F SUBI R20,0xFF
0044 4F5F SBCI R21,0xFF
0045 1746 CP R20,R22
0046 0757 CPC R21,R23
0047 F3D0 BCS 0x0042
0048 D0C5 RCALL pop_gset2
0049 9508 RET
(0018) }
(0019)
(0020) void delay_1ms(void) //1ms延时函数
(0021) {
(0022) unsigned int i;
(0023) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
004A 2700 CLR R16
004B 2711 CLR R17
004C C002 RJMP 0x004F
004D 5F0F SUBI R16,0xFF
004E 4F1F SBCI R17,0xFF
004F 3704 CPI R16,0x74
0050 E0E4 LDI R30,4
0051 071E CPC R17,R30
0052 F3D0 BCS 0x004D
0053 9508 RET
_delay_nms:
i --> R20
n --> R22
0054 D0C3 RCALL push_gset2
0055 01B8 MOVW R22,R16
(0024) }
(0025)
(0026) void delay_nms(unsigned int n) //N ms延时函数
(0027) {
(0028) unsigned int i=0;
0056 2744 CLR R20
0057 2755 CLR R21
(0029) for (i=0;i<n;i++)
0058 C003 RJMP 0x005C
(0030) delay_1ms();
0059 DFF0 RCALL _delay_1ms
005A 5F4F SUBI R20,0xFF
005B 4F5F SBCI R21,0xFF
005C 1746 CP R20,R22
005D 0757 CPC R21,R23
005E F3D0 BCS 0x0059
005F D0AE RCALL pop_gset2
0060 9508 RET
FILE: C:\DOCUME~1\Myers\桌面\2121\LCD1602.c
(0001) /*----------------------------------------------------
(0002) 主函数
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) ---------------------------------------------------*/
(0007) // Target : M8
(0008) // Crystal: 8.0000Mhz
(0009)
(0010) #include "LCD1602.h"
(0011)
(0012) void port_init(void)
(0013) {
(0014) PORTB = 0x00;
_port_init:
0061 2422 CLR R2
0062 BA28 OUT 0x18,R2
(0015) DDRB = 0x00;
0063 BA27 OUT 0x17,R2
(0016) PORTC = 0x00; //m103 output only
0064 BA25 OUT 0x15,R2
(0017) DDRC = 0x00;
0065 BA24 OUT 0x14,R2
(0018) PORTD = 0x00;
0066 BA22 OUT 0x12,R2
(0019) DDRD = 0x0F;
0067 E08F LDI R24,0xF
0068 BB81 OUT 0x11,R24
0069 9508 RET
(0020) }
(0021)
(0022) void init_devices(void)
(0023) {
(0024) CLI(); //disable all interrupts
_init_devices:
006A 94F8 BCLR 7
(0025) port_init();
006B DFF5 RCALL _port_init
(0026) LCD_init();
006C D01E RCALL _LCD_init
(0027) MCUCR = 0x00;
006D 2422 CLR R2
006E BE25 OUT 0x35,R2
(0028) GICR = 0x00;
006F BE2B OUT 0x3B,R2
(0029) TIMSK = 0x00; //timer interrupt sources
0070 BE29 OUT 0x39,R2
(0030) SEI(); //re-enable interrupts
0071 9478 BSET 7
0072 9508 RET
_main:
0073 9722 SBIW R28,2
(0031) }
(0032)
(0033) void main(void)
(0034) {
(0035) init_devices();
0074 DFF5 RCALL _init_devices
(0036) LCD_write_string(1,0,"Hi!!");
0075 E68B LDI R24,0x6B
0076 E090 LDI R25,0
0077 8399 STD Y+1,R25
0078 8388 STD Y+0,R24
0079 2722 CLR R18
007A E001 LDI R16,1
007B D074 RCALL _LCD_write_string
(0037) for(;;)
(0038) {
(0039) LCD_write_string(0,1,"archeng504");
007C E680 LDI R24,0x60
007D E090 LDI R25,0
007E 8399 STD Y+1,R25
007F 8388 STD Y+0,R24
0080 E021 LDI R18,1
0081 2700 CLR R16
0082 D06D RCALL _LCD_write_string
(0040) LCD_write_char(6,0,'8');
0083 E388 LDI R24,0x38
0084 8388 STD Y+0,R24
0085 2722 CLR R18
0086 E006 LDI R16,6
0087 D07C RCALL _LCD_write_char
0088 CFF3 RJMP 0x007C
0089 9622 ADIW R28,2
008A 9508 RET
FILE: C:\DOCUME~1\Myers\桌面\2121\LCD1602_init.c
(0001) /*----------------------------------------------------
(0002) 液晶LCD1602C 使用4条数据线(D4~D7)
(0003) 编译器:ICC-AVR v6.31A
(0004) 目标芯片 : M8
(0005) 时钟: 8.0000Mhz
(0006) ---------------------------------------------------*/
(0007) #include "LCD1602.h"
(0008)
(0009) void LCD_init(void) //液晶初始化
(0010) {
(0011) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
008B B381 IN R24,0x11
008C 6F80 ORI R24,0xF0
008D BB81 OUT 0x11,R24
(0012) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
008E 9A8A SBI 0x11,2
(0013) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
008F 9A88 SBI 0x11,0
(0014) LCD_write_command(0x28);
0090 E208 LDI R16,0x28
0091 D014 RCALL _LCD_write_command
(0015) LCD_en_write();
0092 D00D RCALL _LCD_en_write
(0016) delay_nus(40);
0093 E208 LDI R16,0x28
0094 E010 LDI R17,0
0095 DFA7 RCALL _delay_nus
(0017) LCD_write_command(0x28); //4位显示
0096 E208 LDI R16,0x28
0097 D00E RCALL _LCD_write_command
(0018) LCD_write_command(0x0c); //显示开
0098 E00C LDI R16,0xC
0099 D00C RCALL _LCD_write_command
(0019) LCD_write_command(0x01); //清屏
009A E001 LDI R16,1
009B D00A RCALL _LCD_write_command
(0020) delay_nms(2);
009C E002 LDI R16,2
009D E010 LDI R17,0
009E DFB5 RCALL _delay_nms
009F 9508 RET
(0021) }
(0022)
(0023) void LCD_en_write(void) //液晶使能
(0024) {
(0025) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00A0 9A92 SBI 0x12,2
(0026) delay_nus(1);
00A1 E001 LDI R16,1
00A2 E010 LDI R17,0
00A3 DF99 RCALL _delay_nus
(0027) LCD_EN_PORT&=~LCD_EN;
00A4 9892 CBI 0x12,2
00A5 9508 RET
_LCD_write_command:
command --> R20
00A6 D073 RCALL push_gset1
00A7 2F40 MOV R20,R16
(0028) }
(0029)
(0030) void LCD_write_command(unsigned char command) //写指令
(0031) {
(0032) delay_nus(16);
00A8 E100 LDI R16,0x10
00A9 E010 LDI R17,0
00AA DF92 RCALL _delay_nus
(0033) LCD_RS_PORT&=~LCD_RS; //RS=0
00AB 9890 CBI 0x12,0
(0034) LCD_DATA_PORT&=0X0f; //清高四位
00AC B382 IN R24,0x12
00AD 708F ANDI R24,0xF
00AE BB82 OUT 0x12,R24
(0035) LCD_DATA_PORT|=command&0xf0; //写高四位
00AF 2F84 MOV R24,R20
00B0 7F80 ANDI R24,0xF0
00B1 B222 IN R2,0x12
00B2 2A28 OR R2,R24
00B3 BA22 OUT 0x12,R2
(0036) LCD_en_write();
00B4 DFEB RCALL _LCD_en_write
(0037) command=command<<4; //低四位移到高四位
00B5 2F84 MOV R24,R20
00B6 708F ANDI R24,0xF
00B7 9582 SWAP R24
00B8 2F48 MOV R20,R24
(0038) LCD_DATA_PORT&=0x0f; //清高四位
00B9 B382 IN R24,0x12
00BA 708F ANDI R24,0xF
00BB BB82 OUT 0x12,R24
(0039) LCD_DATA_PORT|=command&0xf0; //写低四位
00BC 2F84 MOV R24,R20
00BD 7F80 ANDI R24,0xF0
00BE B222 IN R2,0x12
00BF 2A28 OR R2,R24
00C0 BA22 OUT 0x12,R2
(0040) LCD_en_write();
00C1 DFDE RCALL _LCD_en_write
00C2 D05A RCALL pop_gset1
00C3 9508 RET
_LCD_write_data:
data --> R20
00C4 D055 RCALL push_gset1
00C5 2F40 MOV R20,R16
(0041)
(0042) }
(0043)
(0044) void LCD_write_data(unsigned char data) //写数据
(0045) {
(0046) delay_nus(16);
00C6 E100 LDI R16,0x10
00C7 E010 LDI R17,0
00C8 DF74 RCALL _delay_nus
(0047) LCD_RS_PORT|=LCD_RS; //RS=1
00C9 9A90 SBI 0x12,0
(0048) LCD_DATA_PORT&=0X0f; //清高四位
00CA B382 IN R24,0x12
00CB 708F ANDI R24,0xF
00CC BB82 OUT 0x12,R24
(0049) LCD_DATA_PORT|=data&0xf0; //写高四位
00CD 2F84 MOV R24,R20
00CE 7F80 ANDI R24,0xF0
00CF B222 IN R2,0x12
00D0 2A28 OR R2,R24
00D1 BA22 OUT 0x12,R2
(0050) LCD_en_write();
00D2 DFCD RCALL _LCD_en_write
(0051) data=data<<4; //低四位移到高四位
00D3 2F84 MOV R24,R20
00D4 708F ANDI R24,0xF
00D5 9582 SWAP R24
00D6 2F48 MOV R20,R24
(0052) LCD_DATA_PORT&=0X0f; //清高四位
00D7 B382 IN R24,0x12
00D8 708F ANDI R24,0xF
00D9 BB82 OUT 0x12,R24
(0053) LCD_DATA_PORT|=data&0xf0; //写低四位
00DA 2F84 MOV R24,R20
00DB 7F80 ANDI R24,0xF0
00DC B222 IN R2,0x12
00DD 2A28 OR R2,R24
00DE BA22 OUT 0x12,R2
(0054) LCD_en_write();
00DF DFC0 RCALL _LCD_en_write
00E0 D03C RCALL pop_gset1
00E1 9508 RET
_LCD_set_xy:
address --> R20
y --> R20
x --> R22
00E2 D035 RCALL push_gset2
00E3 2F42 MOV R20,R18
00E4 2F60 MOV R22,R16
(0055) }
(0056)
(0057)
(0058) void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
(0059) {
(0060) unsigned char address;
(0061) if (y == 0) address = 0x80 + x;
00E5 2344 TST R20
00E6 F419 BNE 0x00EA
00E7 2F46 MOV R20,R22
00E8 5840 SUBI R20,0x80
00E9 C002 RJMP 0x00EC
(0062) else address = 0xc0 + x;
00EA 2F46 MOV R20,R22
00EB 5440 SUBI R20,0x40
(0063) LCD_write_command( address);
00EC 2F04 MOV R16,R20
00ED DFB8 RCALL _LCD_write_command
00EE D01F RCALL pop_gset2
00EF 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
00F0 D025 RCALL push_gset3
00F1 2EA2 MOV R10,R18
00F2 2F60 MOV R22,R16
00F3 814E LDD R20,Y+6
00F4 815F LDD R21,Y+7
(0064) }
(0065)
(0066) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0067) {
(0068) LCD_set_xy( X, Y ); //写地址
00F5 2D2A MOV R18,R10
00F6 2F06 MOV R16,R22
00F7 DFEA RCALL _LCD_set_xy
00F8 C005 RJMP 0x00FE
(0069) while (*s) // 写显示字符
(0070) {
(0071) LCD_write_data( *s );
00F9 01FA MOVW R30,R20
00FA 8100 LDD R16,Z+0
00FB DFC8 RCALL _LCD_write_data
(0072) s ++;
00FC 5F4F SUBI R20,0xFF
00FD 4F5F SBCI R21,0xFF
00FE 01FA MOVW R30,R20
00FF 8020 LDD R2,Z+0
0100 2022 TST R2
0101 F7B9 BNE 0x00F9
0102 D00D RCALL pop_gset3
0103 9508 RET
_LCD_write_char:
data --> Y+4
Y --> R22
X --> R20
0104 D013 RCALL push_gset2
0105 2F62 MOV R22,R18
0106 2F40 MOV R20,R16
(0073) }
(0074)
(0075) }
(0076)
(0077) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0078) {
(0079) LCD_set_xy( X, Y ); //写地址
0107 2F26 MOV R18,R22
0108 2F04 MOV R16,R20
0109 DFD8 RCALL _LCD_set_xy
(0080) LCD_write_data( data);
FILE: <library>
010A 810C LDD R16,Y+4
010B DFB8 RCALL _LCD_write_data
010C D001 RCALL pop_gset2
010D 9508 RET
pop_gset2:
010E E0E2 LDI R30,2
010F C00E RJMP pop
pop_gset3:
0110 E0E4 LDI R30,4
0111 C00C RJMP pop
push_gset5:
0112 92FA ST R15,-Y
0113 92EA ST R14,-Y
push_gset4:
0114 92DA ST R13,-Y
0115 92CA ST R12,-Y
push_gset3:
0116 92BA ST R11,-Y
0117 92AA ST R10,-Y
push_gset2:
0118 937A ST R23,-Y
0119 936A ST R22,-Y
push_gset1:
011A 935A ST R21,-Y
011B 934A ST R20,-Y
011C 9508 RET
pop_gset1:
011D E0E1 LDI R30,1
pop:
011E 9149 LD R20,Y+
011F 9159 LD R21,Y+
0120 FDE0 SBRC R30,0
0121 9508 RET
0122 9169 LD R22,Y+
0123 9179 LD R23,Y+
0124 FDE1 SBRC R30,1
0125 9508 RET
0126 90A9 LD R10,Y+
0127 90B9 LD R11,Y+
0128 FDE2 SBRC R30,2
0129 9508 RET
012A 90C9 LD R12,Y+
012B 90D9 LD R13,Y+
012C FDE3 SBRC R30,3
012D 9508 RET
012E 90E9 LD R14,Y+
012F 90F9 LD R15,Y+
0130 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -