找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD12864显示例程(导航旋钮组合框)无字库的

[复制链接]
跳转到指定楼层
楼主
ID:903342 发表于 2021-7-11 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
带你玩转LCD12864

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define DATABUS P1

  7. #endif
  8. sbit RS = P2^0;
  9. sbit RW = P2^1;       
  10. sbit EN = P2^2;       
  11. sbit CS1 = P2^4;       
  12. sbit CS2 = P2^5;  
  13. sbit PIN4 =P3^0;  
  14. sbit PIN3 =P3^1;  
  15. sbit PIN1 =P3^2;
  16. void delay300ms();           //延时300ms
  17. void Delay2ms(void);         //延时20ms
  18. void Init(void);                                            //初始化
  19. void OnOff(uchar onoff);      //屏幕开关
  20. void Clear(void);             //清屏
  21. void Write_Com(uchar com);    //写命令
  22. void Write_Data(uchar Data);  //写数据
  23. void Select_Screen(uchar cs); //选择左右半屏
  24. void Set_Page(uchar page);    //页选择函数
  25. void Set_Row(uchar row);      //行选择函数
  26. void Set_Rank(uchar rank);    //列选择函数
  27. void Show_Im_128x64(uchar *Im);  //128x64图像显示
  28. void Show_Im_64x64(uchar screen,uchar *Im);  //64x64图像显示
  29. void Show_ImWo_32x32(uchar screen,uchar page,uchar rank,uchar *ImWo);  //32x32字符显示
  30. void Show_ImWo_16x16(uchar screen,uchar page,uchar rank,uchar *ImWo);  //16x16字符显示
  31. void Show_Num_16x64(uchar screen,uchar page,uchar *Num);               //16x64数字显示
  32. void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu);          //菜单显示

  33. //延时2ms
  34. void Delay2ms()         
  35. {
  36.         uchar i, j;
  37.         i = 1;
  38.         j = 5;
  39.         do
  40.         {
  41.                 while (--j);
  42.         } while (--i);
  43. }

  44. //300ms
  45. void delay300ms()
  46. {
  47.         unsigned char i, j, k;

  48.         _nop_();
  49.         i = 3;
  50.         j = 26;
  51.         k = 223;
  52.         do
  53.         {
  54.                 do
  55.                 {
  56.                         while (--k);
  57.                 } while (--j);
  58.         } while (--i);
  59. }


  60. //初始化屏幕
  61. void Init(void)
  62. {
  63.         Select_Screen(0);
  64.         OnOff(1);
  65.         Clear();
  66.        
  67.         Select_Screen(1);
  68.         OnOff(1);
  69.         Clear();
  70.        
  71. }       

  72. //屏幕开关
  73. void OnOff(uchar onoff)      
  74. {
  75.         onoff = onoff | 0x3E;  //0关1开
  76.         Write_Com(onoff);
  77. }

  78. //清屏
  79. void Clear(void)
  80. {
  81.         uchar i,j;
  82.         Set_Page(0);
  83.         Set_Row (0);
  84.         Set_Rank(0);
  85.         for(i = 0;i < 8;i++){
  86.                 Set_Page(i);
  87.                 for(j = 0;j < 64;j++){
  88.                         Write_Data(0x00);
  89.                 }
  90.         }
  91. }       

  92. //写命令
  93. void Write_Com(uchar com)
  94. {
  95.         RS = 0;RW = 0;EN = 0;
  96.         DATABUS = com;
  97.         EN = 1;
  98.         Delay2ms();
  99.         EN = 0;
  100. }  

  101. //写数据
  102. void Write_Data(uchar Data)
  103. {
  104.         RS = 1;RW = 0;EN = 0;
  105.         DATABUS=Data;
  106.         EN = 1;
  107.         Delay2ms();
  108.         EN = 0;
  109. }
  110.        
  111. //屏幕选择函数
  112. void Select_Screen(uchar cs)
  113. {
  114.         switch(cs){
  115.                 case 0:CS1 = 1;CS2 = 0;break;   //左半屏
  116.                 case 1:CS1 = 0;CS2 = 1;break;   //右半屏
  117.                 default: CS1 = 1;CS2 = 0;break;
  118.         }
  119. }

  120. void Set_Page(uchar page)
  121. {
  122.         page = 0xB8 | page;
  123.         Write_Com(page);
  124. }       


  125. void Set_Row(uchar row)
  126. {
  127.         row = 0xC0 | row;
  128.         Write_Com(row);
  129. }       


  130. void Set_Rank(uchar rank)
  131. {
  132.         rank = rank & 0x3F;  
  133.         rank = rank | 0x40;  
  134.         Write_Com(rank);
  135. }

  136. //128x64图像
  137. void Show_Im_128x64(uchar *Im)
  138. {
  139.         uchar i,j;
  140.         Select_Screen(0);   //左半
  141.         for(i = 0;i < 8;i++){
  142.                 Set_Page(i);
  143.                 for(j = 0;j < 64;j++){
  144.                         Write_Data(Im[i*128+j]);
  145.                 }
  146.         }
  147.        
  148.         Select_Screen(1);   //右半
  149.         for(i = 0;i < 8;i++){
  150.                 Set_Page(i);
  151.                 for(j = 64;j < 128;j++){
  152.                         Write_Data(Im[i*128+j]);
  153.                 }
  154.         }
  155.        
  156. }       


  157. void Show_Im_128x32(uchar *Im)
  158. {
  159.         uchar i,j;
  160.         Select_Screen(0);   //左半
  161.         for(i = 0;i < 4;i++){
  162.                 Set_Page(i);
  163.                 for(j = 0;j < 64;j++){
  164.                         Write_Data(Im[i*128+j]);
  165.                 }
  166.         }
  167.        
  168.         Select_Screen(1);   //右半
  169.         for(i = 0;i < 4;i++){
  170.                 Set_Page(i);
  171.                 for(j = 64;j < 128;j++){
  172.                         Write_Data(Im[i*128+j]);
  173.                 }
  174.         }
  175.        
  176. }       


  177. //64x64
  178. void Show_Im_64x64(uchar screen,uchar *Im)
  179. {
  180.         uchar i, j;
  181.         Select_Screen(screen);
  182.         for(i = 0;i < 8;i++){
  183.                 Set_Page(i);
  184.                 for(j = 0;j < 64;j++){
  185.                         Write_Data(Im[i*64+j]);
  186.                 }
  187.         }
  188. }  

  189. //32x32
  190. void Show_ImWo_32x32(uchar screen,uchar page,uchar rank,uchar *ImWo)
  191. {
  192.         uchar i, j;
  193.         //Init();
  194.         Select_Screen(screen);
  195.         for(i = 0;i < 4;i++){
  196.                 Set_Page(page+i);
  197.                 Set_Rank(rank);
  198.                 for(j = 0;j < 32;j++){
  199.                         Write_Data(ImWo[i*32+j]);
  200.                 }
  201.         }
  202. }

  203. //16x16
  204. void Show_ImWo_16x16(uchar screen,uchar page,uchar rank,uchar *ImWo)
  205. {
  206.         uchar i, j;
  207.         //Init();
  208.         Select_Screen(screen);
  209.         for(i = 0;i < 2;i++){
  210.                 Set_Page(page+i);
  211.                 Set_Rank(rank);
  212.                 for(j = 0;j < 16;j++){
  213.                         Write_Data(ImWo[i*16+j]);
  214.                 }
  215.         }
  216. }

  217. //16x64
  218. void Show_Num_16x64(uchar screen,uchar page,uchar *Num)
  219. {
  220.         uchar i, j;
  221.         Select_Screen(screen);
  222.         Set_Page(page);
  223.         for(i = 0;i < 8;i++){
  224.                 for(j = 0;j < 8;j++){
  225.                         Write_Data(Num[16*i+j]);
  226.                 }
  227.         };
  228.         Set_Page(page+1);
  229.         for(i = 0;i < 8;i++){
  230.                 for(j = 0;j < 8;j++){
  231.                         Write_Data(Num[16*i+j+8]);
  232.                 }
  233.         };
  234. }

  235. //菜单
  236. void Show_Menu(bit sel,uchar screen,uchar page,uchar *menu)
  237. {
  238.         uchar n;
  239.         if(sel) n=128;
  240.         else n=0;
  241.        
  242.         Show_ImWo_16x16(screen,page,0,&menu[0+n]);
  243.         Show_ImWo_16x16(screen,page,16,&menu[32+n]);
  244.         Show_ImWo_16x16(screen,page,32,&menu[64+n]);
  245.         Show_ImWo_16x16(screen,page,48,&menu[96+n]);

  246. }       

  247. bit Click; //单击信号
  248. bit D_Click;
  249. bit Clock_Wise;   //顺时针信号
  250. bit A_Clock_Wise; //逆时针信号
  251.                 uchar sta=0;

  252. //"熊猫",128*64
  253. uchar code panda[] =
  254. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  255. 0xFF,0xFF,0xFF,0x03,0xAB,0xAB,0xA9,0xAA,0xAB,0xAB,0xAB,0x03,0xFF,0xFF,0xFF,0xFF,
  256. 0xBF,0xCF,0xFF,0xFC,0xC6,0xBE,0xBE,0xBA,0xA6,0xBE,0xBE,0x8C,0xFF,0xF7,0xCF,0xFF};/*"?",3*/




  257. //判断单击信号
  258. void Click_Flag()   
  259. {       
  260.         uchar sta[3]={0,0,0};
  261.        
  262.         if(PIN4==0){
  263.                 Delay2ms();                //????(???????,??????????)
  264.                 if(PIN4==0);sta[0]=1;     //?????
  265.                 Delay2ms();
  266.                 if(PIN4==1) sta[1]=1;     //????
  267.                 Delay2ms();
  268.                 if(PIN4==0) sta[2]=1;     //?????*/
  269.                
  270.                 Click = sta[0];           //???????
  271.                
  272.                 D_Click = sta[0]&sta[1]&sta[2];  //???????
  273.                
  274.                 while(!PIN4);             //????(??????CPU????,???)
  275.         }
  276. }


  277. //中断
  278. void inter() interrupt 0
  279. {     unsigned char Current_PIN3_status,flag,Last_PIN3_status;
  280.                         Last_PIN3_status = PIN3;
  281.                         while(!PIN1)  
  282.                         {
  283.                                 Current_PIN3_status = PIN3;
  284.                                 flag = 1;
  285.                         }
  286.                         if(flag == 1)
  287.                         {
  288.                                 flag = 0;
  289.                                 if((Last_PIN3_status)==0&&(Current_PIN3_status==1))
  290.                                 Clock_Wise = 1;//顺时针
  291.                                 if((Last_PIN3_status)==1&&(Current_PIN3_status==0))
  292.                                 A_Clock_Wise = 1;//逆时针
  293.                         }
  294. }

  295. //选择菜单1
  296. void show_menu1 ()
  297. {
  298.                 Clock_Wise=0;//???????
  299.                 A_Clock_Wise=0;//???????
  300.                 Show_Menu(1,0,0,menu1);
  301.                 Show_Menu(0,0,2,menu2);
  302.                 Show_Menu(0,0,4,menu3);
  303.                
  304. }

  305. //选择菜单2
  306. void show_menu2 ()
  307. {
  308.         Clock_Wise=0;
  309.         A_Clock_Wise=0;
  310.         Show_Menu(0,0,0,menu1);
  311.         Show_Menu(1,0,2,menu2);
  312.         Show_Menu(0,0,4,menu3);
  313.        
  314. }

  315. //选择菜单3
  316. void show_menu3 ()
  317. {
  318.         Clock_Wise=0;
  319.         A_Clock_Wise=0;
  320.         Show_Menu(0,0,0,menu1);
  321.         Show_Menu(0,0,2,menu2);
  322.         Show_Menu(1,0,4,menu3);
  323. }

  324. void show_menu1_1 ()
  325. {
  326.                 Clock_Wise=0;
  327.                 A_Clock_Wise=0;
  328.                 Show_Menu(1,1,0,menu1_1);
  329.                 Show_Menu(0,1,2,menu1_2);
  330.                 Show_Menu(0,1,4,menu1_3);
  331.                
  332. }


  333. void show_menu1_2 ()
  334. {
  335.         Clock_Wise=0;
  336.                 A_Clock_Wise=0;
  337.                 Show_Menu(0,1,0,menu1_1);
  338.                 Show_Menu(1,1,2,menu1_2);
  339.                 Show_Menu(0,1,4,menu1_3);
  340.                
  341.        
  342. }


  343. void show_menu1_3 ()
  344. {
  345.         Clock_Wise=0;
  346.                 A_Clock_Wise=0;
  347.                 Show_Menu(0,1,0,menu1_1);
  348.                 Show_Menu(0,1,2,menu1_2);
  349.                 Show_Menu(1,1,4,menu1_3);
  350.                
  351. }


  352. void main()
  353. {
  354.         bit toHead;
  355.        
  356.         IE = 0X81;     //总中断
  357.         IT0 = 1;      //下降沿触发中断
  358.         Init();
  359.         while(1)
  360. {
  361.                 Show_Im_128x64(panda);              //欢迎界面
  362. //                Delay300ms();
  363.         //        Show_ImWo_32x32(1,0,0,wang);
  364.         //        Show_ImWo_32x32(1,0,32,hao);
  365.         //        Show_Num_16x64(1,5,stunum);       
  366.                 Click_Flag();                //判断单击
  367.                 if(Click)
  368.                 {
  369.                         Click=0;                  
  370.                         Select_Screen(0);Clear();
  371.                         Select_Screen(1);Clear();
  372.                         while(1)
  373.                         {
  374.                         if(D_Click)break;                                
  375.                                 A_Clock_Wise=0;
  376.                                 Clock_Wise=0;
  377.                                 toHead=0;                       
  378.                                 show_menu1 ();//初始选中菜单1                       
  379.                                 if(A_Clock_Wise)//逆时针旋转
  380.                                 {
  381.                                         A_Clock_Wise=0;
  382.                                         Clock_Wise=0;
  383.                                         while(1)
  384.                                         {
  385.                                                 if(toHead)break;
  386.                                            show_menu3 ();//选中菜单3
  387.                                                 Click_Flag();
  388.                                         if(Click) while(1){Show_Im_128x64(name);delay300ms();delay300ms();delay300ms();if(A_Clock_Wise){A_Clock_Wise=0;Click=0;Select_Screen(0);Clear();
  389.                         Select_Screen(1);Clear();break;}
  390.                                         }
  391.                                                 if(Clock_Wise){Clock_Wise = 0;A_Clock_Wise=0;break;}//顺时针旋转break                选中1               
  392.                                                 if(A_Clock_Wise) //逆时针旋转
  393.                                                 {
  394. ……………………

  395. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有代码51hei提供下载:
LCD.rar (352.51 KB, 下载次数: 32)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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