📄 lcd_0108.lst
字号:
1 .file "LCD_0108.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __tmp_reg__ = 0
6 __zero_reg__ = 1
7 .global __do_copy_data
8 .global __do_clear_bss
10 .text
11 .Ltext0:
88 .global BusyOrNot
90 BusyOrNot:
1:LCD\LCD_0108.c **** #include "LCD_0108.H"
2:LCD\LCD_0108.c ****
3:LCD\LCD_0108.c **** #define DefaultRow 0xc0
4:LCD\LCD_0108.c **** #define DefaultColumn 0x40
5:LCD\LCD_0108.c **** #define DefaultPage 0xb8
6:LCD\LCD_0108.c ****
7:LCD\LCD_0108.c **** #define uchar unsigned char
8:LCD\LCD_0108.c **** #define uint unsigned int
9:LCD\LCD_0108.c ****
10:LCD\LCD_0108.c **** uchar Dis_Buf[1024];
11:LCD\LCD_0108.c ****
12:LCD\LCD_0108.c **** uchar AREA=1;
13:LCD\LCD_0108.c **** uchar error_flag=0;
14:LCD\LCD_0108.c ****
15:LCD\LCD_0108.c ****
16:LCD\LCD_0108.c ****
17:LCD\LCD_0108.c **** //////////////////底层函数////////////////////////////////////////////////////////////////
18:LCD\LCD_0108.c ****
19:LCD\LCD_0108.c ****
20:LCD\LCD_0108.c **** /*************************************************/
21:LCD\LCD_0108.c **** /* LCD初始化函数 */
22:LCD\LCD_0108.c **** /*************************************************/
23:LCD\LCD_0108.c **** void InitialLcd(void)
24:LCD\LCD_0108.c **** {
25:LCD\LCD_0108.c **** MCUCR |= (1<<SRE); //使能总线
26:LCD\LCD_0108.c **** //XMCRA |= (1<<SRW00)|(1<<SRW01);//加入等待
27:LCD\LCD_0108.c ****
28:LCD\LCD_0108.c **** SET_RST_OUTPUT(); //设RST为输出
29:LCD\LCD_0108.c **** SET_CSA_OUTPUT(); //设CSA为输出
30:LCD\LCD_0108.c **** SET_CSB_OUTPUT(); //设CSB为输出
31:LCD\LCD_0108.c **** SET_CSA(); //设置CSA CSB为无效状态
32:LCD\LCD_0108.c **** SET_CSB();
33:LCD\LCD_0108.c **** CLR_RST(); //拉地RST复位
34:LCD\LCD_0108.c **** LCDDelay(255); //延时
35:LCD\LCD_0108.c **** SET_RST(); //拉高
36:LCD\LCD_0108.c **** LCDDelay(255); //延时
37:LCD\LCD_0108.c **** ShowLcd(0x00); //关显示
38:LCD\LCD_0108.c **** ClearDisBuf(0x00); //清屏
39:LCD\LCD_0108.c **** UpdateDis();
40:LCD\LCD_0108.c **** LocateLcdPageColumn(0x00,0x00);//定位显示点
41:LCD\LCD_0108.c **** ShowLcd(0x01 ); //开显示
42:LCD\LCD_0108.c **** }
43:LCD\LCD_0108.c ****
44:LCD\LCD_0108.c ****
45:LCD\LCD_0108.c **** /*************************************************/
46:LCD\LCD_0108.c **** /* 判忙函数 出错由全局变量error_flag带出 */
47:LCD\LCD_0108.c **** /*************************************************/
48:LCD\LCD_0108.c **** void BusyOrNot()
49:LCD\LCD_0108.c **** {
91 ze=0) */
92 ldi r25,lo8(0)
93 .L2:
95 .LM1:
96 0000 90E0 lds r24,8200
50:LCD\LCD_0108.c **** uchar _data,i=0;
51:LCD\LCD_0108.c **** while(1)
52:LCD\LCD_0108.c **** {
53:LCD\LCD_0108.c **** _data = CMD_READ; //读命令状态
98 andi r24,lo8(-112)
99 breq .L6
54:LCD\LCD_0108.c **** _data=0x90 & _data;
55:LCD\LCD_0108.c **** if(_data==0x00) break;//比较
101 3:
102 subi r25,lo8(-(1))
103 0006 8079 brne .L2
104 0008 01F0 ldi r24,lo8(1)
56:LCD\LCD_0108.c **** if(i++==255){error_flag=1;return;}//超时错误
105 error_flag,r24
106 .L6:
107 000a 9F5F ret
108 000c 01F4 /* epilogue: frame size=0 */
109 000e 81E0 /* epilogue: noreturn */
110 0010 8093 0000 /* epilogue end (size=0) */
111 /* function BusyOrNot size 13 (13) */
117 .Lscope1:
120 .global WriteCommandToRightArea
122 WriteCommandToRightArea:
124 .LM4:
125 .LFBB2:
126 /* prologue: frame size=0 */
127 push r17
57:LCD\LCD_0108.c **** }
58:LCD\LCD_0108.c **** }
59:LCD\LCD_0108.c ****
60:LCD\LCD_0108.c **** /*************************************************/
61:LCD\LCD_0108.c **** /* 向右区写命令 */
62:LCD\LCD_0108.c **** /*************************************************/
63:LCD\LCD_0108.c **** void WriteCommandToRightArea(uchar Command)
64:LCD\LCD_0108.c **** {
128 ) */
129 mov r17,r24
131 .LM5:
132 0016 1F93 sbi 50-0x20,5
134 0018 182F .LM6:
65:LCD\LCD_0108.c **** CLR_CSB(); //选中右区
135 usyOrNot
137 001a 959A .LM7:
66:LCD\LCD_0108.c **** BusyOrNot(); //判忙
138 s 8192,r17
140 001c 0E94 0000 .LM8:
67:LCD\LCD_0108.c **** CMD_WRITE = Command;//写命令
141 i 50-0x20,5
142 /* epilogue: frame size=0 */
143 0020 1093 0020 pop r17
68:LCD\LCD_0108.c **** SET_CSB(); //释放右区
144 t
145 /* epilogue end (size=2) */
146 0024 9598 /* function WriteCommandToRightArea size 10 (7) */
148 0026 1F91 .Lscope2:
151 .global WriteDataToRightArea
153 WriteDataToRightArea:
155 .LM9:
156 .LFBB3:
157 /* prologue: frame size=0 */
158 push r17
69:LCD\LCD_0108.c **** }
70:LCD\LCD_0108.c ****
71:LCD\LCD_0108.c **** /*************************************************/
72:LCD\LCD_0108.c **** /* 向右区写数据 */
73:LCD\LCD_0108.c **** /*************************************************/
74:LCD\LCD_0108.c **** void WriteDataToRightArea(uchar _Data)
75:LCD\LCD_0108.c **** {
159 (size=1) */
160 mov r17,r24
162 .LM10:
163 002a 1F93 sbi 50-0x20,5
165 002c 182F .LM11:
76:LCD\LCD_0108.c **** CLR_CSB(); //选中右区
166 usyOrNot
168 002e 959A .LM12:
77:LCD\LCD_0108.c **** BusyOrNot(); //判忙
169 s 8208,r17
171 0030 0E94 0000 .LM13:
78:LCD\LCD_0108.c **** DAT_WRITE = _Data; //写数据
172 i 50-0x20,5
173 /* epilogue: frame size=0 */
174 0034 1093 1020 pop r17
79:LCD\LCD_0108.c **** SET_CSB(); //释放右区
175 t
176 /* epilogue end (size=2) */
177 0038 9598 /* function WriteDataToRightArea size 10 (7) */
179 003a 1F91 .Lscope3:
182 .global WriteCommandToLeftArea
184 WriteCommandToLeftArea:
186 .LM14:
187 .LFBB4:
188 /* prologue: frame size=0 */
189 push r17
80:LCD\LCD_0108.c **** }
81:LCD\LCD_0108.c ****
82:LCD\LCD_0108.c **** /*************************************************/
83:LCD\LCD_0108.c **** /* 向左区写命令 */
84:LCD\LCD_0108.c **** /*************************************************/
85:LCD\LCD_0108.c **** void WriteCommandToLeftArea(uchar Command)
86:LCD\LCD_0108.c **** {
190 (size=1) */
191 mov r17,r24
193 .LM15:
194 003e 1F93 sbi 50-0x20,6
196 0040 182F .LM16:
87:LCD\LCD_0108.c **** CLR_CSA(); //选中右区
197 usyOrNot
199 0042 969A .LM17:
88:LCD\LCD_0108.c **** BusyOrNot(); //判忙
200 s 8192,r17
202 0044 0E94 0000 .LM18:
89:LCD\LCD_0108.c **** CMD_WRITE = Command;//写命令
203 i 50-0x20,6
204 /* epilogue: frame size=0 */
205 0048 1093 0020 pop r17
90:LCD\LCD_0108.c **** SET_CSA(); //释放右区
206 t
207 /* epilogue end (size=2) */
208 004c 9698 /* function WriteCommandToLeftArea size 10 (7) */
210 004e 1F91 .Lscope4:
213 .global WriteDataToLeftArea
215 WriteDataToLeftArea:
217 .LM19:
218 .LFBB5:
219 /* prologue: frame size=0 */
220 push r17
91:LCD\LCD_0108.c **** }
92:LCD\LCD_0108.c ****
93:LCD\LCD_0108.c **** /*************************************************/
94:LCD\LCD_0108.c **** /* 向左区写数据 */
95:LCD\LCD_0108.c **** /*************************************************/
96:LCD\LCD_0108.c **** void WriteDataToLeftArea(uchar _Data)
97:LCD\LCD_0108.c **** {
221 (size=1) */
222 mov r17,r24
224 .LM20:
225 0052 1F93 sbi 50-0x20,6
227 0054 182F .LM21:
98:LCD\LCD_0108.c **** CLR_CSA(); //选中右区
228 usyOrNot
230 0056 969A .LM22:
99:LCD\LCD_0108.c **** BusyOrNot(); //判忙
231 s 8208,r17
233 0058 0E94 0000 .LM23:
100:LCD\LCD_0108.c **** DAT_WRITE = _Data; //写数据
234 i 50-0x20,6
235 /* epilogue: frame size=0 */
236 005c 1093 1020 pop r17
101:LCD\LCD_0108.c **** SET_CSA(); //释放右区
237 t
238 /* epilogue end (size=2) */
239 0060 9698 /* function WriteDataToLeftArea size 10 (7) */
241 0062 1F91 .Lscope5:
244 .global ClearDisBuf
246 ClearDisBuf:
248 .LM24:
249 .LFBB6:
250 /* prologue: frame size=0 */
251 /* prologue end (size=0) */
102:LCD\LCD_0108.c **** }
103:LCD\LCD_0108.c ****
104:LCD\LCD_0108.c ****
105:LCD\LCD_0108.c ****
106:LCD\LCD_0108.c ****
107:LCD\LCD_0108.c **** /*************************************************/
108:LCD\LCD_0108.c **** /* 清LCD屏 */
109:LCD\LCD_0108.c **** /*************************************************/
110:LCD\LCD_0108.c **** void ClearDisBuf(uchar val)
111:LCD\LCD_0108.c **** {
252 s_Buf)
253 ldi r31,hi8(Dis_Buf)
254 .L18:
256 .LM25:
257 0066 E0E0 st Z+,r24
258 0068 F0E0 ldi r25,hi8(Dis_Buf+1024)
259 cpi r30,lo8(Dis_Buf+1024)
112:LCD\LCD_0108.c **** uint i;
113:LCD\LCD_0108.c **** for(i=0;i<1024;i++)Dis_Buf[i]=val;
260 ,r25
261 brne .L18
262 006a 8193 /* epilogue: frame size=0 */
263 006c 90E0 ret
264 006e E030 /* epilogue end (size=1) */
265 0070 F907 /* function ClearDisBuf size 8 (7) */
267 .Lscope6:
270 .global ShowLcd
272 ShowLcd:
274 .LM26:
275 .LFBB7:
276 /* prologue: frame size=0 */
277 push r17
114:LCD\LCD_0108.c **** }
115:LCD\LCD_0108.c ****
116:LCD\LCD_0108.c **** /*************************************************/
117:LCD\LCD_0108.c **** /* 更新显示 */
118:LCD\LCD_0108.c **** /*************************************************/
119:LCD\LCD_0108.c **** void UpdateDis(void)
120:LCD\LCD_0108.c **** {
121:LCD\LCD_0108.c **** uchar Page,Column;
122:LCD\LCD_0108.c **** uchar *p = Dis_Buf;
123:LCD\LCD_0108.c **** for(Page=0,Column=0;Page<8;Page++)
124:LCD\LCD_0108.c **** {
125:LCD\LCD_0108.c **** LocateLcdPageColumn(Page,Column);//定位右区页和列
126:LCD\LCD_0108.c **** for(Column=0;Column<64;Column++)WriteDataToRightArea(*p++);//写右区
127:LCD\LCD_0108.c **** LocateLcdPageColumn(Page,Column);//定位左区页和列
128:LCD\LCD_0108.c **** for(Column=64;Column<128;Column++)WriteDataToLeftArea(*p++);//写左区
129:LCD\LCD_0108.c **** }
130:LCD\LCD_0108.c **** LocateLcdPageColumn(0x00,0x00);//定位显示点
131:LCD\LCD_0108.c **** ShowLcd(0x01 ); //开显示
132:LCD\LCD_0108.c **** }
133:LCD\LCD_0108.c ****
134:LCD\LCD_0108.c ****
135:LCD\LCD_0108.c **** /*************************************************/
136:LCD\LCD_0108.c **** /* 开关LCD显示 */
137:LCD\LCD_0108.c **** /*************************************************/
138:LCD\LCD_0108.c **** void ShowLcd(uchar on)//LCD的显示开关,on=0x00,关;on=0x01,开.
139:LCD\LCD_0108.c **** {
278 ize=1) */
280 .LM27:
281 mov r17,r24
282 0076 1F93 subi r17,lo8(-(62))
140:LCD\LCD_0108.c **** uchar temp;
141:LCD\LCD_0108.c **** temp=0x3E; //00111110B
142:LCD\LCD_0108.c **** temp+=on;
284
285 mov r24,r17
286 0078 182F call WriteCommandToRightArea
143:LCD\LCD_0108.c **** WriteCommandToRightArea(temp);
288 29:
289 mov r24,r17
290 007c 812F call WriteCommandToLeftArea
291 007e 0E94 0000 /* epilogue: frame size=0 */
144:LCD\LCD_0108.c **** WriteCommandToLeftArea(temp);
292 r17
293 ret
294 0082 812F /* epilogue end (size=2) */
295 0084 0E94 0000 /* function ShowLcd size 11 (8) */
300 .Lscope7:
303 .global LocateLcdColumn
305 LocateLcdColumn:
307 .LM30:
308 .LFBB8:
309 /* prologue: frame size=0 */
310 /* prologue end (size=0) */
145:LCD\LCD_0108.c **** }
146:LCD\LCD_0108.c ****
147:LCD\LCD_0108.c **** //定位列
148:LCD\LCD_0108.c **** void LocateLcdColumn(uchar Column)
149:LCD\LCD_0108.c **** {
311 M31-.LFBB8
312 .LM31:
313 mov r25,r24
314 subi r25,lo8(-(64))
150:LCD\LCD_0108.c **** uchar temp;
151:LCD\LCD_0108.c **** temp = DefaultColumn;//01000000B
152:LCD\LCD_0108.c **** temp += Column;
316 :
317 cpi r24,lo8(64)
318 008c 982F brlo .L26
153:LCD\LCD_0108.c **** if(Column>63)
320 3:
321 call WriteCommandToLeftArea
322 0090 8034 ret
323 0092 00F0 .L26:
154:LCD\LCD_0108.c **** {
155:LCD\LCD_0108.c **** temp -= 64; //为数据写入指示右区
156:LCD\LCD_0108.c **** WriteCommandToLeftArea(temp); //定位右区列
324 abn 68,0,158,.LM34-.LFBB8
325 .LM34:
326 0094 0E94 0000 mov r24,r25
327 0098 0895 call WriteCommandToRightArea
328 ret
157:LCD\LCD_0108.c **** }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -