找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)驅(qū)動(dòng)1602顯示屏的練習(xí),備注詳細(xì)!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
之前自己練習(xí)1602液晶顯示的成果,1602的驅(qū)動(dòng)編寫和調(diào)用里面解釋很詳細(xì)了
結(jié)合我的解釋,仔細(xì)看我編程的結(jié)構(gòu)和思路
慢慢的你會(huì)對(duì)1602的使用有所了解
自己專研下肯定會(huì)讓你收益頗豐,
發(fā)出來(lái)也是對(duì)自己學(xué)習(xí)的鼓勵(lì)吧!加油各位�。�



  1. /**************************************************/
  2. /*
  3.                         1602 模擬顯示車輛速度、溫度、油量
  4.         1.歡迎語(yǔ)句 Welcome GXUST    第二行car system
  5.         2.        place select 1 2 3    功能選項(xiàng)
  6.         3.輪流顯示1.speed
  7.                           2.temperatuer
  8.                           3.oil mass
  9.                           
  10. 我一直認(rèn)為單片機(jī)是開(kāi)放的,可以思考的,我做的這份
  11. 是個(gè)引子,讀者看懂了自然可以快速自己加入自己想顯示的字符。
  12. ***************************************************/
  13. #include<reg52.h>
  14. #include<stdio.h>
  15. #include<intrins.h>
  16. #define Data P0//數(shù)據(jù)端口
  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";        /*這些是定義字符串,方便顯示調(diào)用*/
  29. void DelayUs(unsigned char us)//微秒級(jí)延時(shí)函數(shù)
  30. {
  31.         unsigned char uscnt;
  32.         uscnt=us>>1;
  33.         while(--uscnt);
  34. }
  35. void DelayMs(unsigned int ms) //毫秒級(jí)延時(shí)函數(shù)
  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)//寫命令函數(shù)
  46. {
  47.         DelayMs(5);//操作前短暫延時(shí),保證信號(hào)穩(wěn)定
  48.         E=0;           //使能清零
  49.         RS=0;           //選擇寫命令
  50.         RW=0;           //選擇寫入
  51. //        _nop_();   //延時(shí)一會(huì)
  52. //        E=1;
  53.         Data=c;           //送數(shù)
  54.         DelayMs(1);
  55.         E=1;
  56.         DelayMs(5);//等待寫入完成
  57.         E=0;
  58. }

  59. void WriteData(unsigned char c) //寫數(shù)據(jù)函數(shù)
  60. {
  61.         DelayMs(5);//操作前短暫延時(shí),保證信號(hào)穩(wěn)定
  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)//寫字符函數(shù)  哪個(gè)位置寫
  72. {
  73.         unsigned char p;
  74.         if (pos>=0x10)
  75.         p=pos+0xb0; //是第二行則命令代碼高4位為0xc     從第二行開(kāi)始寫
  76.         else
  77.         p=pos+0x80; //是第二行則命令代碼高4位為0x8     從第一行的POS開(kāi)始寫
  78.         WriteCommand (p);//寫命令
  79.         WriteData (c);//寫數(shù)據(jù)
  80. }
  81. void lcd_sfm(unsigned char add,unsigned char date)//顯示位置和數(shù)據(jù) 在哪里add顯示 顯示數(shù)據(jù)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)//寫字符串函數(shù)         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));//循環(huán)顯示16個(gè)字符
  96. }

  97. void InitLcd()//初始化函數(shù)
  98. {
  99.         DelayMs(15);
  100.         WriteCommand(0x38); //display mode
  101.         WriteCommand(0x38); //display mode
  102.         WriteCommand(0x38); //display mode
  103.         WriteCommand(0x06); //顯示光標(biāo)移動(dòng)位置
  104.         WriteCommand(0x0c); //顯示開(kāi)及光標(biāo)設(shè)置 不顯示光標(biāo)
  105.         WriteCommand(0x01); //顯示清屏
  106. //        WriteCommand(0x80+0x10);  //設(shè)定數(shù)據(jù)指針起始點(diǎn)
  107. }


  108. unsigned char keyscan() //鍵盤掃描函數(shù)
  109. {
  110.         char a=0;
  111.                 GPIO_KEY=0x0f;   //P1口值準(zhǔn)備
  112.                         if(GPIO_KEY!=0x0f)
  113.                         {
  114.                                 DelayMs(10);   //延時(shí)消抖
  115.                                 if(GPIO_KEY!=0x0f)//再次判斷
  116.                                 {
  117.                                         GPIO_KEY=0x0f;  //再次裝值準(zhǔn)備
  118.                                         switch(GPIO_KEY)  //測(cè)試行
  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,判斷準(zhǔn)備
  126.                                         switch(GPIO_KEY) //測(cè)試行
  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)) //判斷是否松手,假若沒(méi)有松手,一段延時(shí)后依舊判斷松手完成
  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()//進(jìn)入界面
  161. {
  162.         DelayMs(15);//延時(shí)保證信號(hào)穩(wěn)定
  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;   //跳變沿觸發(fā)
  172.         EX0=1;   //開(kāi)外部中斷允許
  173.         EA=1;    //開(kāi)總中斷
  174. }
  175. void main(void)//主函數(shù)
  176. {
  177.                         
  178.         InitLcd();        //初始化
  179.         jin();      //進(jìn)入界面
  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. }
復(fù)制代碼





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

TIM截圖20180627230656.png

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

91.72 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5

1602顯示

1602液晶資料.pdf

261.92 KB, 下載次數(shù): 11, 下載積分: 黑幣 -5

1602的數(shù)據(jù)手冊(cè)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:627828 發(fā)表于 2019-10-22 14:47 | 只看該作者
謝謝分享,趕緊學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

樓主
ID:68429 發(fā)表于 2018-6-28 22:25 來(lái)自觸屏版 | 只看該作者
很好的資料
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表