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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機驅動1602顯示屏的練習,備注詳細!

[復制鏈接]
跳轉到指定樓層
樓主
之前自己練習1602液晶顯示的成果,1602的驅動編寫和調用里面解釋很詳細了
結合我的解釋,仔細看我編程的結構和思路
慢慢的你會對1602的使用有所了解
自己專研下肯定會讓你收益頗豐,
發出來也是對自己學習的鼓勵吧!加油各位!



  1. /**************************************************/
  2. /*
  3.                         1602 模擬顯示車輛速度、溫度、油量
  4.         1.歡迎語句 Welcome GXUST    第二行car system
  5.         2.        place select 1 2 3    功能選項
  6.         3.輪流顯示1.speed
  7.                           2.temperatuer
  8.                           3.oil mass
  9.                           
  10. 我一直認為單片機是開放的,可以思考的,我做的這份
  11. 是個引子,讀者看懂了自然可以快速自己加入自己想顯示的字符。
  12. ***************************************************/
  13. #include<reg52.h>
  14. #include<stdio.h>
  15. #include<intrins.h>
  16. #define Data P0//數據端口
  17. #define GPIO_KEY P1 //鍵盤口
  18. sbit RS = P2^0; //Pin4
  19. sbit RW = P2^1; //Pin5
  20. sbit E = P2^2; //Pin6
  21. unsigned char KeyValue;
  22. unsigned char kk=0;        
  23. char TimeNum[16]="Welcome GXUSt";
  24. char Test1[16]="car systen";
  25. char Test2[16]="place select 123";
  26. char speed[16]="    1.speed";
  27. char temperatuer[16]="   2.temperatuer";
  28. char oil[16]="    3.oil mass";        /*這些是定義字符串,方便顯示調用*/
  29. void DelayUs(unsigned char us)//微秒級延時函數
  30. {
  31.         unsigned char uscnt;
  32.         uscnt=us>>1;
  33.         while(--uscnt);
  34. }
  35. void DelayMs(unsigned int ms) //毫秒級延時函數
  36. {
  37.         while(--ms)
  38. {
  39.         DelayUs(250);
  40.         DelayUs(250);
  41.         DelayUs(250);
  42.         DelayUs(250);
  43. }
  44. }
  45. void WriteCommand(unsigned char c)//寫命令函數
  46. {
  47.         DelayMs(5);//操作前短暫延時,保證信號穩定
  48.         E=0;           //使能清零
  49.         RS=0;           //選擇寫命令
  50.         RW=0;           //選擇寫入
  51. //        _nop_();   //延時一會
  52. //        E=1;
  53.         Data=c;           //送數
  54.         DelayMs(1);
  55.         E=1;
  56.         DelayMs(5);//等待寫入完成
  57.         E=0;
  58. }

  59. void WriteData(unsigned char c) //寫數據函數
  60. {
  61.         DelayMs(5);//操作前短暫延時,保證信號穩定
  62.         E=0;
  63.         RS=1;
  64.         RW=0;
  65.         _nop_();
  66.         E=1;
  67.         Data=c;
  68.         E=0;
  69.         RS=0;
  70. }
  71. void ShowChar(unsigned char pos,unsigned char c)//寫字符函數  哪個位置寫
  72. {
  73.         unsigned char p;
  74.         if (pos>=0x10)
  75.         p=pos+0xb0; //是第二行則命令代碼高4位為0xc     從第二行開始寫
  76.         else
  77.         p=pos+0x80; //是第二行則命令代碼高4位為0x8     從第一行的POS開始寫
  78.         WriteCommand (p);//寫命令
  79.         WriteData (c);//寫數據
  80. }
  81. void lcd_sfm(unsigned char add,unsigned char date)//顯示位置和數據 在哪里add顯示 顯示數據date
  82. {
  83.         unsigned char shi,ge;
  84.         shi=date/10;
  85.         ge=date%10;
  86.         WriteCommand(0x80+0x40+add);
  87.         WriteData(0x30+shi);
  88.         WriteData(0x30+ge);
  89.         }
  90. void ShowString (unsigned char line,char *ptr)//寫字符串函數         line:行
  91. {
  92.         unsigned char l,i;
  93.         l=line<<4;//若line=0,則地址的高四位為0;若line=1.則地址的高四位為1 寫哪一行
  94.         for (i=0;i<16;i++)
  95.         ShowChar (l++,*(ptr+i));//循環顯示16個字符
  96. }

  97. void InitLcd()//初始化函數
  98. {
  99.         DelayMs(15);
  100.         WriteCommand(0x38); //display mode
  101.         WriteCommand(0x38); //display mode
  102.         WriteCommand(0x38); //display mode
  103.         WriteCommand(0x06); //顯示光標移動位置
  104.         WriteCommand(0x0c); //顯示開及光標設置 不顯示光標
  105.         WriteCommand(0x01); //顯示清屏
  106. //        WriteCommand(0x80+0x10);  //設定數據指針起始點
  107. }


  108. unsigned char keyscan() //鍵盤掃描函數
  109. {
  110.         char a=0;
  111.                 GPIO_KEY=0x0f;   //P1口值準備
  112.                         if(GPIO_KEY!=0x0f)
  113.                         {
  114.                                 DelayMs(10);   //延時消抖
  115.                                 if(GPIO_KEY!=0x0f)//再次判斷
  116.                                 {
  117.                                         GPIO_KEY=0x0f;  //再次裝值準備
  118.                                         switch(GPIO_KEY)  //測試行
  119.                                         {
  120.                                                 case(0x07):KeyValue=0;break; //第一行
  121.                                                 case(0x0b):KeyValue=1;break; //第二行
  122.                                                 case(0x0d):KeyValue=2;break; //第三行
  123.                                                 case(0x0e):KeyValue=3;break; //第四行                                                        
  124.                                         }
  125.                                         GPIO_KEY=0xf0;   //高四位賦1,判斷準備
  126.                                         switch(GPIO_KEY) //測試行
  127.                                         {
  128.                                                 case(0x70):KeyValue=KeyValue;break;           //0-3
  129.                                                 case(0xb0):KeyValue=KeyValue+4;break;  //4-7
  130.                                                 case(0xd0):KeyValue=KeyValue+8;break;  //8-11
  131.                                                 case(0xe0):KeyValue=KeyValue+12;break; //12-15               
  132.                                         }
  133.                                         while((GPIO_KEY!=0x0f)&&(a<20)) //判斷是否松手,假若沒有松手,一段延時后依舊判斷松手完成
  134.                                         {
  135.                                                 DelayMs(5);
  136.                                                 a++;
  137.                                         }
  138.                                         a=0;               
  139.                                 }
  140.                         }         
  141.                         return KeyValue;
  142. }
  143. void cjm()   //初始界面
  144. {
  145.         ShowString(1,Test2);            //顯示plaace
  146.         DelayMs(1000);
  147.         WriteCommand(0x01); //顯示清屏
  148.         
  149.         ShowString(0,speed);            //顯示speed
  150.         DelayMs(1000);
  151.         WriteCommand(0x01); //顯示清屏
  152.         
  153.         ShowString(0,temperatuer);//顯示temperatuer
  154.         DelayMs(1000);
  155.         WriteCommand(0x01); //顯示清屏
  156.         ShowString(0,oil);            //顯示oil
  157.         DelayMs(1000);
  158.         WriteCommand(0x01); //顯示清屏               
  159. }
  160. void jin()//進入界面
  161. {
  162.         DelayMs(15);//延時保證信號穩定
  163.         ShowString(0,TimeNum); //寫字符串
  164.         DelayMs(15);
  165.          ShowString(1,Test1);//寫字符串
  166.         DelayMs(2000);
  167.         WriteCommand(0x01); //顯示清屏

  168. }
  169. void Intput0() //外部中斷
  170. {
  171.         IT0=1;   //跳變沿觸發
  172.         EX0=1;   //開外部中斷允許
  173.         EA=1;    //開總中斷
  174. }
  175. void main(void)//主函數
  176. {
  177.                         
  178.         InitLcd();        //初始化
  179.         jin();      //進入界面
  180.         while(1)
  181.         {         
  182.         kk=keyscan();
  183.         cjm();           
  184.         }
  185. }
  186. void exit0() interrupt 0//中斷處理
  187. {
  188.         if(kk==1)
  189.           {        
  190.                   kk=0;
  191.                   WriteCommand(0x01); //顯示清屏
  192.                 ShowString(0, "the speed is:");
  193.                 ShowString(1, "        0.return");
  194.                 DelayMs(2000);
  195.                 WriteCommand(0x01); //顯示清屏
  196.           }        
  197.           if(kk==2)
  198.           {        
  199.                   kk=0;
  200.                   WriteCommand(0x01); //顯示清屏
  201.                 ShowString(0, "temperatuer is:");
  202.                 ShowString(1, "        0.return");
  203.                 DelayMs(2000);
  204.                 WriteCommand(0x01); //顯示清屏
  205.           }
  206.           if(kk==3)
  207.           {        
  208.                   kk=0;
  209.                   WriteCommand(0x01); //顯示清屏
  210.                 ShowString(0,"the oil is:     ");
  211.                 ShowString(1, "        0.return");
  212.                 DelayMs(2000);
  213.                 WriteCommand(0x01); //顯示清屏
  214.           }
  215.           if(kk==0)                   //返回界面
  216.           {         
  217.                   WriteCommand(0x01); //顯示清屏
  218.                 cjm();
  219.                  jin();
  220.           }               
  221.         kk=0;        
  222. }
復制代碼





TIM截圖20180627230656.png (33.85 KB, 下載次數: 79)

TIM截圖20180627230656.png

1602液晶顯示顯示屏顯示.rar

91.72 KB, 下載次數: 18, 下載積分: 黑幣 -5

1602顯示

1602液晶資料.pdf

261.92 KB, 下載次數: 11, 下載積分: 黑幣 -5

1602的數據手冊

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:68429 發表于 2018-6-28 22:25 來自手機 | 只看該作者
很好的資料
回復

使用道具 舉報

板凳
ID:627828 發表于 2019-10-22 14:47 | 只看該作者
謝謝分享,趕緊學習下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线免费视频 | 91 在线| 国产不卡一 | 99福利视频导航 | 欧美成人在线免费 | 精品一区二区三区在线观看 | 久久久毛片 | 在线成人| www.日本三级 | 久久99网 | 久久国产日韩欧美 | 久久精品免费观看 | 久久久视频在线 | 欧美日韩国产三级 | 欧美一级黑人aaaaaaa做受 | 成人毛片视频免费 | 成人免费小视频 | 精品欧美乱码久久久久久 | 久久精品国产一区二区三区不卡 | 在线观看中文字幕 | 日韩精品一区二区三区高清免费 | 国产成人精品一区二区三区四区 | 中文字幕免费在线 | 日本成人中文字幕 | 亚洲网站在线观看 | 国产激情在线 | 成人毛片一区二区三区 | 亚洲色图插插插 | 亚洲免费观看视频网站 | 福利社午夜影院 | 精品国模一区二区三区欧美 | 一级黄色片免费在线观看 | 中文字幕精品一区 | 欧美美女爱爱 | 日本字幕在线观看 | 婷婷精品 | 91视频导航 | 国产小视频精品 | 一区二区日本 | 久久精品中文字幕 | 国产一区二区三区亚洲 |