找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1857|回复: 1
收起左侧

单片机+LCD12864一级菜单显示源程序

[复制链接]
ID:341098 发表于 2020-4-22 18:35 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar   lcd_x,lcd_y,data_byte=0,count;
  6. uint TH_data,TL_data,RH_data,RL_data,CK_data;
  7. uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  8. uchar num,ldata=0,lold=1;


  9. sbit RS = P2^0;//并行指令,数据选择信号
  10. sbit RW = P2^1;//读写信号
  11. sbit EN = P2^2;//并行使能信号
  12. sbit PSB = P2^3;//并串口选择信号
  13. sbit RST = P2^5;//复位信号
  14. sbit key1 = P2^6;        //定义按键1
  15. sbit key2 = P2^7;        //定义按键2


  16. void delay(uint a);//延时函数
  17. void delay0(unsigned int time);//延时函数
  18. void LCD_init();//LCD初始化程序
  19. void write_cmd(uchar cmd);//写指令
  20. void write_data(uchar dat);//写数据
  21. bit check_busy();//检测LCD忙信号
  22. void delay1();//10us延时
  23. void lcd_dis_code(uint cmd_addr,uchar num,uchar dis[]);//显示函数
  24. uchar code lcd0[]={"  科协菜单"};
  25. uchar code lcd1[]={"1:摄像头"};
  26. uchar code lcd2[]={"2:传感器"};
  27. uchar code lcd3[]={"3:液晶显示"};
  28. uchar code lcd4[]={"4:单片机"};
  29. uchar code lcd5[]={"5:红外传感器"};
  30. uchar code lcd6[]={"6:MAX232"};
  31. uchar code lcd7[]={"7:晶振"};
  32. uchar code lcd8[]={"8:单片机"};
  33. uchar code lcd9[]={"9:红外传感器"};
  34. uchar code lcd10[]={"10:MAX232"};
  35. uchar code lcd11[]={"11:晶振"};

  36. void main()
  37.   {        
  38.         LCD_init();
  39.         while(1)
  40.         {                                //循环扫描按键及显示
  41.                 if(key1==0)
  42.                             {                //按键1按下
  43.                                                  delay(5);
  44.                              if(key1==0)
  45.                                        {                //是否是刚按下,是执行,否则不执行
  46.                                                          ldata=ldata+1;        //显示数据加1
  47.                                                          //lold=0;                //处理完,将按键视为按下
  48.                                                }
  49.                             }
  50.                 else if(key2==0)
  51.                              {        //按键2按下
  52.                                                           delay(5);
  53.                                     if(key2==0){                //是否是刚按下,是执行,否则不执行
  54.                                                                         ldata--;        //显示数据减1
  55.                                                                 //        lold=0;                ////处理完,将按键视为按下
  56.                                              }
  57.                                           }
  58.                             switch(ldata)
  59.                                      {
  60.                  
  61.                                        case 0:{
  62.                                                                                lcd_dis_code(0x80,10,lcd0);        
  63.                                                                                lcd_dis_code(0x90,8,lcd1);
  64.                                                                                            lcd_dis_code(0x88,8,lcd2);
  65.                                                                                lcd_dis_code(0x98,12,lcd3);
  66.                                                                                            break;
  67.                                                    }
  68.                                                                     case 1:{
  69.                                                                                lcd_dis_code(0x80,8,lcd4);        
  70.                                                                                lcd_dis_code(0x90,12,lcd5);
  71.                                                                                            lcd_dis_code(0x88,8,lcd6);
  72.                                                                                lcd_dis_code(0x98,5,lcd7);
  73.                                                                                            break;
  74.                                                    }
  75.                                                                    case 2:{
  76.                                                                                lcd_dis_code(0x80,8,lcd8);        
  77.                                                                                lcd_dis_code(0x90,12,lcd9);
  78.                                                                                            lcd_dis_code(0x88,9,lcd10);
  79.                                                                                lcd_dis_code(0x98,12,lcd11);
  80.                                                                                            break;
  81.                                                    }
  82.                                                          }
  83.                                        

  84.                      
  85.        }
  86.   }
  87. void delay1()//延时10us
  88. {
  89.         unsigned char i;
  90.         for(i=0; i<3; i++);
  91. }

  92. /**********************12864模块程序**********************/
  93.   
  94. void lcd_dis_code(uint cmd_addr,uchar num,uchar dis[])
  95. {
  96.         uint i;
  97.         write_cmd(cmd_addr);
  98.         for(i=0; i<num; i++)
  99.                 write_data(dis[i]);
  100. }

  101. void LCD_init()
  102. {
  103.         PSB = 1;
  104.         RST = 0;
  105.         delay(5);
  106.         RST = 1;
  107.           //write_cmd(0x34);//扩充指令
  108.         delay(5);
  109.     write_cmd(0x30);//基本指令
  110.         //delay(5);
  111.         //write_cmd(0x0f);//显示开关光标
  112.         delay(5);
  113.         write_cmd(0x0c);
  114.     delay(10);
  115.         write_cmd(0x01);//清屏
  116.         delay(5);
  117.         write_cmd(0x06);
  118.         delay(20);

  119. }

  120. bit check_busy()
  121. {
  122.         bit temp;
  123.         RS = 0;
  124.         RW = 1;
  125.         EN = 1;
  126.         delay(5);
  127.         temp = (bit)(P0&0x80); //按位与操作
  128.         EN = 0;
  129.         return (temp);
  130. }

  131. void write_cmd(uchar cmd)
  132. {
  133.         while(check_busy());
  134.         RS = 0;
  135.         RW = 0;
  136.         EN = 0;
  137.         delay(5);
  138.         P0 = cmd;
  139.         delay(5);
  140.         EN = 1;
  141.         delay(5);
  142.         EN = 0;        
  143. }

  144. void write_data(uchar dat)
  145. {
  146.         while(check_busy());
  147.         RS = 1;
  148.         RW = 0;
  149.         EN = 0;
  150.         P0 = dat;
  151.         delay(5);
  152.         EN = 1;
  153.         delay(5);
  154.         EN = 0;        
  155. }

  156. void delay(uint a)
  157. {
  158.         uchar i;
  159.         while(a--)
  160.         {
  161.                 for(i=0; i<113; i++);
  162.         }
  163. }
  164. void delay0(unsigned int time)
  165. {
  166.         while(time--);
  167. }
复制代码


评分

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

查看全部评分

回复

使用道具 举报

ID:629438 发表于 2020-5-16 16:13 | 显示全部楼层
不错,谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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