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