📄 testboard1.lst
字号:
235: asm("nop");asm("nop");
236: }
237: /************************************************************
238: 数据发送函数data_send()
239: 作用:发送1字节数据
240: 入口:待发送的数据
241: 出口:无
242: ************************************************************/
243: void data_send(unsigned char data)
244: {
245: unsigned char cnt;
246: GIE=0; //关闭总中断
247: SCB=0;
248: SCB_T=0; //获得总线控制权
249: d100uS(); //起始信号(低电平1mS)
250: d100uS();
251: for(cnt=8;cnt>0;cnt--)
252: {
253: SCB=1; //同步头信号
254: d7uS();
255: if(data&0x80)
256: SCB=1; //输出数据1
257: else
258: SCB=0; //输出数据0
259: d17uS();data<<=1;
260: SCB=0; //位结束信号
261: d7uS();
262: }
263: SCB=1;
264: SCB_T=1; //放弃总线控制权
265: INTF=0;
266: GIE=1; //开总中断
267: }
268: /************************************************************
269: 数据接收函数data_rec()
270: 作用:接收1字节数据
271: 入口:待发送的数据
272: 出口:接收到的一字节数据
273: ************************************************************/
274: unsigned char data_rec(void)
275: {
276: unsigned char cnt,temp;
277: temp=0;
278: SCB_T=1;
279: for(cnt=8;cnt>0;cnt--)
280: {
281: while(SCB); //等待低电平
282: while(!SCB); //等待同步信号头
283: temp<<=1;
284: d17uS(); //延时到数据区
285: if(SCB) //读取数据
286: temp|=0x01;
287: else
288: temp&=0xfe;
289: }
290: return(temp);
291: }
292: /******************************************
293: LCD操作延时函数d256us();
294: 作用:延时256uS;
295: 入口:无;
296: 出口:无;
297: 说明:用于LCD的操作延时
298: *******************************************
299: void d256uS(void)
300: {
301: unsigned char i;
302: for(i=83;i>0;i--);
303: }
304: /******************************************
305: 延时函数d4ms();
306: 作用:延时4ms
307: 入口:无
308: 出口:无
309: 说明:用于LCD初始化
310: ******************************************
311: void d4mS(void)
312: {
313: unsigned int i;
314: for(i=443;i>0;i--);
315: }
316: /******************************************
317: 延时函数d10ms();
318: 作用:延时10ms
319: 入口:无
320: 出口:无
321: ******************************************
322: void d10mS(void)
323: {
324: unsigned int i;
325: for(i=909;i>0;i--);
326: }
327: /******************************************
328: 串行移位寄存器操作函数ttl14164()
329: 作用:传送8BIT数据到74hc164中
330: 入口:待传送的8位数据;
331: 出口:无;
332: 说明:字节传送顺序为MSB->LSB
333: *******************************************
334: void ttl74164(unsigned char data)
335: {
336: unsigned char temp,cnt;
337: temp=data;
338: for(cnt=8;cnt>0;cnt--)
339: {
340: if(temp&0x80)
341: dis_data=1;
342: else
343: dis_data=0;
344: temp=temp<<1;
345: dis_clk=0;
346: dis_clk=1;
347: }
348: dis_data=0;
349: }
350:
351: /******************************************
352: 字符LCD命令写入函数writ_com
353: 作用:向LCD写入命令字节;
354: 入口:待传送的8位数据;
355: 出口:无;
356: 说明:一个字节的命令
357: *******************************************
358: void writ_com(unsigned char command)
359: {
360: dis_rs=0;
361: ttl74164(command);
362: dis_en=1;
363: dis_en=0;
364: d256uS();
365: }
366: /******************************************
367: 字符LCD命令写入函数writ_com
368: 作用:向LCD写入命令字节;
369: 入口:待传送的8位数据;
370: 出口:无;
371: 说明:一个字节的命令
372: *******************************************
373: void writ_data(unsigned char data)
374: {
375: dis_rs=1;
376: ttl74164(data);
377: dis_en=1;
378: dis_en=0;
379: d256uS();
380: }
381: /******************************************
382: 字符LCD初始化函数lcd_init
383: 作用:软件上电初始化
384: 入口:无
385: 出口:无
386: ******************************************
387: void lcd_init(void)
388: {
389: d10mS();d10mS();d10mS();d10mS();
390: writ_com(0x30);
391: d4mS();
392: dis_en=1;dis_en=0;d256uS();
393: dis_en=1;dis_en=0;d256uS();
394: writ_com(0x38);writ_com(0x01);
395: d4mS();
396: writ_com(0x06); writ_com(0x0c);
397: }
398: /******************************************
399: 存储数据转换为显示数据disp_prodata()
400: 作用:将十六进制转成ASCII码
401: 入口:被转换数据
402: 出口:转换后的数据
403: ******************************************
404: unsigned char data_tab(unsigned char data)
405: {
406: unsigned char temp;
407: data&=0x0f;
408: switch(data)
409: {
410: case 0: temp='0';break;
411: case 1: temp='1';break;
412: case 2: temp='2';break;
413: case 3: temp='3';break;
414: case 4: temp='4';break;
415: case 5: temp='5';break;
416: case 6: temp='6';break;
417: case 7: temp='7';break;
418: case 8: temp='8';break;
419: case 9: temp='9';break;
420: case 10: temp='A';break;
421: case 11: temp='B';break;
422: case 12: temp='C';break;
423: case 13: temp='D';break;
424: case 14: temp='E';break;
425: case 15: temp='F';break;
426: }
427: return(temp);
428: }
429: /******************************************
430: 显示刷新函数disp_one_row
431: 作用:将数据送入到LCD中
432: 入口:datapt->数据缓冲区首地址
433: cnt---->数据个数(不大于20,超出部分不显示)
434: row---->选择上下行(0上行显示,1下行显示)
435: 出口:无
436: ******************************************
437: void disp_one_row(unsigned char *datapt,unsigned char cnt,unsigned char row)
438: {
439: unsigned char count;
440: if(row==0)
441: {writ_com(0x80);} //第一行显示地址设置
442: else
443: {writ_com(0xc0);} //第二行显示地址设置
444: //防止数据溢出
445: if(cnt>=20)
446: {cnt=20;count=0;}
447: else
448: {count=20-cnt;}
449: for(;cnt>0;cnt--)
450: {
451: writ_data(*datapt);
452: datapt++;
453: }
454: for(;count>0;count--)
455: {writ_data(' ');}
456: writ_com(0x0c); //开显示
457: }
458: /******************************************
459: 显示刷新函数disp_welcome
460: 作用:显示起画面
461: 入口:无
462: 出口:无
463: ******************************************
464: void disp_loge(const unsigned char *pt,unsigned char cnt,unsigned char par)
465: {
466: if(par==0)
467: {writ_com(0x80);}
468: else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -