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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

12864簡易菜單框架單片機源程序 串口通信 帶注釋

[復制鏈接]
跳轉到指定樓層
樓主
ID:152913 發表于 2016-12-9 23:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
適合初學者看看  
串口通信  有加注釋,完整代碼下載: 菜單程序.zip (2.65 KB, 下載次數: 62)

預覽:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char

  4. sbit LCD_RS = P2^6;
  5. sbit LCD_RW = P2^5;
  6. sbit LCD_EN  = P2^7;

  7. sbit PSB= P2^1; //串并口選擇端  并高串低

  8. //按鍵
  9. sbit KEY_PgDn=P3^0;
  10. sbit KEY_PgUp=P3^1;
  11. sbit KEY_Enter=P3^2;
  12. sbit KEY_Esc=P3^3;

  13. bit Menu1,Menu2,Menu3,Menu4,Menu5,Menu6,Enter_Menu,Menu0;

  14. unsigned char curr=1,currold;//全局變量,當前箭頭位置

  15. unsigned char code user16x16[]={ //箭頭圖片
  16. 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,
  17. 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,
  18. };

  19. unsigned char code *MainMenu[]=
  20. {
  21. {"    功能菜單"},
  22. {"  溫度顯示"},
  23. {"  自制萬年歷"},
  24. {"  我的設置"},
  25. {"  5.設置5"},
  26. {"  6.設置6"},
  27. {"  7.設置7"},
  28. {"  8.設置8"},
  29. {"  9.設置9"},
  30. {"  0.設置0"},
  31. };

  32. /***********************************************
  33.                   延時函數
  34. ***********************************************/
  35. void DelayUs2x(unsigned char t)
  36. {   
  37. while(--t);
  38. }

  39. void DelayMs(unsigned char t)
  40. {
  41.      
  42. while(t--)
  43. {
  44.      DelayUs2x(245);
  45.   DelayUs2x(245);
  46. }
  47. }
  48. /*********************************************
  49.              數據讀寫端口
  50. *********************************************/

  51. void Lcd_Send_Date(uchar date)
  52. {
  53.         uchar i;
  54.         LCD_RS=1;
  55.         for(i=0;i<8;i++)
  56.         {
  57.                 if((date<<i)&0x80)
  58.                 LCD_RW=1;
  59.                 else
  60.                 LCD_RW=0;
  61.                 LCD_EN=0;
  62.                 LCD_EN=1;
  63.         }
  64. }
  65. /***********************************************
  66.                 寫入命令
  67. ***********************************************/
  68. void Write_Cmd(uchar com)
  69. {
  70.         Lcd_Send_Date(0xf8);       
  71.         Lcd_Send_Date(0xf0&com);
  72.         Lcd_Send_Date(com<<4);
  73.         DelayMs(1);
  74. }
  75. /***********************************************
  76.                  寫入數據
  77. ***********************************************/
  78. void Write_Data(uchar dat)
  79. {
  80.         Lcd_Send_Date(0xfa);
  81.         Lcd_Send_Date(dat&0xf0);
  82.         Lcd_Send_Date(dat<<4);
  83.         DelayMs(1);
  84. }
  85. /***********************************************
  86.                液晶屏初始化
  87. ***********************************************/
  88. void Init_ST7920()
  89. {  
  90.    DelayMs(40);           //大于40MS的延時程序
  91.    DelayMs(1);            //延時
  92.    Write_Cmd(0x30);       //選擇基本指令集
  93.    DelayUs2x(50);         //延時大于100us
  94.    Write_Cmd(0x30);       //選擇8bit數據流
  95.    DelayUs2x(20);         //延時大于37us
  96.    Write_Cmd(0x0c);       //開顯示(無游標、不反白)
  97.    DelayUs2x(50);         //延時大于100us
  98.    Write_Cmd(0x01);       //清除顯示,并且設定地址指針為00H
  99.    DelayMs(15);           //延時大于10ms
  100.    Write_Cmd(0x06);       //指定在資料的讀取及寫入時,設定游標的移動方向及指定顯示的移位,光標從右向左加1位移動
  101.    DelayUs2x(50);         //延時大于100us
  102. }

  103. /***********************************************
  104.                 用戶自定義字符
  105. ***********************************************/
  106. void CGRAM()
  107. {
  108.      int i;
  109.      Write_Cmd(0x30);
  110.      Write_Cmd(0x40);          //對CGRAM第一個自定義字符操作,
  111.      for(i=0;i<16;i++)
  112.        {
  113.         Write_Data(user16x16[i*2]);
  114.         Write_Data(user16x16[i*2+1]);
  115.       }
  116. }   

  117. /***********************************************
  118.                顯示用戶自定義字符
  119. ***********************************************/
  120. void DisplayCGRAM(unsigned char x,unsigned char y)
  121. {
  122. switch(y)
  123.      {
  124.    case 1: Write_Cmd(0x80+x);break;
  125.    case 2: Write_Cmd(0x90+x);break;
  126.    case 3: Write_Cmd(0x88+x);break;
  127.    case 4: Write_Cmd(0x98+x);break;
  128.       default:break;
  129.   }
  130.     Write_Data(00);                                          //上面有一個字符操作0x04了  所以直接寫
  131.     Write_Data(00);                 //寫字符          Write_Data(user16x16[i*2]);
  132.                         //            Write_Data(user16x16[i*2+1]);
  133. }         

  134. /***********************************************
  135.                   顯示字符串
  136.             x:橫坐標值,范圍0~8
  137.             y:縱坐標值,范圍1~4
  138. ***********************************************/
  139. void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s)
  140. {
  141. switch(y)
  142.      {
  143.    case 1: Write_Cmd(0x80+x);break;
  144.    case 2: Write_Cmd(0x90+x);break;
  145.    case 3: Write_Cmd(0x88+x);break;
  146.    case 4: Write_Cmd(0x98+x);break;
  147.       default:break;
  148.   }
  149. while(*s>0)
  150.    {
  151.       Write_Data(*s);
  152.       s++;
  153.       DelayUs2x(50);
  154.    }
  155. }

  156. /***********************************************
  157.                      清屏
  158. ***********************************************/
  159. void ClrScreen()
  160. {
  161.    Write_Cmd(0x01);
  162.    DelayMs(15);
  163. }
  164.    
  165. /***********************************************
  166.                調用顯示更新
  167. ***********************************************/
  168. void DisplayUpdata(void)
  169. {   
  170.     unsigned char num;                   //輸入的CURR為1 執行完 DisplayUpdata后又變為0
  171.     ClrScreen();                  
  172. num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判斷數組中數值個數
  173. //num為此數組的語速的個數
  174. //代表數組中元素的個數,size(a)表示整個數組的字節數,size(a[0])表示一個元素的字節數,他們相除之后就表示這個數組中元素的個數
  175. if((0+(curr/4)*4)<num)
  176.    LCD_PutString(0,1,MainMenu[0+(curr/4)*4]);
  177. else //如果超出數組最大元素,則寫空信息,不判斷此信息可能會出現亂碼          0是字節 1是行數
  178.    LCD_PutString(0,1,"");
  179.                 //  2
  180. if((1+(curr/4)*4)<num)                         
  181.    LCD_PutString(0,2,MainMenu[1+(curr/4)*4]);                                                          //num是字節數                 1or2or3/4=0
  182.                                                                                                                                                 //                                         <0curr<3                         3<curr<8
  183. else                                                                                                                                        //                                         0+(curr/4)*4=0                  4
  184.    LCD_PutString(0,2,"");                                                                                                //                                         1+(curr/4)*4=1                  5
  185.            //3                                                                                                                                //                                         2+(curr/4)*4=2                  6
  186. if((2+(curr/4)*4)<num)                                                                                                        //                                         3+(curr/4)*4=3                  7
  187.    LCD_PutString(0,3,MainMenu[2+(curr/4)*4]);
  188. else
  189.    LCD_PutString(0,3,"");
  190.                 //4
  191. if((3+(curr/4)*4)<num)                //判斷行數
  192.    LCD_PutString(0,4,MainMenu[3+(curr/4)*4]);
  193. else
  194.    LCD_PutString(0,4,"");

  195. DisplayCGRAM(0,curr%4+1); //顯示字符串的函數 0%4+1=1  1%4+1=2 /2+1=3 /3+1=4
  196. }

  197. /*------------------------------------
  198.                         主界面處理
  199. ------------------------------------*/
  200. void MainMenu_Pro()
  201. {
  202.   if(curr!=currold) //光標位置變化,則更新顯示                  按鍵按下去  字符串就變更位置了  CURR也就變了
  203.       {
  204.        DisplayUpdata();
  205.        currold=curr;   //把CURR的值賦給CURROLD  判斷下加一個一
  206.       }

  207.    if(!KEY_PgUp)  
  208.     {
  209.      DelayMs(10);
  210.      if(!KEY_PgUp)     
  211.        {
  212.         while(!KEY_PgUp);
  213.           {
  214.     if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)                //sizeof 求字節數
  215.      //判斷數組中數值個數
  216.      { curr++; }
  217.           }
  218.        }
  219.     }
  220.   else
  221.   if(!KEY_PgDn)
  222.     {
  223.      DelayMs(10);
  224.      if(!KEY_PgDn)     
  225.         {
  226.         while(!KEY_PgDn);
  227.           {
  228.        if(curr>0)
  229.      { curr--; }
  230.           }
  231.         }
  232.     }
  233.                         else if(!KEY_Enter)
  234.                                 {
  235.                                 DelayMs(10);
  236.                                         if(!KEY_Enter)
  237.                                         {
  238.                                         while(!KEY_Enter);
  239.                                                 switch(curr)
  240.                                                 {
  241. //                                                case 0: Menu0=1;Enter_Menu=1;break;
  242.                                                 case 1: Menu1=1;Enter_Menu=1;ClrScreen();break;
  243.                                                 case 2: Menu2=1;Enter_Menu=1;ClrScreen();break;
  244.                                                 case 3: Menu3=1;Enter_Menu=1;ClrScreen();break;
  245. //                                                case 4: Menu4=1;Enter_Menu=1;break;
  246. //                                                case 5: Menu5=1;Enter_Menu=1;break;
  247. //                                                case 6: FanHui1=1;Menu_Flag=0;guide=0;
  248. //                                                                Write_Cmd(0x01);break;                //輪詢到有enter鍵,當guide指向返回時候直接去掉FanHui1控制的父菜單循環
  249.                                                 default:return;
  250.                                                 }
  251.                                         TR1=0;
  252.                                         }
  253.                                 }
  254.                        

  255. }
  256. /*************************************************************
  257.                     按鍵返回函數         
  258. *************************************************************/
  259. void ESC()
  260. {
  261.                 DelayMs(10);
  262.                         if(!KEY_Esc)
  263.                         {
  264.                         while(!KEY_Esc);
  265.                         Menu1=0;
  266.                         Menu2=0;
  267.                         Menu3=0;
  268.                         Enter_Menu=0;
  269.                         DisplayUpdata();
  270.                         }
  271. }

  272. /*------------------------------------
  273.                 Menu1設置時間子菜單處理
  274. ------------------------------------*/
  275. void Menu1_Pro()
  276. {
  277. LCD_PutString(0,2,MainMenu[9]);
  278. if(!KEY_Esc)
  279.                 {
  280.                 ESC();
  281.                         }
  282. }

  283. /*------------------------------------
  284.                 Menu2設置時間子菜單處理
  285. ------------------------------------*/
  286. void Menu2_Pro()
  287. {
  288. LCD_PutString(0,2,MainMenu[1]);
  289. if(!KEY_Esc)
  290.                         {
  291.                 ESC();
  292.                         }
  293. }

  294. /*------------------------------------
  295.                 Menu3設置時間子菜單處理
  296. ------------------------------------*/
  297. void Menu3_Pro()
  298. {
  299. LCD_PutString(0,2,MainMenu[5]);
  300. if(!KEY_Esc)
  301.                         {
  302.                         ESC();
  303.                         }
  304. }

  305. /***********************************************
  306.                  MAIN
  307. ***********************************************/
  308. void main()
  309. {
  310.    Init_ST7920();
  311.    CGRAM(); //寫入自定義字符
  312.    DisplayUpdata();
  313. while(1)
  314. {
  315.                 MainMenu_Pro();

  316. while(Enter_Menu)        //進入子菜單標簽
  317.                 {
  318. //                                     if(Menu0) Menu0_Pro();                //子菜單0處理函數
  319. //                                else
  320.                                 if(Menu1) Menu1_Pro();       
  321.                                 else if(Menu2) Menu2_Pro();
  322.                                 else if(Menu3) Menu3_Pro();
  323. //                                else if(Menu4) Menu4_Pro();
  324. //                                else if(Menu5) Menu5_Pro();
  325.                 }
  326. }
  327. }
復制代碼


評分

參與人數 2黑幣 +55 收起 理由
mcxq + 5 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:402077 發表于 2018-11-10 08:54 | 只看該作者
我要我要我要
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美精品一区二区色综合朱莉 | 在线观看中文字幕视频 | 蜜桃视频在线观看免费视频网站www | 日韩在线中文 | 先锋av资源在线 | 精品成人69xx.xyz | 黄色免费网站在线看 | 日韩精品一区在线观看 | 久久午夜精品 | 亚洲国产一区二区三区在线观看 | 国产精品久久久久久久久久久久 | 久久久精品视频免费 | 亚洲成人精品 | 中文字幕成人免费视频 | 国产福利视频 | 免费黄视频网站 | 成人欧美日韩一区二区三区 | 日韩欧美一级精品久久 | 色综合99 | 黄色网页在线观看 | 7777在线视频免费播放 | 日韩美av| 欧美在线a | 久草青青草 | 国产精产国品一二三产区视频 | 亚洲性网 | 欧美精品久久久久 | 日本一二区视频 | 人妖无码 | 特级黄一级播放 | 亚洲成人网在线播放 | 久久在线 | 成人在线免费看 | 羞羞视频网站免费看 | h漫在线观看| 欧美自拍视频 | 国产精品爱久久久久久久 | 九九热免费观看 | 欧美日韩在线免费观看 | 天天操天天干天天透 | 国产精品1区 |