📄 gps20080503icc.lst
字号:
j --> R22
x10us --> R16
13B 940E 09AA CALL push_xgsetF000
(0086) }
(0087) }
(0088)
(0089) void Delay10us(Word x10us)//crystal=8MHz
(0090) {
(0091) Word i;Byte j; //variable:declare Word
(0092) for(i=0; i<x10us; i++)
13D 2744 CLR R20
13E 2755 CLR R21
13F C00A RJMP 0x014A
(0093) {
(0094) for(j=0;j<2;j++)
140 2766 CLR R22
141 C004 RJMP 0x0146
(0095) {
(0096) NOP();
142 0000 NOP
(0097) NOP();
143 0000 NOP
(0098) NOP();
144 0000 NOP
145 9563 INC R22
146 3062 CPI R22,2
147 F3D0 BCS 0x0142
148 5F4F SUBI R20,0xFF
149 4F5F SBCI R21,0xFF
14A 1740 CP R20,R16
14B 0751 CPC R21,R17
14C F398 BCS 0x0140
14D 940C 09AF JMP pop_xgsetF000
_Hzk_Dis_Words:
ram_address --> R10
i --> R20
lcd_pointer --> R22
xpos --> R12
ypos --> R14
14F 940E 0995 CALL push_xgsetF0FC
151 2EC2 MOV R12,R18
152 2EE0 MOV R14,R16
153 856A LDD R22,Y+10
154 857B LDD R23,Y+11
FILE: D:\SOURCE~1\gps20080503\smg12232zk.h
(0001)
(0002) /****************** SMG12232ZK串行接口程序******************
(0003) * Title : Accessing to LCD-CONTROLLER
(0004) * Date : 2007.10.18
(0005) * Support telephone:
(0006) * Support fax :
(0007) * Create by :
(0008) * DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER
(0009) *******************************************************************/
(0010) #ifndef __SMG12232ZK_H
(0011) #define __SMG12232ZK_H
(0012)
(0013) #define LCD_PORT1 PORTB
(0014) #define LCD_SCLK PB4
(0015) #define LCD_STD PB3
(0016)
(0017) #define LCD_PORT2 PORTC
(0018) #define LCD_CS PC3
(0019)
(0020) #define LCD_CS_H LCD_PORT2 |= BIT(LCD_CS)
(0021) #define LCD_CS_L LCD_PORT2 &=~ BIT(LCD_CS)
(0022) #define LCD_STD_H LCD_PORT1 |= BIT(LCD_STD)
(0023) #define LCD_STD_L LCD_PORT1 &=~ BIT(LCD_STD)
(0024) #define LCD_SCLK_H LCD_PORT1 |= BIT(LCD_SCLK)
(0025) #define LCD_SCLK_L LCD_PORT1 &=~ BIT(LCD_SCLK)
(0026)
(0027)
(0028)
(0029) void Send_8bit(Word x);//串行发送8位数据
(0030) void Lcd_Write(Byte start,Byte data);//模块写入子程序
(0031) void Lcd_Reset(void);//模块复位子程序
(0032) void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer);//xpos为列数,ypos为行数,num字符串长度
(0033) void Hzk_Dis_Data(Byte ypos,Byte xpos,Long data,Byte num);//xpos为列数,ypos为行数,num字符串长度
(0034) void Hzk_Dis_Char(Byte ypos,Byte xpos,char *lcd_pointer,Byte num);//xpos为列数,ypos为行数,num字符串长度
(0035) void Hzk_Dis_Clr(void);//汉字显示清屏
(0036)
(0037) Long lcd_data1;
(0038) Long lcd_data2;
(0039)
(0040) /****************发送汉字子程序******************
(0041) ** xpos为列数,ypos为行数
(0042) **lcd_pointer为字符串首地址
(0043) *********************************************************/
(0044) void Hzk_Dis_Words(Byte ypos,Byte xpos,char *lcd_pointer)//xpos为列数,ypos为行数,num字符串长度
(0045) {
(0046) Byte i=0,ram_address;//ram_address:首地址
155 2744 CLR R20
156 C001 RJMP 0x0158
(0047) //首先判断字符串得长度
(0048) while(*(lcd_pointer+i) != '\0')//字符串长度
(0049) {
(0050) i++;
157 9543 INC R20
158 2FE4 MOV R30,R20
159 27FF CLR R31
15A 0FE6 ADD R30,R22
15B 1FF7 ADC R31,R23
15C 8020 LDD R2,Z+0
15D 2022 TST R2
15E F7C1 BNE 0x0157
(0051) }//i=字符串长度
(0052) if(i>15)
15F E08F LDI R24,0xF
160 1784 CP R24,R20
161 F408 BCC 0x0163
(0053) {
(0054) i=15;
162 E04F LDI R20,0xF
(0055) }
(0056) if(ypos==1)
163 2D8E MOV R24,R14
164 3081 CPI R24,1
165 F429 BNE 0x016B
(0057) {
(0058) ram_address = 0x80+xpos-1;
166 2D8C MOV R24,R12
167 5880 SUBI R24,0x80
168 5081 SUBI R24,1
169 2EA8 MOV R10,R24
(0059) }
16A C007 RJMP 0x0172
(0060) else if(ypos==2)
16B 2D8E MOV R24,R14
16C 3082 CPI R24,2
16D F421 BNE 0x0172
(0061) {
(0062) ram_address = 0x90+xpos-1;
16E 2D8C MOV R24,R12
16F 5780 SUBI R24,0x70
170 5081 SUBI R24,1
171 2EA8 MOV R10,R24
(0063) }
(0064) Lcd_Write(0xf8,ram_address);
172 2D2A MOV R18,R10
173 EF08 LDI R16,0xF8
174 D0A9 RCALL _Lcd_Write
(0065) for(;i>0;i--)
175 C007 RJMP 0x017D
(0066) {
(0067) Lcd_Write(0xfa,*lcd_pointer);
176 01FB MOVW R30,R22
177 8120 LDD R18,Z+0
178 EF0A LDI R16,0xFA
179 D0A4 RCALL _Lcd_Write
(0068) lcd_pointer++;
17A 5F6F SUBI R22,0xFF
17B 4F7F SBCI R23,0xFF
17C 954A DEC R20
17D E080 LDI R24,0
17E 1784 CP R24,R20
17F F3B0 BCS 0x0176
180 940C 098A JMP pop_xgsetF0FC
_Hzk_Dis_Char:
ram_address --> R22
i --> R10
num --> Y,+12
lcd_pointer --> R20
xpos --> R12
ypos --> R14
182 940E 0995 CALL push_xgsetF0FC
184 2EC2 MOV R12,R18
185 2EE0 MOV R14,R16
186 854A LDD R20,Y+10
187 855B LDD R21,Y+11
(0069) }
(0070)
(0071) }
(0072)
(0073) void Hzk_Dis_Char(Byte ypos,Byte xpos,char *lcd_pointer,Byte num)//xpos为列数,ypos为行数,num字符串长度
(0074) {
(0075) Byte i=0,ram_address;//ram_address:首地址
188 24AA CLR R10
(0076) if(ypos==1)
189 2D8E MOV R24,R14
18A 3081 CPI R24,1
18B F421 BNE 0x0190
(0077) {
(0078) ram_address = 0x80+xpos-1;
18C 2D6C MOV R22,R12
18D 5860 SUBI R22,0x80
18E 5061 SUBI R22,1
(0079) }
18F C006 RJMP 0x0196
(0080) else if(ypos==2)
190 2D8E MOV R24,R14
191 3082 CPI R24,2
192 F419 BNE 0x0196
(0081) {
(0082) ram_address = 0x90+xpos-1;
193 2D6C MOV R22,R12
194 5760 SUBI R22,0x70
195 5061 SUBI R22,1
(0083) }
(0084) Lcd_Write(0xf8,ram_address);
196 2F26 MOV R18,R22
197 EF08 LDI R16,0xF8
198 D085 RCALL _Lcd_Write
(0085) for(i=0;i<num;i++)
199 24AA CLR R10
19A C007 RJMP 0x01A2
(0086) {
(0087) Lcd_Write(0xfa,*lcd_pointer);
19B 01FA MOVW R30,R20
19C 8120 LDD R18,Z+0
19D EF0A LDI R16,0xFA
19E D07F RCALL _Lcd_Write
(0088) lcd_pointer++;
19F 5F4F SUBI R20,0xFF
1A0 4F5F SBCI R21,0xFF
1A1 94A3 INC R10
1A2 840C LDD R0,Y+12
1A3 14A0 CP R10,R0
1A4 F3B0 BCS 0x019B
1A5 940C 098A JMP pop_xgsetF0FC
_Hzk_Dis_Data:
ram_address --> R22
lcd_buf --> Y,+0
lcd_pointer --> R22
i --> R10
num --> R20
data --> Y,+25
xpos --> R12
ypos --> R14
1A7 940E 0995 CALL push_xgsetF0FC
1A9 2EC2 MOV R12,R18
1AA 2EE0 MOV R14,R16
1AB 972F SBIW R28,0xF
1AC 8D4D LDD R20,Y+29
(0089) }
(0090)
(0091) }
(0092)
(0093) /****************发送数据子程序******************
(0094) ** xpos为列数,ypos为行数
(0095) **data为数据
(0096) **num数据占用得位数
(0097) *********************************************************/
(0098) void Hzk_Dis_Data(Byte ypos,Byte xpos,Long data,Byte num)
(0099) {
(0100) Byte i=0,ram_address;//ram_address:首地址
1AD 24AA CLR R10
(0101) Byte lcd_buf[15];
(0102) Byte *lcd_pointer;
(0103) if(num<16)
1AE 3140 CPI R20,0x10
1AF F008 BCS 0x01B1
1B0 C055 RJMP 0x0206
(0104) {
(0105) for(i=0;i<num;i++)
1B1 C036 RJMP 0x01E8
(0106) {
(0107) lcd_buf[num-i-1]= data%10+0x30;
1B2 E08A LDI R24,0xA
1B3 E090 LDI R25,0
1B4 E0A0 LDI R26,0
1B5 E0B0 LDI R27,0
1B6 8D09 LDD R16,Y+25
1B7 8D1A LDD R17,Y+26
1B8 8D2B LDD R18,Y+27
1B9 8D3C LDD R19,Y+28
1BA 93BA ST R27,-Y
1BB 93AA ST R26,-Y
1BC 939A ST R25,-Y
1BD 938A ST R24,-Y
1BE 940E 08EE CALL mod32u
1C0 0118 MOVW R2,R16
1C1 0129 MOVW R4,R18
1C2 E380 LDI R24,0x30
1C3 E090 LDI R25,0
1C4 E0A0 LDI R26,0
1C5 E0B0 LDI R27,0
1C6 0E28 ADD R2,R24
1C7 1E39 ADC R3,R25
1C8 1E4A ADC R4,R26
1C9 1E5B ADC R5,R27
1CA 2C3A MOV R3,R10
1CB 2444 CLR R4
1CC 2FE4 MOV R30,R20
1CD 27FF CLR R31
1CE 19E3 SUB R30,R3
1CF 09F4 SBC R31,R4
1D0 01CE MOVW R24,R28
1D1 9701 SBIW R24,1
1D2 0FE8 ADD R30,R24
1D3 1FF9 ADC R31,R25
1D4 8220 STD Z+0,R2
(0108) data /= 10;
1D5 E08A LDI R24,0xA
1D6 E090 LDI R25,0
1D7 E0A0 LDI R26,0
1D8 E0B0 LDI R27,0
1D9 8D09 LDD R16,Y+25
1DA 8D1A LDD R17,Y+26
1DB 8D2B LDD R18,Y+27
1DC 8D3C LDD R19,Y+28
1DD 93BA ST R27,-Y
1DE 93AA ST R26,-Y
1DF 939A ST R25,-Y
1E0 938A ST R24,-Y
1E1 940E 08EC CALL div32u
1E3 8F09 STD Y+25,R16
1E4 8F1A STD Y+26,R17
1E5 8F2B STD Y+27,R18
1E6 8F3C STD Y+28,R19
1E7 94A3 INC R10
1E8 16A4 CP R10,R20
1E9 F240 BCS 0x01B2
(0109) }
(0110) //输入灭零程序
(0111)
(0112) if(ypos==1)
1EA 2D8E MOV R24,R14
1EB 3081 CPI R24,1
1EC F421 BNE 0x01F1
(0113) {
(0114) ram_address = 0x80+xpos-1;
1ED 2D6C MOV R22,R12
1EE 5860 SUBI R22,0x80
1EF 5061 SUBI R22,1
(0115) }
1F0 C006 RJMP 0x01F7
(0116) else if(ypos==2)
1F1 2D8E MOV R24,R14
1F2 3082 CPI R24,2
1F3 F419 BNE 0x01F7
(0117) {
(0118) ram_address = 0x90+xpos-1;
1F4 2D6C MOV R22,R12
1F5 5760 SUBI R22,0x70
1F6 5061 SUBI R22,1
(0119) }
(0120) Lcd_Write(0xf8,ram_address);
1F7 2F26 MOV R18,R22
1F8 EF08 LDI R16,0xF8
1F9 D024 RCALL _Lcd_Write
(0121) lcd_pointer = lcd_buf;
1FA 01BE MOVW R22,R28
(0122) for(i=0;i<num;i++)
1FB 24AA CLR R10
1FC C007 RJMP 0x0204
(0123) {
(0124) Lcd_Write(0xfa,*lcd_pointer);
1FD 01FB MOVW R30,R22
1FE 8120 LDD R18,Z+0
1FF EF0A LDI R16,0xFA
200 D01D RCALL _Lcd_Write
(0125) lcd_pointer++;
201 5F6F SUBI R22,0xFF
202 4F7F SBCI R23,0xFF
203 94A3 INC R10
204 16A4 CP R10,R20
205 F3B8 BCS 0x01FD
(0126) }
(0127) }
206 962F ADIW R28,0xF
207 940C 098A JMP pop_xgsetF0FC
(0128) }
(0129)
(0130)
(0131) void Lcd_Reset(void)
(0132) {
(0133) LCD_CS_H;//片选置高
_Lcd_Reset:
209 9AAB SBI 0x15,3
(0134) Delay_Ms(1);//等待内部复位
20A E001 LDI R16,1
20B E010 LDI R17,0
20C DF10 RCALL _Delay_Ms
(0135) Lcd_Write(0xf8,0x30);//使用基本指令集
20D E320 LDI R18,0x30
20E EF08 LDI R16,0xF8
20F D00E RCALL _Lcd_Write
(0136) Lcd_Write(0xf8,0x0c);//整体显示on
210 E02C LDI R18,0xC
211 EF08 LDI R16,0xF8
212 D00B RCALL _Lcd_Write
(0137) Lcd_Write(0xf8,0x01);//清除显示
213 E021 LDI R18,1
214 EF08 LDI R16,0xF8
215 D008 RCALL _Lcd_Write
(0138) Delay_Ms(5);//4.6ms
216 E005 LDI R16,5
217 E010 LDI R17,0
218 DF04 RCALL _Delay_Ms
(0139) Lcd_Write(0xf8,0x06);//显示右移
219 E026 LDI R18,6
21A EF08 LDI R16,0xF8
21B D002 RCALL _Lcd_Write
(0140) LCD_CS_L;//片选置低
21C 98AB CBI 0x15,3
21D 9508 RET
_Lcd_Write:
com --> R10
start --> R12
21E 92AA ST R10,-Y
21F 92CA ST R12,-Y
220 2EA2 MOV R10,R18
221 2EC0 MOV R12,R16
(0141) }
(0142)
(0143) void Lcd_Write(Byte start,Byte com)//start :起始字节com:命令/数据
(0144) {
(0145) LCD_CS_H;//片选置高
222 9AAB SBI 0x15,3
(0146) Send_8bit(start);
223 2D0C MOV R16,R12
224 2711 CLR R17
225 D01C RCALL _Send_8bit
(0147) Delay_Us(100);//72us
226 E604 LDI R16,0x64
227 DEDF RCALL _Delay_Us
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -