久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2805|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機串口通訊內(nèi)容在1602液晶上顯示的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:367937 發(fā)表于 2018-11-22 21:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己寫了一段將單片機串口控制led燈亮滅,然后在LCD顯示燈狀態(tài)的程序。現(xiàn)有一下問題,向各位壇友請教:1.1602查忙程序,在下面程序130行中,只要我加入了帶忙檢測的清屏語句,LCD就不顯示,但我串口調(diào)試助手還是能接收到返回值(例如ok_1)。而且在我顯示字符串函數(shù)中(72行)加入忙檢測,LCD也不能正常顯示字符。(本人對查忙函數(shù)存在意義還是不怎么明白,只知道需要查忙來確定LCD是否在寫入數(shù)據(jù),防止數(shù)據(jù)丟失)
2.在我字符串定義中(13-15行),如果我在后面加上感嘆號(如“uchar code error[]="error!";"),則我在串口助手中發(fā)送02之后,1602正常顯示,串口助手正常收到返回值ok_2,但無法之后再次發(fā)送數(shù)據(jù),就像串口中斷沒有再次打開一樣,無論我在串口助手中發(fā)送什么,LCD以及串口助手都得不到返回值。但是,如果我縮短數(shù)組長度(如“uchar code error[]="er!";"),則程序正常運行(據(jù)我測試,兩個字母加一個感嘆號是上限了,像off!就已經(jīng)出現(xiàn)跟error!一樣的問題)。
希望有大神能給我解答,感激不盡。

單片機代碼:
  1. #include <reg52.h>
  2. #include <stdio.h>

  3. #define uint  unsigned int
  4. #define uchar unsigned char
  5. #define PORT P2

  6. sbit RS=P3^5;                                                                   //寄存器選擇位  
  7. sbit RW=P3^6;                                                                          //讀寫選擇位
  8. sbit EN=P3^7;                                                                          //使能位
  9. sbit LED=P3^4;

  10. uchar code led_on[]="on";
  11. uchar code led_off[]="off";
  12. uchar code error[]="error";

  13. uchar a,flag_uart,flag_led;

  14. void delay_us(uchar n)                                                  //微秒級別的延時  
  15. {  
  16.         while(n--);  
  17. }  
  18.   
  19. void delay_ms(uint x)                                                          //延時1ms  
  20. {  
  21.         uint i,j;  
  22.         for(i=x;i>0;i--)  
  23.                 for(j=114;j>0;j--);  
  24. }  

  25. void lcd_write_command(uchar command)                        //寫命令函數(shù)
  26. {
  27.         RS=0;
  28.         RW=0;
  29.         PORT=command;
  30.         EN=1;
  31.         delay_us(5);
  32.         EN=0;
  33. }

  34. void lcd_write_data(uchar dat)                                        //寫數(shù)據(jù)函數(shù)
  35. {
  36.         RS=1;
  37.         RW=0;
  38.         PORT=dat;
  39.         EN=1;
  40.         delay_us(5);
  41.         EN=0;
  42. }

  43. void lcd_check_busy()                                                        //查忙函數(shù)
  44. {
  45.         RS=0;
  46.         RW=1;
  47.         PORT=0xFF;                                                                        //51IO口拉高,準(zhǔn)備讀狀態(tài)
  48.         EN=1;
  49.         while(PORT & 0x01);
  50.         EN=0;
  51. }

  52. void lcd_write_command_busy(uchar command)                //帶查忙的寫命令函數(shù)
  53. {
  54.         lcd_check_busy();
  55.         RS=0;
  56.         RW=0;
  57.         PORT=command;
  58.         EN=1;
  59.         delay_us(5);
  60.         EN=0;
  61. }

  62. void lcd_write_str(uchar x,uchar y,uchar *p)        //顯示字符串函數(shù)
  63. {
  64.         if(x==0)
  65.                 lcd_write_command_busy(0x80+y);                        //x=0 第一行顯示
  66.         else
  67.                 lcd_write_command_busy(0xC0+y);                        //x=1 第二行顯示
  68.         while(*p)
  69.         {
  70.                
  71.                 lcd_write_data(*p);                                                //顯示字符串
  72.                 p++;
  73.         }
  74. }

  75. void lcd_init()
  76. {
  77.         delay_ms(15);
  78.         lcd_write_command(0x38);
  79.         delay_ms(5);
  80.         lcd_write_command(0x38);
  81.         delay_ms(5);
  82.         lcd_write_command(0x38);
  83.         lcd_write_command_busy(0x38);
  84.         lcd_write_command_busy(0x0C);                                //開顯示,關(guān)光標(biāo),光標(biāo)不顯示
  85.         lcd_write_command_busy(0x01);                                //清屏
  86.         lcd_write_command_busy(0x06);                                //地址指針+1,光標(biāo)右移
  87. }

  88. void uart_init()
  89. {
  90.         TMOD = 0x20;
  91.         TH1  = 0xfd;
  92.         TL1  = 0xfd;
  93.         TR1  = 1;
  94.         SCON = 0x50;
  95.         EA   = 1;
  96.         ES   = 1;
  97.         
  98. }

  99. void main()
  100. {
  101.         uchar *p;
  102.         p="Light:";
  103.         lcd_init();
  104.         uart_init();
  105.         while(1)
  106.         {
  107.                 lcd_write_str(0,0,p);
  108.                 if(flag_uart==1)
  109.                 {
  110.                         flag_uart=0;
  111.                         ES=0;
  112.                         TI=1;
  113.                         switch(flag_led)
  114.                         {
  115.                                 case 0:
  116.                                         LED=0;
  117.                                         //lcd_write_command_busy(0x01);        //清屏
  118.                                         lcd_write_str(0,0,p);
  119.                                         lcd_write_str(1,5,led_off);
  120.                                         printf("ok_0\n");
  121.                                         break;
  122.                                 case 1:
  123.                                         LED=1;
  124.                                         //lcd_write_command_busy(0x01);        //清屏
  125.                                         lcd_write_str(0,0,p);
  126.                                         lcd_write_str(1,5,led_on);
  127.                                         printf("ok_1\n");
  128.                                         break;
  129.                                 case 2:
  130.                                         lcd_write_str(1,5,error);
  131.                                         printf("ok_2\n");
  132.                                         break;
  133.                         }
  134.                         while(!TI);
  135.                         TI=0;
  136.                         ES=1;
  137.                 }
  138.         }
  139. }

  140. void ser() interrupt 4
  141. {
  142.         RI=0;
  143.         a=SBUF;
  144.         flag_uart=1;
  145.         if (a==0)
  146.                 flag_led=0;
  147.         else if(a==1)
  148.                         flag_led=1;
  149.                 else
  150.                         flag_led=2;
  151. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:396960 發(fā)表于 2018-11-23 09:44 | 只看該作者
main里的第一個 TI =1;干嘛用的??你置一的話,是會進入中斷服務(wù)函數(shù)的? 你的中斷服務(wù)函數(shù)里只對RI操作。。。

那想象下,中斷-------flag_uart = 1;------main------檢測flag_uart =1 后 flag_uart = 0; 然后 TI =1-------中斷----------flag_uart =1 .............死循環(huán)吧???

好好調(diào)下。
回復(fù)

使用道具 舉報

板凳
ID:367937 發(fā)表于 2018-11-23 16:11 | 只看該作者
phang 發(fā)表于 2018-11-23 09:44
main里的第一個 TI =1;干嘛用的??你置一的話,是會進入中斷服務(wù)函數(shù)的? 你的中斷服務(wù)函數(shù)里只對RI操作。 ...

謝謝回答,我已經(jīng)調(diào)試好了,是清屏指令之后需要一定的延遲來給1602的反應(yīng)時間。TI=1并沒有多大意義,進中斷時由RI控制的吧,
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久冷 | 亚洲午夜视频 | 中文字幕av亚洲精品一部二部 | 久久高清国产视频 | 欧美激情一区二区 | 亚洲一区二区视频在线观看 | 九九热在线视频观看这里只有精品 | 亚洲+变态+欧美+另类+精品 | 狠狠的干 | 国产精品99视频 | 欧美一区二区三区在线 | 亚洲成人在线视频播放 | 一区二区视频 | 亚洲美女网站 | 欧美精品成人一区二区三区四区 | 日本小电影在线 | av中文字幕在线播放 | 免费成人高清在线视频 | 亚洲免费在线观看 | 国产探花在线精品一区二区 | 欧美精品成人一区二区三区四区 | cao视频| av国产精品 | 国产精品久久久久久婷婷天堂 | 在线观看亚洲欧美 | 国产精品一区二区视频 | 天天玩天天干天天操 | 精品一区二区不卡 | 日韩视频1 | 美国a级毛片免费视频 | 成人免费黄色 | av三级在线观看 | 精品综合 | 国产一在线观看 | 欧美国产日韩在线观看 | 亚洲大片一区 | 国产精品区一区二区三区 | 亚洲综合在线一区二区 | 在线免费观看黄a | 在线观看免费福利 | 日韩欧美国产一区二区三区 |