?? 洗衣機.lst
字號:
__text_start:
__start:
B5 E5CF LDI R28,0x5F
B6 E0D4 LDI R29,4
B7 BFCD OUT 0x3D,R28
B8 BFDE OUT 0x3E,R29
B9 51C0 SUBI R28,0x10
BA 40D0 SBCI R29,0
BB EA0A LDI R16,0xAA
BC 8308 STD Y+0,R16
BD 2400 CLR R0
BE E7E6 LDI R30,0x76
BF E0F1 LDI R31,1
C0 E011 LDI R17,1
C1 39E7 CPI R30,0x97
C2 07F1 CPC R31,R17
C3 F011 BEQ 0x00C6
C4 9201 ST R0,Z+
C5 CFFB RJMP 0x00C1
C6 8300 STD Z+0,R16
C7 E5E4 LDI R30,0x54
C8 E0F0 LDI R31,0
C9 E6A0 LDI R26,0x60
CA E0B0 LDI R27,0
CB E011 LDI R17,1
CC E000 LDI R16,0
CD BF0B OUT 0x3B,R16
CE 36EA CPI R30,0x6A
CF 07F1 CPC R31,R17
D0 F021 BEQ 0x00D5
D1 95C8 LPM
D2 9631 ADIW R30,1
D3 920D ST R0,X+
D4 CFF9 RJMP 0x00CE
D5 940E 077A CALL _main
_exit:
D7 CFFF RJMP _exit
_Char_Set_XY:
i --> R10
p --> R12
y --> R10
x --> R20
D8 940E 0B0D CALL push_xgsetF03C
DA 2EA2 MOV R10,R18
DB 2F40 MOV R20,R16
DC 9721 SBIW R28,1
DD 84C9 LDD R12,Y+9
DE 84DA LDD R13,Y+10
FILE: F:\AVR洗衣機\洗衣機主機\LCD_Driver.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #define nop() NOP()
(0005)
(0006)
(0007) #define Set_CS() DDRA |= (1<<0);PORTA |= (1<<0)
(0008) #define Set_SID() DDRA |= (1<<1);PORTA |= (1<<1)
(0009) #define Set_SCLK() DDRA |= (1<<2);PORTA |= (1<<2)
(0010)
(0011) #define Clr_CS() DDRA |= (1<<0);PORTA &=~(1<<0)
(0012) #define Clr_SID() DDRA |= (1<<1);PORTA &=~(1<<1)
(0013) #define Clr_SCLK() DDRA |= (1<<2);PORTA &=~(1<<2)
(0014) #define cls W_1byte(0,0,0x01)//清屏
(0015)
(0016)
(0017) //====================================================================
(0018) //函數聲明
(0019) void Delay(uint ms); //延時子程序
(0020) void W_1byte(uchar RW, uchar RS, uchar W_data);
(0021) void Write_8bits(uint W_bits);
(0022) void LCD_Init(void);
(0023) /********************************************************************
(0024) ********************************************************************/
(0025) //===================================================================
(0026)
(0027) /********************************************************************
(0028) 09.5.10
(0029) 影龍 未完成
(0030) 在(x,y)點寫句子,能實現換行功能
(0031) ********************************************************************/
(0032) /*
(0033) void Set_XY_str(uchar x, uchar y, uchar *p)
(0034) {
(0035) uchar counter;
(0036) counter=x*2-1;//把X值賦給COUNTER
(0037) x--;
(0038) switch (y)
(0039) {
(0040) case 1:W_1byte(0,0,(0x80+x));
(0041) case 2:W_1byte(0,0,(0x90+x));
(0042) case 3:W_1byte(0,0,(0x88+x));
(0043) case 4:W_1byte(0,0,(0x98+x));
(0044) }
(0045)
(0046) while(*p != 0)
(0047) {counter++;
(0048) if(counter==16)//假如定時器等于8且為單數行
(0049) {y++;
(0050) counter=1;
(0051) switch (y)
(0052) {
(0053) case 1:W_1byte(0,0,0x80);counter=0;break;
(0054) case 2:W_1byte(0,0,0x90);counter=0;break;
(0055) case 3:W_1byte(0,0,0x88);counter=0;break;
(0056) case 4:W_1byte(0,0,0x98);counter=0;break;
(0057) default:break;
(0058) }
(0059) }
(0060) W_1byte(0,1,*p++);//寫字節數據
(0061) }
(0062) }
(0063) */
(0064)
(0065) void Char_Set_XY(uchar x, uchar y, uchar *p)
(0066) {
(0067) uchar i;
(0068)
(0069) switch (y)
DF 2D6A MOV R22,R10
E0 2777 CLR R23
E1 3060 CPI R22,0
E2 0767 CPC R22,R23
E3 F069 BEQ 0x00F1
E4 3061 CPI R22,1
E5 E0E0 LDI R30,0
E6 077E CPC R23,R30
E7 F081 BEQ 0x00F8
E8 3062 CPI R22,2
E9 E0E0 LDI R30,0
EA 077E CPC R23,R30
EB F099 BEQ 0x00FF
EC 3063 CPI R22,3
ED E0E0 LDI R30,0
EE 077E CPC R23,R30
EF F0B1 BEQ 0x0106
F0 C01B RJMP 0x010C
(0070) {
(0071) case 0:W_1byte(0,0,(0x80+x));break;
F1 2F84 MOV R24,R20
F2 5880 SUBI R24,0x80
F3 8388 STD Y+0,R24
F4 2722 CLR R18
F5 2700 CLR R16
F6 D09A RCALL _W_1byte
F7 C014 RJMP 0x010C
(0072) case 1:W_1byte(0,0,(0x90+x));break;
F8 2F84 MOV R24,R20
F9 5780 SUBI R24,0x70
FA 8388 STD Y+0,R24
FB 2722 CLR R18
FC 2700 CLR R16
FD D093 RCALL _W_1byte
FE C00D RJMP 0x010C
(0073) case 2:W_1byte(0,0,(0x88+x));break;
FF 2F84 MOV R24,R20
100 5788 SUBI R24,0x78
101 8388 STD Y+0,R24
102 2722 CLR R18
103 2700 CLR R16
104 D08C RCALL _W_1byte
105 C006 RJMP 0x010C
(0074) case 3:W_1byte(0,0,(0x98+x));break;
106 2F84 MOV R24,R20
107 5688 SUBI R24,0x68
108 8388 STD Y+0,R24
109 2722 CLR R18
10A 2700 CLR R16
10B D085 RCALL _W_1byte
(0075) default:break;
(0076) }
(0077) nop();
10C 0000 NOP
(0078) for(i=0;p[i]!='\0';i++)
10D 24AA CLR R10
10E C00B RJMP 0x011A
(0079) {
(0080) W_1byte(0,1,p[i]);
10F 2DEA MOV R30,R10
110 27FF CLR R31
111 0DEC ADD R30,R12
112 1DFD ADC R31,R13
113 8020 LDD R2,Z+0
114 8228 STD Y+0,R2
115 E021 LDI R18,1
116 2700 CLR R16
117 D079 RCALL _W_1byte
(0081) nop();
118 0000 NOP
119 94A3 INC R10
11A 2DEA MOV R30,R10
11B 27FF CLR R31
11C 0DEC ADD R30,R12
11D 1DFD ADC R31,R13
11E 8020 LDD R2,Z+0
11F 2022 TST R2
120 F771 BNE 0x010F
(0082) }
(0083) nop();
121 0000 NOP
122 9621 ADIW R28,1
123 940C 0B16 JMP pop_xgsetF03C
_Set_XY:
y --> R10
x --> R20
125 940E 0AF1 CALL push_xgsetF00C
127 2EA2 MOV R10,R18
128 2F40 MOV R20,R16
129 9721 SBIW R28,1
(0084) }
(0085)
(0086) void Set_XY(uchar x,uchar y)
(0087) {
(0088) nop();
12A 0000 NOP
(0089) switch (y)
12B 2D6A MOV R22,R10
12C 2777 CLR R23
12D 3060 CPI R22,0
12E 0767 CPC R22,R23
12F F069 BEQ 0x013D
130 3061 CPI R22,1
131 E0E0 LDI R30,0
132 077E CPC R23,R30
133 F081 BEQ 0x0144
134 3062 CPI R22,2
135 E0E0 LDI R30,0
136 077E CPC R23,R30
137 F099 BEQ 0x014B
138 3063 CPI R22,3
139 E0E0 LDI R30,0
13A 077E CPC R23,R30
13B F0B1 BEQ 0x0152
13C C01B RJMP 0x0158
(0090) {
(0091) case 0:W_1byte(0,0,(0x80+x));break;
13D 2F84 MOV R24,R20
13E 5880 SUBI R24,0x80
13F 8388 STD Y+0,R24
140 2722 CLR R18
141 2700 CLR R16
142 D04E RCALL _W_1byte
143 C014 RJMP 0x0158
(0092) case 1:W_1byte(0,0,(0x90+x));break;
144 2F84 MOV R24,R20
145 5780 SUBI R24,0x70
146 8388 STD Y+0,R24
147 2722 CLR R18
148 2700 CLR R16
149 D047 RCALL _W_1byte
14A C00D RJMP 0x0158
(0093) case 2:W_1byte(0,0,(0x88+x));break;
14B 2F84 MOV R24,R20
14C 5788 SUBI R24,0x78
14D 8388 STD Y+0,R24
14E 2722 CLR R18
14F 2700 CLR R16
150 D040 RCALL _W_1byte
151 C006 RJMP 0x0158
(0094) case 3:W_1byte(0,0,(0x98+x));break;
152 2F84 MOV R24,R20
153 5688 SUBI R24,0x68
154 8388 STD Y+0,R24
155 2722 CLR R18
156 2700 CLR R16
157 D039 RCALL _W_1byte
(0095) default:break;
(0096) }
(0097) nop();
158 0000 NOP
159 9621 ADIW R28,1
15A 940C 0AF8 JMP pop_xgsetF00C
(0098) }
(0099)
(0100) void Display_init(void)
(0101) {
(0102) Clr_CS();
_Display_init:
15C 9AD0 SBI 0x1A,0
15D 98D8 CBI 0x1B,0
(0103) Clr_SID();
15E 9AD1 SBI 0x1A,1
15F 98D9 CBI 0x1B,1
(0104) Clr_SCLK();
160 9AD2 SBI 0x1A,2
161 98DA CBI 0x1B,2
(0105) LCD_Init();
162 D001 RCALL _LCD_Init
163 9508 RET
_LCD_Init:
cmd --> R20
164 934A ST R20,-Y
165 9721 SBIW R28,1
(0106) /* //while(1){
(0107) nop();
(0108) nop();
(0109) W_1byte(0,0,0x80); //顯示的地址0x80
(0110) nop();
(0111) for(i=0;mynew1[i]!='\0';i++)
(0112) {
(0113) W_1byte(0,1,mynew1[i]);
(0114) }
(0115) W_1byte(0,0,0x90); //顯示的地址0x90
(0116) for(i=0;mynew2[i]!='\0';i++)
(0117) {
(0118) W_1byte(0,1,mynew2[i]);
(0119) }
(0120) W_1byte(0,0,0x88); //顯示的地址0x88
(0121) for(i=0;mynew3[i]!='\0';i++)
(0122) {
(0123) W_1byte(0,1,mynew3[i]);
(0124) }
(0125) W_1byte(0,0,0x98); //顯示的地址0x98
(0126) for(i=0;mynew4[i]!='\0';i++)
(0127) {
(0128) W_1byte(0,1,mynew4[i]);
(0129) }
(0130) nop();
(0131) // for(;;)
(0132) // {
(0133) // continue;
(0134) // }
(0135) // }
(0136) */
(0137) }
(0138) /******************************************************************/
(0139) void LCD_Init(void)
(0140) {
(0141) uchar cmd;
(0142) cmd=0x30; //功能設置 8位數據,基本指令
166 E340 LDI R20,0x30
(0143) W_1byte(0,0,cmd);
167 8348 STD Y+0,R20
168 2722 CLR R18
169 2700 CLR R16
16A D026 RCALL _W_1byte
(0144) Delay(2);
16B E002 LDI R16,2
16C E010 LDI R17,0
16D D09A RCALL _Delay
(0145) cmd=0x0C; //顯示狀態 ON,游標OFF,反白OFF
16E E04C LDI R20,0xC
(0146) W_1byte(0,0,cmd); //寫指令
16F 8348 STD Y+0,R20
170 2722 CLR R18
171 2700 CLR R16
172 D01E RCALL _W_1byte
(0147) Delay(2);
173 E002 LDI R16,2
174 E010 LDI R17,0
175 D092 RCALL _Delay
(0148) cmd=0x01; //清除顯示
176 E041 LDI R20,1
(0149) W_1byte(0,0,cmd); //寫指令
177 8348 STD Y+0,R20
178 2722 CLR R18
179 2700 CLR R16
17A D016 RCALL _W_1byte
(0150) Delay(2);
17B E002 LDI R16,2
17C E010 LDI R17,0
17D D08A RCALL _Delay
(0151) cmd=0x02; //地址歸位
17E E042 LDI R20,2
(0152) W_1byte(0,0,cmd); //寫指令
17F 8348 STD Y+0,R20
180 2722 CLR R18
181 2700 CLR R16
182 D00E RCALL _W_1byte
(0153) Delay(2);
183 E002 LDI R16,2
184 E010 LDI R17,0
185 D082 RCALL _Delay
(0154) cmd=0x80; //設置DDRAM地址
186 E840 LDI R20,0x80
(0155) W_1byte(0,0,cmd); //寫指令
187 8348 STD Y+0,R20
188 2722 CLR R18
189 2700 CLR R16
18A D006 RCALL _W_1byte
(0156) Delay(2); //延時
18B E002 LDI R16,2
18C E010 LDI R17,0
18D D07A RCALL _Delay
18E 9621 ADIW R28,1
18F 9149 LD R20,Y+
190 9508 RET
_W_1byte:
H_data --> R22
S_ID --> R10
L_data --> R20
W_data --> R12
RS --> R14
RW --> R20
191 940E 0AD2 CALL push_xgsetF0FC
193 2EE2 MOV R14,R18
194 2F40 MOV R20,R16
195 84CA LDD R12,Y+10
(0157) }
(0158) /*******************************************************************
(0159) 函 數 名:W_1byte
(0160) 入口參數:RW、RS、W_data
(0161) 出口參數:無
(0162) 建立日期:2007年3月3日
(0163) 修改日期:
(0164) 函數作用:寫一個字節的數據到12864液晶,包括指令和數據
(0165) 說 明:RW=1,從液晶讀數據到MCU;RW=0,寫一個數據到液晶;
(0166) (一般RW都設為0,即只向液晶寫數據,不讀數據)
(0167) RS=1,寫入的是數據;RS=0,寫入的是指令;
(0168) 一般模式:RW=0,RS=1;寫數據
(0169) RW=0,RS=0;寫指令
(0170) ********************************************************************/
(0171) void W_1byte(uchar RW, uchar RS, uchar W_data)
(0172) {
(0173) uint H_data,L_data,S_ID = 0xf8; //11111RWRS0
196 EF88 LDI R24,0xF8
197 E090 LDI R25,0
198 015C MOVW R10,R24
(0174) nop();
199 0000 NOP
(0175) if(RW == 0)
19A 2344 TST R20
19B F419 BNE 0x019F
(0176) {
(0177) S_ID &=~ 0x04;
19C 7F8B ANDI R24,0xFB
19D 015C MOVW R10,R24
(0178) }
19E C003 RJMP 0x01A2
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -