?? 1.lst
字號:
__start:
__text_start:
4C E5CF LDI R28,0x5F
4D E0D4 LDI R29,4
4E BFCD OUT 0x3D,R28
4F BFDE OUT 0x3E,R29
50 51C0 SUBI R28,0x10
51 40D0 SBCI R29,0
52 EA0A LDI R16,0xAA
53 8308 STD Y+0,R16
54 2400 CLR R0
55 EAE4 LDI R30,0xA4
56 E0F0 LDI R31,0
57 E010 LDI R17,0
58 3BE7 CPI R30,0xB7
59 07F1 CPC R31,R17
5A F011 BEQ 0x005D
5B 9201 ST R0,Z+
5C CFFB RJMP 0x0058
5D 8300 STD Z+0,R16
5E E5E4 LDI R30,0x54
5F E0F0 LDI R31,0
60 E6A0 LDI R26,0x60
61 E0B0 LDI R27,0
62 E010 LDI R17,0
63 E000 LDI R16,0
64 BF0B OUT 0x3B,R16
65 39E8 CPI R30,0x98
66 07F1 CPC R31,R17
67 F021 BEQ 0x006C
68 95C8 LPM
69 9631 ADIW R30,1
6A 920D ST R0,X+
6B CFF9 RJMP 0x0065
6C 940E 0478 CALL _main
_exit:
6E CFFF RJMP _exit
FILE: C:\DOCUME~1\qiuqiu\桌面\測試\1\lcd.h
(0001)
(0002) #define LCD_EN_PORT PORTB //以下2個要設為同一個口
(0003) #define LCD_EN_DDR DDRB
(0004) #define LCD_RS_PORT PORTB //以下2個要設為同一個口
(0005) #define LCD_RS_DDR DDRB
(0006) #define LCD_DATA_PORT PORTB //以下3個要設為同一個口
(0007) #define LCD_DATA_DDR DDRB //一定要用高4位
(0008) #define LCD_DATA_PIN PINB
(0009)
(0010) #define LCD_RS (1<<PB7) //0x80 portB7 out
(0011) #define LCD_EN (1<<PB6) //0x60 portB6 out
(0012) #define LCD_DATA ((1<<PB5)|(1<<PB4)|(1<<PB3)|(1<<PB2))
(0013)
(0014) unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'};
(0015) /*--------------------------------------------------------------------------------------------------
(0016) 函數聲明
(0017) --------------------------------------------------------------------------------------------------*/
(0018) void LCD_init(void);
(0019) void LCD_en_write(void);
(0020) void LCD_write_command(unsigned char command) ;
(0021) void LCD_write_data(unsigned char data);
(0022) void LCD_set_xy (unsigned char x, unsigned char y);
(0023) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
(0024) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
(0025)
(0026) /*補充*/
(0027) void LCD_write_shu(unsigned int x,unsigned int t,unsigned int n);
(0028) /*補充*/
(0029)
(0030) void delay_nus(unsigned int n);
(0031) void delay_nms(unsigned int n);
(0032)
(0033) void LCD_init(void) //液晶初始化
(0034) {
(0035) LCD_DATA_DDR|=LCD_DATA; //數據口方向為輸出
_LCD_init:
6F B387 IN R24,0x17
70 638C ORI R24,0x3C
71 BB87 OUT 0x17,R24
(0036) LCD_EN_DDR|=LCD_EN; //設置EN方向為輸出
72 9ABE SBI 0x17,6
(0037) LCD_RS_DDR|=LCD_RS; //設置RS方向為輸出
73 9ABF SBI 0x17,7
(0038) LCD_write_command(0x28);
74 E208 LDI R16,0x28
75 D014 RCALL _LCD_write_command
(0039) LCD_en_write();
76 D00D RCALL _LCD_en_write
(0040) delay_nus(40);
77 E208 LDI R16,0x28
78 E010 LDI R17,0
79 D0F8 RCALL _delay_nus
(0041) LCD_write_command(0x28); //4位顯示
7A E208 LDI R16,0x28
7B D00E RCALL _LCD_write_command
(0042) LCD_write_command(0x0c); //顯示開
7C E00C LDI R16,0xC
7D D00C RCALL _LCD_write_command
(0043) LCD_write_command(0x01); //清屏
7E E001 LDI R16,1
7F D00A RCALL _LCD_write_command
(0044) delay_nms(2);
80 E002 LDI R16,2
81 E010 LDI R17,0
82 D107 RCALL _delay_nms
83 9508 RET
(0045) }
(0046)
(0047) void LCD_en_write(void) //液晶使能
(0048) {
(0049) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
84 9AC6 SBI 0x18,6
(0050) delay_nus(1);
85 E001 LDI R16,1
86 E010 LDI R17,0
87 D0EA RCALL _delay_nus
(0051) LCD_EN_PORT&=~LCD_EN;
88 98C6 CBI 0x18,6
89 9508 RET
_LCD_write_command:
temp --> R22
command --> R20
8A 934A ST R20,-Y
8B 936A ST R22,-Y
8C 2F40 MOV R20,R16
(0052) }
(0053)
(0054) void LCD_write_command(unsigned char command) //寫指令
(0055) {
(0056) unsigned char temp;
(0057) command=((command&0b10000000)>>7)|((command&0b01000000)>>5)|((command&0b00100000)>>3)|((command&0b00010000)>>1)|((command&0b00001000)<<1)|((command&0b00000100)<<3)|((command&0b00000010)<<5)|((command&0b00000001)<<7);
8D 2F84 MOV R24,R20
8E 7480 ANDI R24,0x40
8F 2E28 MOV R2,R24
90 9426 LSR R2
91 9426 LSR R2
92 9426 LSR R2
93 9426 LSR R2
94 9426 LSR R2
95 2F84 MOV R24,R20
96 7880 ANDI R24,0x80
97 2E38 MOV R3,R24
98 9436 LSR R3
99 9436 LSR R3
9A 9436 LSR R3
9B 9436 LSR R3
9C 9436 LSR R3
9D 9436 LSR R3
9E 9436 LSR R3
9F 2832 OR R3,R2
A0 2F84 MOV R24,R20
A1 7280 ANDI R24,0x20
A2 9586 LSR R24
A3 9586 LSR R24
A4 9586 LSR R24
A5 2A38 OR R3,R24
A6 2F84 MOV R24,R20
A7 7180 ANDI R24,0x10
A8 9586 LSR R24
A9 2A38 OR R3,R24
AA 2F84 MOV R24,R20
AB 7088 ANDI R24,0x8
AC 0F88 LSL R24
AD 2A38 OR R3,R24
AE 2F84 MOV R24,R20
AF 7084 ANDI R24,4
B0 0F88 LSL R24
B1 0F88 LSL R24
B2 0F88 LSL R24
B3 2A38 OR R3,R24
B4 2F84 MOV R24,R20
B5 7082 ANDI R24,2
B6 0F88 LSL R24
B7 0F88 LSL R24
B8 0F88 LSL R24
B9 0F88 LSL R24
BA 0F88 LSL R24
BB 2A38 OR R3,R24
BC 2F84 MOV R24,R20
BD 7081 ANDI R24,1
BE 0F88 LSL R24
BF 0F88 LSL R24
C0 0F88 LSL R24
C1 0F88 LSL R24
C2 0F88 LSL R24
C3 0F88 LSL R24
C4 0F88 LSL R24
C5 2A38 OR R3,R24
C6 2D43 MOV R20,R3
(0058) delay_nus(16);
C7 E100 LDI R16,0x10
C8 E010 LDI R17,0
C9 D0A8 RCALL _delay_nus
(0059) temp=command<<2;
CA 2F64 MOV R22,R20
CB 0F66 LSL R22
CC 0F66 LSL R22
(0060) LCD_RS_PORT&=~LCD_RS; //RS=0
CD 98C7 CBI 0x18,7
(0061) LCD_DATA_PORT&=0b11000011; //清高四位
CE B388 IN R24,0x18
CF 7C83 ANDI R24,0xC3
D0 BB88 OUT 0x18,R24
(0062) LCD_DATA_PORT|=temp&0b00111100; //寫高四位
D1 2F86 MOV R24,R22
D2 738C ANDI R24,0x3C
D3 B228 IN R2,0x18
D4 2A28 OR R2,R24
D5 BA28 OUT 0x18,R2
(0063) LCD_en_write();
D6 DFAD RCALL _LCD_en_write
(0064) command=command>>2; //低四位移到高四位
D7 9546 LSR R20
D8 9546 LSR R20
(0065) LCD_DATA_PORT&=0b11000011; //清高四位
D9 B388 IN R24,0x18
DA 7C83 ANDI R24,0xC3
DB BB88 OUT 0x18,R24
(0066) LCD_DATA_PORT|=command&0b00111100; //寫低四位
DC 2F84 MOV R24,R20
DD 738C ANDI R24,0x3C
DE B228 IN R2,0x18
DF 2A28 OR R2,R24
E0 BA28 OUT 0x18,R2
(0067) LCD_en_write();
E1 DFA2 RCALL _LCD_en_write
E2 9169 LD R22,Y+
E3 9149 LD R20,Y+
E4 9508 RET
_LCD_write_data:
temp --> R22
data --> R20
E5 934A ST R20,-Y
E6 936A ST R22,-Y
E7 2F40 MOV R20,R16
(0068)
(0069) }
(0070)
(0071) void LCD_write_data(unsigned char data) //寫數據
(0072) {
(0073) unsigned char temp;
(0074) data=((data&0b10000000)>>7)|((data&0b01000000)>>5)|((data&0b00100000)>>3)|((data&0b00010000)>>1)|((data&0b00001000)<<1)|((data&0b00000100)<<3)|((data&0b00000010)<<5)|((data&0b00000001)<<7);
E8 2F84 MOV R24,R20
E9 7480 ANDI R24,0x40
EA 2E28 MOV R2,R24
EB 9426 LSR R2
EC 9426 LSR R2
ED 9426 LSR R2
EE 9426 LSR R2
EF 9426 LSR R2
F0 2F84 MOV R24,R20
F1 7880 ANDI R24,0x80
F2 2E38 MOV R3,R24
F3 9436 LSR R3
F4 9436 LSR R3
F5 9436 LSR R3
F6 9436 LSR R3
F7 9436 LSR R3
F8 9436 LSR R3
F9 9436 LSR R3
FA 2832 OR R3,R2
FB 2F84 MOV R24,R20
FC 7280 ANDI R24,0x20
FD 9586 LSR R24
FE 9586 LSR R24
FF 9586 LSR R24
100 2A38 OR R3,R24
101 2F84 MOV R24,R20
102 7180 ANDI R24,0x10
103 9586 LSR R24
104 2A38 OR R3,R24
105 2F84 MOV R24,R20
106 7088 ANDI R24,0x8
107 0F88 LSL R24
108 2A38 OR R3,R24
109 2F84 MOV R24,R20
10A 7084 ANDI R24,4
10B 0F88 LSL R24
10C 0F88 LSL R24
10D 0F88 LSL R24
10E 2A38 OR R3,R24
10F 2F84 MOV R24,R20
110 7082 ANDI R24,2
111 0F88 LSL R24
112 0F88 LSL R24
113 0F88 LSL R24
114 0F88 LSL R24
115 0F88 LSL R24
116 2A38 OR R3,R24
117 2F84 MOV R24,R20
118 7081 ANDI R24,1
119 0F88 LSL R24
11A 0F88 LSL R24
11B 0F88 LSL R24
11C 0F88 LSL R24
11D 0F88 LSL R24
11E 0F88 LSL R24
11F 0F88 LSL R24
120 2A38 OR R3,R24
121 2D43 MOV R20,R3
(0075) delay_nus(16);
122 E100 LDI R16,0x10
123 E010 LDI R17,0
124 D04D RCALL _delay_nus
(0076) temp=data<<2;
125 2F64 MOV R22,R20
126 0F66 LSL R22
127 0F66 LSL R22
(0077) LCD_RS_PORT|=LCD_RS; //RS=1
128 9AC7 SBI 0x18,7
(0078) LCD_DATA_PORT&=0b11000011; //清高四位
129 B388 IN R24,0x18
12A 7C83 ANDI R24,0xC3
12B BB88 OUT 0x18,R24
(0079) LCD_DATA_PORT|=temp&0b00111100; //寫高四位
12C 2F86 MOV R24,R22
12D 738C ANDI R24,0x3C
12E B228 IN R2,0x18
12F 2A28 OR R2,R24
130 BA28 OUT 0x18,R2
(0080) LCD_en_write();
131 DF52 RCALL _LCD_en_write
(0081) data=data>>2; //低四位移到高四位
132 9546 LSR R20
133 9546 LSR R20
(0082) LCD_DATA_PORT&=0b11000011; //清高四位
134 B388 IN R24,0x18
135 7C83 ANDI R24,0xC3
136 BB88 OUT 0x18,R24
(0083) LCD_DATA_PORT|=data&0b00111100; //寫低四位
137 2F84 MOV R24,R20
138 738C ANDI R24,0x3C
139 B228 IN R2,0x18
13A 2A28 OR R2,R24
13B BA28 OUT 0x18,R2
(0084) LCD_en_write();
13C DF47 RCALL _LCD_en_write
13D 9169 LD R22,Y+
13E 9149 LD R20,Y+
13F 9508 RET
_LCD_set_xy:
address --> R20
y --> R10
x --> R22
140 940E 064E CALL push_xgsetF00C
142 2EA2 MOV R10,R18
143 2F60 MOV R22,R16
(0085) }
(0086)
(0087)
(0088) void LCD_set_xy( unsigned char x, unsigned char y ) //寫地址函數
(0089) {
(0090) unsigned char address;
(0091) if (y == 0) address = 0x80 + x;
144 20AA TST R10
145 F419 BNE 0x0149
146 2F46 MOV R20,R22
147 5840 SUBI R20,0x80
148 C002 RJMP 0x014B
(0092) else address = 0xc0 + x;
149 2F46 MOV R20,R22
14A 5440 SUBI R20,0x40
(0093) LCD_write_command( address);
14B 2F04 MOV R16,R20
14C DF3D RCALL _LCD_write_command
14D 940C 0655 JMP pop_xgsetF00C
_LCD_write_string:
s --> R20
Y --> R12
X --> R10
14F 940E 065C CALL push_xgset303C
151 2EC2 MOV R12,R18
152 2EA0 MOV R10,R16
153 814E LDD R20,Y+6
154 815F LDD R21,Y+7
(0094) }
(0095)
(0096) void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1
(0097) {
(0098) LCD_set_xy( X, Y ); //寫地址
155 2D2C MOV R18,R12
156 2D0A MOV R16,R10
157 DFE8 RCALL _LCD_set_xy
158 C005 RJMP 0x015E
(0099) while (*s) // 寫顯示字符
(0100) {
(0101) LCD_write_data( *s );
159 01FA MOVW R30,R20
15A 8100 LDD R16,Z+0
15B DF89 RCALL _LCD_write_data
(0102) s ++;
15C 5F4F SUBI R20,0xFF
15D 4F5F SBCI R21,0xFF
15E 01FA MOVW R30,R20
15F 8020 LDD R2,Z+0
160 2022 TST R2
161 F7B9 BNE 0x0159
162 940C 0663 JMP pop_xgset303C
_LCD_write_char:
data --> Y,+2
Y --> R12
X --> R10
164 92AA ST R10,-Y
165 92CA ST R12,-Y
166 2EC2 MOV R12,R18
167 2EA0 MOV R10,R16
(0103) }
(0104)
(0105) }
(0106)
(0107) void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1
(0108) {
(0109) LCD_set_xy( X, Y ); //寫地址
168 2D2C MOV R18,R12
169 2D0A MOV R16,R10
16A DFD5 RCALL _LCD_set_xy
(0110) LCD_write_data( data);
16B 810A LDD R16,Y+2
16C DF78 RCALL _LCD_write_data
16D 90C9 LD R12,Y+
16E 90A9 LD R10,Y+
16F 9508 RET
(0111) }
(0112)
(0113)
(0114)
(0115) void delay_1us(void) //1us延時函數
(0116) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -