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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PIC單片機驅動LCD12864顯示字符源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:192549 發表于 2017-4-23 00:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <pic.h>       //調用頭文件,可以去PICC軟件下去查找PIC16F87XA單片機的頭文件
  2. __CONFIG(XT&WDTDIS&LVPDIS);   
  3. //定義配置字,晶振類型:XT,關閉開門狗,禁止低電壓編程
  4. #define Rs  RB0 //并行數據/控制字選擇 H:數據  L:控制字
  5. #define RW  RB1 //并行讀/寫選擇       H:讀    L:寫
  6. #define E   RB2 //并行讀寫使能        H有效,下降沿鎖定數據
  7. #define Psb RB3 //串口,并口選擇       H:并口  L:串口(開發板上引腳標識為CS1)
  8. #define Rst RB5 //復位引腳            L:液晶復位
  9. //---------------------------------------
  10. //名稱: 延時函數

  11. //-----------------------------------------
  12. void delay(unsigned int t)
  13. {
  14. unsigned int i,j;
  15. for(i=0;i<t;i++)
  16. {
  17.   for(j=0;j<10;j++)
  18.   {
  19.    asm("NOP");
  20.   }
  21. }
  22. }
  23. //---------------------------------------
  24. //名稱: 數據總線處理函數

  25. //ND118開發板中,因為布線的原因液晶的8位數據總線和單片機的8位數據線
  26. //是反的,所以需要調換過來,即DB0-RD7、DB1-RD6。。。。DB7-RD0
  27. //-----------------------------------------
  28. void write_bus(unsigned char buf)
  29. {
  30. if(buf&0x01) RD7=1;   
  31. else RD7=0;
  32. if(buf&0x02) RD6=1;   
  33. else RD6=0;
  34. if(buf&0x04) RD5=1;   
  35. else RD5=0;
  36. if(buf&0x08) RD4=1;   
  37. else RD4=0;
  38. if(buf&0x10) RD3=1;   
  39. else RD3=0;
  40. if(buf&0x20) RD2=1;   
  41. else RD2=0;
  42. if(buf&0x40) RD1=1;   
  43. else RD1=0;
  44. if(buf&0x80) RD0=1;
  45. else RD0=0;
  46. }
  47. //---------------------------------------
  48. //名稱: 寫命令字節到12864函數

  49. //-----------------------------------------
  50. void write_com(unsigned char cmdcode)
  51. {
  52. unsigned int ii=20000;
  53. Rs=0;                    //設置該字節數據為命令代碼
  54. RW=1;                    //設置此次操作為讀
  55. E=1;                     //使能
  56. TRISD=0B11111111;     //RD設置為輸入
  57. while((PORTD&0X01)&&(ii>0))          //讀忙狀態,不忙時退出
  58. {
  59.   ii--;
  60. }
  61. E=0;                    //失能
  62. TRISD=0B00000000;    //RD設置為輸出
  63. Rs=0;                   //設置該字節數據為控制命令
  64. RW=0;                   //設置此次操作為讀寫
  65. write_bus(cmdcode);     //通過數據總線處理函數將命令字寫進總線中去
  66. E=1;                    //使能寫
  67. asm("NOP");             //略加延遲
  68. asm("NOP");
  69. asm("NOP");
  70. E=0;                    //失能寫
  71. }
  72. //---------------------------------------
  73. //名稱: 寫數據字節到12864函數

  74. //-----------------------------------------
  75. void write_data(unsigned char Rsspdata)
  76. {
  77. unsigned int ii=20000;
  78. Rs=0;                    //設置該字節數據為命令代碼
  79. RW=1;                    //設置此次操作為讀
  80. E=1;                     //使能
  81. TRISD=0B11111111;     //RD設置為輸入
  82. while((PORTD&0X01)&&(ii>0))          //讀忙狀態,不忙時退出
  83. {
  84.   ii--;
  85. }
  86. E=0;                    //失能
  87. TRISD=0B00000000;    //RD設置為輸出
  88. Rs=1;                   //設置該字節數據為數據
  89. RW=0;                   //設置此次操作為讀寫
  90. write_bus(Rsspdata);    //通過數據總線處理函數將命令字寫進總線中去
  91. E=1;                    //使能寫
  92. asm("NOP");             //略加延遲
  93. asm("NOP");
  94. asm("NOP");
  95. E=0;                    //失能寫
  96. }
  97. //---------------------------------------
  98. //名稱: 寫地址函數
  99. //輸入參數:x,y:顯示字符串的位置,x:0-7,y:0-3

  100. //-----------------------------------------
  101. void write_xy(unsigned char x,unsigned char y)
  102. {
  103. unsigned char address;
  104. switch(y){
  105.   case 0:address=0x80+x;break;  //第一行的首地址是0x80
  106.   case 1:address=0x90+x;break;  //第二行的首地址是0x90
  107.   case 2:address=0x88+x;break;  //第三行的首地址是0x88
  108.   case 3:address=0x98+x;break;  //第四行的首地址是0x98
  109.   default:address=0x80+x;
  110.    }
  111. write_com(address);
  112. }
  113. //---------------------------------------
  114. //名稱: 初始化LCD屏

  115. //-----------------------------------------
  116. void init_lcd(void)
  117. {
  118. Rst=0;           //復位液晶
  119. delay(250);      //加些延時
  120. delay(250);
  121. Rst=1;           //復位結束
  122. delay(250);      //加些延時
  123. Psb=1;           //選擇8bit并口

  124. write_com(0x30);  //基本指令集  
  125. write_com(0x0c);  //顯示開
  126. write_com(0x06);  //光標右移,整體顯示不移動
  127. write_com(0x01);  //清除顯示(清零DDRAM)
  128. delay(250);

  129. }
  130. //---------------------------------------
  131. //名稱: 指定地址中英文字符串顯示函數

  132. //-----------------------------------------
  133. void write_string(unsigned char x,unsigned char y,const unsigned char *s)
  134. {
  135. write_xy(x,y);   //先寫入地址參數
  136. while(*s)        //只要字符串沒寫完就繼續寫
  137. {
  138.   write_data(*s); //寫入一個字符串數據
  139.   s++;            //指針轉到下一個
  140.   delay(10);
  141. }
  142. }
  143. //---------------------------------------
  144. //名稱: 整行中英文字符串顯示函數

  145. //-----------------------------------------
  146. void lcd12864_dis_oneline(unsigned char line,const unsigned char *p)
  147. {
  148.   unsigned char c;
  149.   switch(line%4)
  150.   {
  151.     case 0:   
  152.             write_com(0x80);  //第一行的首地址為0x80
  153.             for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
  154.             {
  155.               write_data(*p);
  156.               p++;
  157.               if(*p==0)
  158.               {
  159.                 break;
  160.               }
  161.             }   
  162.             break;
  163.     case 1:
  164.             write_com(0x90);  //第二行的首地址為0x90
  165.             for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
  166.             {
  167.               write_data(*p);
  168.             p++;
  169.               if(*p==0)
  170.               {
  171.                 break;
  172.               }
  173.             }   
  174.             break;
  175.     case 2:
  176.             write_com(0x88);  //第三行的首地址為0x88
  177.             for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
  178.             {
  179.               write_data(*p);
  180.               p++;
  181.               if(*p==0)
  182.               {
  183.                 break;
  184.               }
  185.             }   
  186.             break;
  187.     case 3:
  188.             write_com(0x98);  //第四行的首地址為0x98
  189.             for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
  190.             {
  191.               write_data(*p);
  192.               p++;
  193.               if(*p==0)
  194.               {
  195.                 break;
  196.               }
  197.             }   
  198.             break;
  199.     default : break;
  200.   }
  201. }
  202. //---------------------------------------
  203. //名稱: 主函數   

  204. //-----------------------------------------
  205. void main(void)
  206. {   
  207.    TRISB=0B11000000;    //RB0-5設置為輸出
  208. TRISD=0B00000000;    //RD設置為輸出
  209.    init_lcd();             //初始化12864
  210. write_string(0,0,"XXXX電子有限");
  211.     write_string(0,1,"公司");
  212. write_string(0,2,"MovingChip.com");
  213. write_string(0,3,"0574-86878555");
  214. while(1)
  215. {  

  216. }  
  217. }

復制代碼

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

使用道具 舉報

沙發
ID:215984 發表于 2018-6-22 17:28 | 只看該作者
PIC關于LCD12864驅動的文章很少,學習了。有個問題想請教樓主:可否不要并串口的選擇口,還有就是一定要復位嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天综合天天 | 中文字幕电影在线观看 | 香蕉婷婷 | 免费观看一级毛片 | 99久久夜色精品国产亚洲96 | 成人三级视频 | 懂色av蜜桃av | 欧美在线一区二区三区 | 国产精品美女久久久久久不卡 | 久久久久免费精品国产 | 国产一区二区免费 | 日本天天色 | 成人高清在线 | 日产精品久久久一区二区福利 | 国产在线观看一区 | 永久精品| 日韩超碰在线 | 久久国产99| 精品欧美一区二区三区精品久久 | 日本一区精品 | 欧美日韩国产在线 | 懂色av一区二区三区在线播放 | 精品国产一区二区三区性色av | 久久国产综合 | 亚洲69p| 精品久久久久一区二区国产 | 国产精品毛片无码 | 99精品99| 国产精品毛片一区二区在线看 | 久久久久国产 | 亚洲欧美日韩国产综合 | 精品欧美乱码久久久久久 | 欧美午夜一区 | 网络毛片| 久久这里只有精品首页 | 国产日韩欧美 | 综合五月 | 亚洲精品久久久一区二区三区 | 亚洲精品久久久一区二区三区 | 日韩三级视频 | 99国产精品99久久久久久粉嫩 |