找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2869|回复: 3
打印 上一主题 下一主题
收起左侧

单片机+LCD12864液晶简易菜单程序-c语言

[复制链接]
跳转到指定楼层
楼主
ID:111599 发表于 2016-5-13 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机+LCD12864液晶简易菜单程序-c语言12864cd
单片机 LCD12864液晶简易菜单程序-c语言12864cd.rar (1.78 KB, 下载次数: 45)


  1. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  2. /*
  3. Index_Num 数组元素最大序号
  4. Index     数组元素当前序号
  5. Index_P   选中项序号
  6. Index_P_Pre 上一选中项序号,用于快速清理上次所画下的图案
  7. */
  8. #include <reg52.h>
  9. #include <intrins.h>
  10. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  11. #define LCD_data  P0       //数据口
  12. #define Index_Num 8
  13. typedef unsigned char uchar;
  14. typedef unsigned int uint;

  15. sbit Key1 = P1^0;
  16. sbit Key2 = P1^1;
  17. sbit LCD_RS  =  P2^6;      //寄存器选择输入    cs
  18. sbit LCD_RW  =  P2^5;      //液晶读/写控制     sid
  19. sbit LCD_EN  =  P2^7;      //液晶使能控制      clk
  20. sbit LCD_PSB =  P3^2;      //串/并方式控制
  21. sbit LCD_RST =  P3^7;      //液晶复位端口

  22. bdata uchar DataBuf;
  23. uint Index,Index_P_Pre;
  24. uint Index_P=0;
  25. uchar code Weibo[][16]={"hello","呀咦  晗昱","weibo.com","/maixianyu","blog.163.com","maixianyu@126",
  26.         "123","456","789"};
  27. //////////////////////////////////////////////   200us
  28. void delay(int ms)
  29. {
  30. uchar t;  
  31.   while(ms--)  
  32.   {
  33.     for(t=0; t<20; t++) ;  
  34.   }   
  35. }
  36. //////////////////////////////////////////////////////////////////
  37. void Lcd_Write_8bit(uchar msg){
  38. uint i;
  39. uchar DataBuffer;
  40. DataBuffer=msg;
  41. for(i=0;i<8;i++){
  42.   LCD_RW=(bit)(DataBuffer&0x80);
  43.   LCD_EN=1;
  44.   _nop_();
  45.   _nop_();
  46.   LCD_EN=0;
  47.   _nop_();
  48.   _nop_();
  49.   DataBuffer<<=1;
  50. }
  51. }
  52. /////////////////////////////////////////
  53. uchar Lcd_Rec(uint RS){                    
  54. uint i;
  55. uchar Data_H,Data_L;
  56. LCD_RS=1;
  57. if(RS)
  58.   Lcd_Write_8bit(0xfe);
  59. else
  60.   Lcd_Write_8bit(0xfc);  
  61. delayNOP();
  62. for(i=0;i<8;i++){
  63.   LCD_EN=1;
  64.   Data_H=(Data_H<<1)|LCD_RW;
  65.   LCD_EN=0;
  66. }
  67. delayNOP();
  68. for(i=0;i<8;i++){
  69.   LCD_EN=1;
  70.   Data_L=(Data_L<<1)|LCD_RW;  
  71.   LCD_EN=0;
  72. }
  73. LCD_RS=0;
  74. DataBuf=(Data_H<<4)|Data_L;
  75. return DataBuf;
  76. }
  77. /////////////////////////////////////////
  78. bit Lcd_Busy(){
  79. return Lcd_Rec(0)&0x80;
  80. }
  81. /////////////////////////////////////////
  82. void Lcd_Write(uchar msg,uint dc){              //if dc equals 0,msg is a kind of cmd.
  83. while(Lcd_Busy());
  84. if(dc==0)
  85.   DataBuf=0xf8;
  86. else
  87.   DataBuf=0xfa;
  88. delayNOP();
  89. LCD_RS=1;
  90. Lcd_Write_8bit(DataBuf);
  91. delayNOP();
  92. DataBuf=msg&0xf0;
  93. Lcd_Write_8bit(DataBuf);
  94. delayNOP();
  95. DataBuf=(msg<<4)&0xf0;
  96. Lcd_Write_8bit(DataBuf);
  97. LCD_RS=0;
  98. }

  99. ////////////////////////////////////////////////////
  100. void Disp_black()                          //清理上一次画下的痕迹
  101. {
  102.   uchar i,j;
  103.   Lcd_Write(0x34,0);        //写数据时,关闭图形显示
  104. if(Index_P_Pre<2){
  105.    for(i=0+16*Index_P_Pre; i<16+16*Index_P_Pre; i++)
  106.    {
  107.      Lcd_Write(0x80+i,0);
  108.      Lcd_Write(0x80,0);
  109.      for(j=0;j<16;j++)        
  110.    Lcd_Write(0x00,1);   
  111.    }
  112. }else{
  113.    for(i=0+16*(Index_P_Pre-2);i<16+16*(Index_P_Pre-2);i++)
  114.    {
  115.      Lcd_Write(0x80+i,0);
  116.      Lcd_Write(0x88,0);
  117.      for(j=0;j<16;j++)        
  118.     Lcd_Write(0x00,1);   
  119.    }
  120. }
  121.   Lcd_Write(0x36,0);       //写完数据,开图形显示
  122. }
  123. void convertChar(uchar CX)                                        // 反白函数
  124. {
  125. uchar halfLineCnt, basicBlock,lcdPosX,lcdPosY;
  126. // if(f==1)
  127. Disp_black(); //清绘图区
  128. lcdPosY = 0x80;
  129. if (CX == 0)
  130. {
  131.     CX = 0x80;
  132.     halfLineCnt = 16;
  133. }
  134. else if (CX == 1)
  135. {
  136.     CX = 0x80;
  137.     halfLineCnt = 32;
  138. }
  139. else if (CX == 2)
  140. {
  141.     CX = 0x88;
  142.     halfLineCnt = 16;
  143. }
  144. else if (CX == 3)
  145. {
  146.     CX = 0x88;
  147.     halfLineCnt = 32;
  148. }
  149. lcdPosX = CX;

  150.      for (; halfLineCnt != 0; halfLineCnt--)
  151. {
  152.     basicBlock = 16;
  153.     Lcd_Write(0x34,0);
  154.     Lcd_Write(lcdPosY,0);
  155.     Lcd_Write(lcdPosX,0);
  156.     Lcd_Write(0x30,0);

  157.     for (;basicBlock != 0; basicBlock--)
  158.     {
  159.      if (halfLineCnt > 16)
  160.      {
  161.       Lcd_Write(0x00,1);
  162.      }
  163.      else
  164.      {
  165.    Lcd_Write(0xff,1);
  166.      }
  167.     }
  168.     lcdPosY++;
  169. }

  170. Lcd_Write(0x36,0);
  171. Lcd_Write(0x30,0);
  172. }


  173. ///////////////////////////////////////////////////
  174. void Lcd_Pos(uchar x,uchar y){
  175. uchar pos;
  176. if(x==1)
  177.   {x=0x80;}
  178. else if(x==2)
  179.   {x=0x90;}
  180. else if(x==3)
  181.   {x=0x88;}
  182. else if(x==4)
  183.   {x=0x98;}
  184. pos=x+y;
  185. Lcd_Write(pos,0);
  186. }
  187. ///////////////////////////////////////////
  188. void Lcd_Menu(uint Head){
  189. uint j,i;
  190. uint Index_End=Head+3;
  191. // if(Index_End<=Index_Num){
  192.   for(j=0;Head<=Index_End;Head++,j++){
  193.    Lcd_Pos(j+1,0);
  194.    i=0;
  195.    while(i<15){
  196.     if(Weibo[Head][i]!=0)
  197.      Lcd_Write(Weibo[Head][i++],1);
  198.     else{
  199.      Lcd_Write(0x20,1);
  200.      i++;
  201.     }
  202.    }
  203.    delayNOP();
  204.   }
  205. // }
  206. }
  207. ///////////////////////////////////////////
  208. void Lcd_Init(void){
  209. LCD_PSB=0;
  210. LCD_RST=0;
  211. LCD_RS=0;
  212. LCD_RW=1;
  213. LCD_EN=0;
  214. delay(2);
  215. LCD_RST=1;
  216. delay(2);
  217. Lcd_Write(0x30,0);   //ordinary  cmd
  218. delay(2);
  219. Lcd_Write(0x0c,0);   //how to show
  220. delay(2);
  221. Lcd_Write(0x01,0);   //clear
  222. delay(2);
  223. }
  224. /////////////////////////////////////////
  225. void main(void){
  226. Lcd_Init();
  227. Key1=1;
  228. Lcd_Menu(Index);
  229. convertChar(Index_P);
  230. while(1){
  231.   if(Key1==0&&Index>=0){
  232.    delay(5);
  233.    if(Key1==0&&Index>=0){
  234.     if(Index_P==0&&Index>0)
  235.      Lcd_Menu(--Index);
  236.     if(Index_P>0){
  237.      Index_P_Pre=Index_P;
  238.      convertChar(--Index_P);
  239.     }
  240.    }
  241.   }
  242.   if(Key2==0&&Index_P<=3){
  243.    delay(5);
  244.    if(Key2==0&&Index_P<=3){
  245.     if(Index_P==3&&Index<(Index_Num-3))
  246.      Lcd_Menu(++Index);
  247.     if(Index_P<3){
  248.      Index_P_Pre=Index_P;
  249.      convertChar(++Index_P);
  250.     }
  251.    }
  252.   }
  253. }
  254. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:466118 发表于 2019-1-23 10:07 | 只看该作者
小媳妇谢谢分享
回复

使用道具 举报

板凳
ID:284786 发表于 2019-6-3 18:34 | 只看该作者
有个小bug  怎么解决??
回复

使用道具 举报

地板
ID:557774 发表于 2019-6-11 00:13 | 只看该作者
楼主,这个有个小问题呀呀呀!我还不会怎么表达
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表