📄 ps2lcd.lst
字号:
192 1 LCM_E=0; //若晶振速度太高可以在这后加小的延时
193 1 LCM_E=0; //延时
194 1 LCM_E=1;
195 1 }
196
197 //写指令
198 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
199 {
200 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
201 1 LCM_Data = WCLCM;
202 1 LCM_RS = 0;
203 1 LCM_RW = 0;
204 1 LCM_E = 0;
205 1 LCM_E = 0;
206 1 LCM_E = 1;
207 1 }
208
209 //读数据
210 unsigned char ReadDataLCM(void)
211 {
212 1 LCM_RS = 1;
213 1 LCM_RW = 1;
214 1 LCM_E = 0;
215 1 LCM_E = 0;
216 1 LCM_E = 1;
217 1 return(LCM_Data);
218 1 }
219
220 //读状态
221 unsigned char ReadStatusLCM(void)
222 {
223 1 LCM_Data=0xFF;
224 1 LCM_RS=0;
225 1 LCM_RW=1;
226 1 LCM_E=0;
227 1 LCM_E=0;
228 1 LCM_E=1;
229 1 while(LCM_Data & Busy); //检测忙信号
230 1 return(LCM_Data);
231 1 }
232
233 void LCMInit(void) //LCM初始化
234 {
235 1 LCM_Data=0;
236 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
237 1 Delay5Ms();
238 1 WriteCommandLCM(0x38,0);
239 1 Delay5Ms();
240 1 WriteCommandLCM(0x38,0);
241 1 Delay5Ms();
C51 COMPILER V8.02 PS2LCD 06/02/2007 12:08:11 PAGE 5
242 1
243 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
244 1 WriteCommandLCM(0x08,1); //关闭显示
245 1 WriteCommandLCM(0x01,1); //显示清屏
246 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
247 1 WriteCommandLCM(0x0F,1); // 显示开及光标设置
248 1 }
249
250 //按指定位置显示一个字符
251 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
252 {
253 1 Y &= 0x1;
254 1 X &= 0xF; //限制X不能大于15,Y不能大于1
255 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
256 1 X |= 0x80; //算出指令码
257 1 WriteCommandLCM(X, 1); //发命令字
258 1 WriteDataLCM(DData); //发数据
259 1 }
260
261 //按指定位置显示一串字符
262 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
263 {
264 1 unsigned char ListLength;
265 1
266 1 ListLength = 0;
267 1 Y &= 0x1;
268 1 X &= 0xF; //限制X不能大于15,Y不能大于1
269 1 while (DData[ListLength]>0x20) //若到达字串尾则退出
270 1 {
271 2 if (X <= 0xF) //X坐标应小于0xF
272 2 {
273 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
274 3 ListLength++;
275 3 X++;
276 3 }
277 2 }
278 1 }
279
280 //5ms延时
281 void Delay5Ms(void)
282 {
283 1 unsigned int TempCyc = 5552;
284 1 while(TempCyc--);
285 1 }
286
287 //400ms延时
288 void Delay400Ms(void)
289 {
290 1 unsigned char TempCycA = 5;
291 1 unsigned int TempCycB;
292 1 while(TempCycA--)
293 1 {
294 2 TempCycB=7269;
295 2 while(TempCycB--);
296 2 };
297 1 }
298
299 void Keyboard_out(void) interrupt 0
300 {
301 1 if ((IntNum > 0) && (IntNum < 9))
302 1 {
303 2 KeyV = KeyV >> 1; //因键盘数据是低>>高,所以右移一位
C51 COMPILER V8.02 PS2LCD 06/02/2007 12:08:11 PAGE 6
304 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
305 2 }
306 1 IntNum++;
307 1 while (!Key_CLK); //等待PS/2CLK拉高
308 1
309 1 if (IntNum > 10)
310 1 {
311 2 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
312 2 BF = 1; //标识有字符输入完了
313 2 EA = 0; //关中断等显示完后再开中断
314 2 }
315 1 }
316
317 void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
-+shift的断码+G的断码
318 {
319 1 unsigned char TempCyc;
320 1
321 1 if (!Key_UP) //当键盘松开时
322 1 {
323 2 switch (ScanCode)
324 2 {
325 3 case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
326 3 Key_UP = 1;
327 3 break;
328 3
329 3 case 0x12 : // 左 SHIFT
330 3 Shift = 1;
331 3 break;
332 3
333 3 case 0x59 : // 右 SHIFT
334 3 Shift = 1;
335 3 break;
336 3
337 3 default:
338 3 if (DisNum > 15)
339 3 {
340 4 DisplayListChar(0, 1, Cls);//清LCD第二行
341 4 DisNum = 0;
342 4 }
343 3 if(!Shift) //如果SHIFT没按下
344 3 {
345 4 for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
346 4 if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
347 4 DisNum++;
348 4 }
349 3 else //按下SHIFT
350 3 {
351 4 for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
352 4 if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
353 4 //if (Shifted[TempCyc][0] == 0x4b) DisplayListChar(0, 1, sz);
354 4 DisNum++;
355 4 }
356 3
357 3 break;
358 3 }
359 2 }
360 1 else
361 1 {
362 2 Key_UP = 0;
363 2 switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
364 2 {
C51 COMPILER V8.02 PS2LCD 06/02/2007 12:08:11 PAGE 7
365 3 case 0x12 : // 左 SHIFT
366 3 Shift = 0;
367 3 break;
368 3
369 3 case 0x59 : // 右 SHIFT
370 3 Shift = 0;
371 3 break;
372 3 }
373 2 }
374 1 BF = 0; //标识字符处理完了
375 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 598 ----
CONSTANT SIZE = 278 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -