📄 lcd_c.lst
字号:
__start:
__text_start:
2E E5CF LDI R28,0x5F
2F E0D4 LDI R29,4
30 BFCD OUT 0x3D,R28
31 BFDE OUT 0x3E,R29
32 51C0 SUBI R28,0x10
33 40D0 SBCI R29,0
34 EA0A LDI R16,0xAA
35 8308 STD Y+0,R16
36 2400 CLR R0
37 E6E8 LDI R30,0x68
38 E0F0 LDI R31,0
39 E010 LDI R17,0
3A 36E8 CPI R30,0x68
3B 07F1 CPC R31,R17
3C F011 BEQ 0x003F
3D 9201 ST R0,Z+
3E CFFB RJMP 0x003A
3F 8300 STD Z+0,R16
40 E5E4 LDI R30,0x54
41 E0F0 LDI R31,0
42 E6A0 LDI R26,0x60
43 E0B0 LDI R27,0
44 E010 LDI R17,0
45 E000 LDI R16,0
46 BF0B OUT 0x3B,R16
47 35EC CPI R30,0x5C
48 07F1 CPC R31,R17
49 F021 BEQ 0x004E
4A 95C8 LPM
4B 9631 ADIW R30,1
4C 920D ST R0,X+
4D CFF9 RJMP 0x0047
4E 940E 0082 CALL _main
_exit:
50 CFFF RJMP _exit
FILE: G:\文档\LCD1602_C\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:
51 0000 NOP
52 9508 RET
_delay_nus:
i --> R20
n --> R10
53 940E 0121 CALL push_xgset300C
55 0158 MOVW R10,R16
(0012) }
(0013)
(0014) void delay_nus(unsigned int n) //N us延时函数
(0015) {
(0016) unsigned int i=0;
56 2744 CLR R20
57 2755 CLR R21
(0017) for (i=0;i<n;i++)
58 C003 RJMP 0x005C
(0018) delay_1us();
59 DFF7 RCALL _delay_1us
5A 5F4F SUBI R20,0xFF
5B 4F5F SBCI R21,0xFF
5C 154A CP R20,R10
5D 055B CPC R21,R11
5E F3D0 BCS 0x0059
5F 940C 0126 JMP pop_xgset300C
(0019) }
(0020)
(0021) void delay_1ms(void) //1ms延时函数
(0022) {
(0023) unsigned int i;
(0024) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
61 2700 CLR R16
62 2711 CLR R17
63 C002 RJMP 0x0066
64 5F0F SUBI R16,0xFF
65 4F1F SBCI R17,0xFF
66 3704 CPI R16,0x74
67 E0E4 LDI R30,4
68 071E CPC R17,R30
69 F3D0 BCS 0x0064
6A 9508 RET
_delay_nms:
i --> R20
n --> R10
6B 940E 0121 CALL push_xgset300C
6D 0158 MOVW R10,R16
(0025) }
(0026)
(0027) void delay_nms(unsigned int n) //N ms延时函数
(0028) {
(0029) unsigned int i=0;
6E 2744 CLR R20
6F 2755 CLR R21
(0030) for (i=0;i<n;i++)
70 C003 RJMP 0x0074
(0031) delay_1ms();
71 DFEF RCALL _delay_1ms
72 5F4F SUBI R20,0xFF
73 4F5F SBCI R21,0xFF
74 154A CP R20,R10
75 055B CPC R21,R11
76 F3D0 BCS 0x0071
77 940C 0126 JMP pop_xgset300C
FILE: G:\文档\LCD1602_C\lcd_c.c
(0001) /*----------------------------------------------------
(0002) 主函数
(0003) 编译器:ICC-AVR v6.31A 日期: 2005-11-24 20:29:57
(0004) 目标芯片 : M16
(0005) 时钟: 8.0000Mhz
(0006) 作者:archeng504
(0007) ---------------------------------------------------*/
(0008)
(0009) #include "LCD.h"
(0010)
(0011)
(0012) void init_devices(void)
(0013) {
(0014) CLI(); //disable all interrupts
_init_devices:
79 94F8 BCLR 7
(0015) LCD_init();
7A 940E 0095 CALL _LCD_init
(0016) MCUCR = 0x00;
7C 2422 CLR R2
7D BE25 OUT 0x35,R2
(0017) GICR = 0x00;
7E BE2B OUT 0x3B,R2
(0018) TIMSK = 0x00; //timer interrupt sources
7F BE29 OUT 0x39,R2
(0019) SEI(); //re-enable interrupts
80 9478 BSET 7
81 9508 RET
_main:
82 9722 SBIW R28,2
(0020) }
(0021)
(0022) void main(void)
(0023) {
(0024) init_devices();
83 DFF5 RCALL _init_devices
(0025) for(;;)
(0026) {
(0027) LCD_write_string(0,0,"archeng");
84 E680 LDI R24,0x60
85 E090 LDI R25,0
86 8399 STD Y+1,R25
87 8388 STD Y+0,R24
88 2722 CLR R18
89 2700 CLR R16
8A 940E 0100 CALL _LCD_write_string
(0028) LCD_write_char(1,0,'1234');
8C E381 LDI R24,0x31
8D 8388 STD Y+0,R24
8E 2722 CLR R18
8F E001 LDI R16,1
90 940E 0115 CALL _LCD_write_char
92 CFF1 RJMP 0x0084
93 9622 ADIW R28,2
94 9508 RET
FILE: G:\文档\LCD1602_C\LCD_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 "LCD.h"
(0009)
(0010) void LCD_init(void) //液晶初始化
(0011) {
(0012) LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
_LCD_init:
95 B38A IN R24,0x1A
96 6F80 ORI R24,0xF0
97 BB8A OUT 0x1A,R24
(0013) LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
98 9AD3 SBI 0x1A,3
(0014) LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
99 9AD2 SBI 0x1A,2
(0015) LCD_write_command(0x28);
9A E208 LDI R16,0x28
9B D017 RCALL _LCD_write_command
(0016) LCD_en_write();
9C D00F RCALL _LCD_en_write
(0017) delay_nus(40);
9D E208 LDI R16,0x28
9E E010 LDI R17,0
9F 940E 0053 CALL _delay_nus
(0018) LCD_write_command(0x28); //4位显示
A1 E208 LDI R16,0x28
A2 D010 RCALL _LCD_write_command
(0019) LCD_write_command(0x0c); //显示开
A3 E00C LDI R16,0xC
A4 D00E RCALL _LCD_write_command
(0020) LCD_write_command(0x01); //清屏
A5 E001 LDI R16,1
A6 D00C RCALL _LCD_write_command
(0021) delay_nms(2);
A7 E002 LDI R16,2
A8 E010 LDI R17,0
A9 940E 006B CALL _delay_nms
AB 9508 RET
(0022) }
(0023)
(0024) void LCD_en_write(void) //液晶使能
(0025) {
(0026) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
AC 9ADB SBI 0x1B,3
(0027) delay_nus(1);
AD E001 LDI R16,1
AE E010 LDI R17,0
AF 940E 0053 CALL _delay_nus
(0028) LCD_EN_PORT&=~LCD_EN;
B1 98DB CBI 0x1B,3
B2 9508 RET
_LCD_write_command:
command --> R20
B3 934A ST R20,-Y
B4 2F40 MOV R20,R16
(0029) }
(0030)
(0031) void LCD_write_command(unsigned char command) //写指令
(0032) {
(0033) delay_nus(16);
B5 E100 LDI R16,0x10
B6 E010 LDI R17,0
B7 940E 0053 CALL _delay_nus
(0034) LCD_RS_PORT&=~LCD_RS; //RS=0
B9 98DA CBI 0x1B,2
(0035) LCD_DATA_PORT&=0X0f; //清高四位
BA B38B IN R24,0x1B
BB 708F ANDI R24,0xF
BC BB8B OUT 0x1B,R24
(0036) LCD_DATA_PORT|=command&0xf0; //写高四位
BD 2F84 MOV R24,R20
BE 7F80 ANDI R24,0xF0
BF B22B IN R2,0x1B
C0 2A28 OR R2,R24
C1 BA2B OUT 0x1B,R2
(0037) LCD_en_write();
C2 DFE9 RCALL _LCD_en_write
(0038) command=command<<4; //低四位移到高四位
C3 2F84 MOV R24,R20
C4 708F ANDI R24,0xF
C5 9582 SWAP R24
C6 2F48 MOV R20,R24
(0039) LCD_DATA_PORT&=0x0f; //清高四位
C7 B38B IN R24,0x1B
C8 708F ANDI R24,0xF
C9 BB8B OUT 0x1B,R24
(0040) LCD_DATA_PORT|=command&0xf0; //写低四位
CA 2F84 MOV R24,R20
CB 7F80 ANDI R24,0xF0
CC B22B IN R2,0x1B
CD 2A28 OR R2,R24
CE BA2B OUT 0x1B,R2
(0041) LCD_en_write();
CF DFDC RCALL _LCD_en_write
D0 9149 LD R20,Y+
D1 9508 RET
_LCD_write_data:
data --> R20
D2 934A ST R20,-Y
D3 2F40 MOV R20,R16
(0042)
(0043) }
(0044)
(0045) void LCD_write_data(unsigned char data) //写数据
(0046) {
(0047) delay_nus(16);
D4 E100 LDI R16,0x10
D5 E010 LDI R17,0
D6 940E 0053 CALL _delay_nus
(0048) LCD_RS_PORT|=LCD_RS; //RS=1
D8 9ADA SBI 0x1B,2
(0049) LCD_DATA_PORT&=0X0f; //清高四位
D9 B38B IN R24,0x1B
DA 708F ANDI R24,0xF
DB BB8B OUT 0x1B,R24
(0050) LCD_DATA_PORT|=data&0xf0; //写高四位
DC 2F84 MOV R24,R20
DD 7F80 ANDI R24,0xF0
DE B22B IN R2,0x1B
DF 2A28 OR R2,R24
E0 BA2B OUT 0x1B,R2
(0051) LCD_en_write();
E1 DFCA RCALL _LCD_en_write
(0052) data=data<<4; //低四位移到高四位
E2 2F84 MOV R24,R20
E3 708F ANDI R24,0xF
E4 9582 SWAP R24
E5 2F48 MOV R20,R24
(0053) LCD_DATA_PORT&=0X0f; //清高四位
E6 B38B IN R24,0x1B
E7 708F ANDI R24,0xF
E8 BB8B OUT 0x1B,R24
(0054) LCD_DATA_PORT|=data&0xf0; //写低四位
E9 2F84 MOV R24,R20
EA 7F80 ANDI R24,0xF0
EB B22B IN R2,0x1B
EC 2A28 OR R2,R24
ED BA2B OUT 0x1B,R2
(0055) LCD_en_write();
EE DFBD RCALL _LCD_en_write
EF 9149 LD R20,Y+
F0 9508 RET
_LCD_set_xy:
address --> R20
y --> R10
x --> R22
F1 940E 012B CALL push_xgsetF00C
F3 2EA2 MOV R10,R18
F4 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;
F5 20AA TST R10
F6 F419 BNE 0x00FA
F7 2F46 MOV R20,R22
F8 5840 SUBI R20,0x80
F9 C002 RJMP 0x00FC
(0063) else address = 0xc0 + x;
FA 2F46 MOV R20,R22
FB 5440 SUBI R20,0x40
(0064) LCD_write_command( address);
FC 2F04 MOV R16,R20
FD DFB5 RCALL _LCD_write_command
FE 940C 0132 JMP pop_xgsetF00C
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
100 940E 0139 CALL push_xgset303C
102 2EC2 MOV R12,R18
103 2EA0 MOV R10,R16
104 814E LDD R20,Y+6
105 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 ); //写地址
106 2D2C MOV R18,R12
107 2D0A MOV R16,R10
108 DFE8 RCALL _LCD_set_xy
109 C005 RJMP 0x010F
(0070) while (*s) // 写显示字符
(0071) {
(0072) LCD_write_data( *s );
10A 01FA MOVW R30,R20
10B 8100 LDD R16,Z+0
10C DFC5 RCALL _LCD_write_data
(0073) s ++;
10D 5F4F SUBI R20,0xFF
10E 4F5F SBCI R21,0xFF
10F 01FA MOVW R30,R20
110 8020 LDD R2,Z+0
111 2022 TST R2
112 F7B9 BNE 0x010A
113 940C 0140 JMP pop_xgset303C
_LCD_write_char:
data --> Y,+2
Y --> R12
X --> R10
115 92AA ST R10,-Y
116 92CA ST R12,-Y
117 2EC2 MOV R12,R18
118 2EA0 MOV R10,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 ); //写地址
119 2D2C MOV R18,R12
11A 2D0A MOV R16,R10
11B DFD5 RCALL _LCD_set_xy
(0081) LCD_write_data( data);
FILE: <library>
11C 810A LDD R16,Y+2
11D DFB4 RCALL _LCD_write_data
11E 90C9 LD R12,Y+
11F 90A9 LD R10,Y+
120 9508 RET
push_xgset300C:
121 935A ST R21,-Y
122 934A ST R20,-Y
123 92BA ST R11,-Y
124 92AA ST R10,-Y
125 9508 RET
pop_xgset300C:
126 90A9 LD R10,Y+
127 90B9 LD R11,Y+
128 9149 LD R20,Y+
129 9159 LD R21,Y+
12A 9508 RET
push_xgsetF00C:
12B 937A ST R23,-Y
12C 936A ST R22,-Y
12D 935A ST R21,-Y
12E 934A ST R20,-Y
12F 92BA ST R11,-Y
130 92AA ST R10,-Y
131 9508 RET
pop_xgsetF00C:
132 90A9 LD R10,Y+
133 90B9 LD R11,Y+
134 9149 LD R20,Y+
135 9159 LD R21,Y+
136 9169 LD R22,Y+
137 9179 LD R23,Y+
138 9508 RET
push_xgset303C:
139 935A ST R21,-Y
13A 934A ST R20,-Y
13B 92DA ST R13,-Y
13C 92CA ST R12,-Y
13D 92BA ST R11,-Y
13E 92AA ST R10,-Y
13F 9508 RET
pop_xgset303C:
140 90A9 LD R10,Y+
141 90B9 LD R11,Y+
142 90C9 LD R12,Y+
143 90D9 LD R13,Y+
144 9149 LD R20,Y+
145 9159 LD R21,Y+
146 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -