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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2904|回復: 2
打印 上一主題 下一主題
收起左側

關于單片機串口通訊內容在1602液晶上顯示的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:367937 發表于 2018-11-22 21:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己寫了一段將單片機串口控制led燈亮滅,然后在LCD顯示燈狀態的程序。現有一下問題,向各位壇友請教:1.1602查忙程序,在下面程序130行中,只要我加入了帶忙檢測的清屏語句,LCD就不顯示,但我串口調試助手還是能接收到返回值(例如ok_1)。而且在我顯示字符串函數中(72行)加入忙檢測,LCD也不能正常顯示字符。(本人對查忙函數存在意義還是不怎么明白,只知道需要查忙來確定LCD是否在寫入數據,防止數據丟失)
2.在我字符串定義中(13-15行),如果我在后面加上感嘆號(如“uchar code error[]="error!";"),則我在串口助手中發送02之后,1602正常顯示,串口助手正常收到返回值ok_2,但無法之后再次發送數據,就像串口中斷沒有再次打開一樣,無論我在串口助手中發送什么,LCD以及串口助手都得不到返回值。但是,如果我縮短數組長度(如“uchar code error[]="er!";"),則程序正常運行(據我測試,兩個字母加一個感嘆號是上限了,像off!就已經出現跟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)                        //寫命令函數
  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)                                        //寫數據函數
  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()                                                        //查忙函數
  44. {
  45.         RS=0;
  46.         RW=1;
  47.         PORT=0xFF;                                                                        //51IO口拉高,準備讀狀態
  48.         EN=1;
  49.         while(PORT & 0x01);
  50.         EN=0;
  51. }

  52. void lcd_write_command_busy(uchar command)                //帶查忙的寫命令函數
  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)        //顯示字符串函數
  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);                                //開顯示,關光標,光標不顯示
  85.         lcd_write_command_busy(0x01);                                //清屏
  86.         lcd_write_command_busy(0x06);                                //地址指針+1,光標右移
  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. }
復制代碼

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

使用道具 舉報

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

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

好好調下。
回復

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 二区亚洲| 免费观看av | 午夜视频网站 | 视频在线一区二区 | 99精品热视频 | 免费看片国产 | 中文字幕亚洲欧美 | 国产精品中文字幕一区二区三区 | 电影91久久久 | 精品国产精品三级精品av网址 | 在线国产视频 | 国产精品一区二区福利视频 | 一区二区在线不卡 | 色婷婷激情综合 | 久久久久久久久久久一区二区 | 日日天天| 91日b| 日韩精品久久久 | 国产91在线 | 中日 | 91久久国产综合久久91精品网站 | 日韩电影a | 国产a级毛片 | 亚洲成人一区 | 中文字幕免费视频 | 97伦理 | 国产成人免费一区二区60岁 | www.av在线 | 国产福利免费视频 | 欧美不卡一区二区三区 | 国产精品色一区二区三区 | 毛片视频网站 | 国产精品一区在线观看 | 国产女人与拘做受视频 | 国产精品亚洲精品日韩已方 | 涩爱av一区二区三区 | 新91| 你懂的国产 | 国产在线www | 亚洲先锋影音 | 欧美综合久久 | 精品国产高清一区二区三区 |