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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm8的12864菜單程序 反白滾動菜單

[復制鏈接]
跳轉到指定樓層
樓主
通過移植51單片機的菜單顯示程序,成功顯示并增加反白滾動 菜單

單片機源程序如下:
  1. #include"stm8s.h"
  2. #include"stm8s_gpio.h"
  3. #include"Cry12864.h"
  4. uchar curr=1,currold;
  5. uchar curr_flag,currold_flag;
  6. uchar curr_flag1,currold_flag1;
  7. uchar curr_flag2,currold_flag2;
  8. uchar flag,flag1,flag2;
  9. uchar user16x16[]={ 0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,
  10. 0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,

  11. };

  12. unsigned char  *MainMenu[]=
  13. {
  14. {"  功能菜單"},
  15. {"登錄系統"},                                 
  16. {"電壓顯示一"},
  17. {"電壓顯示二"},
  18. };
  19. unsigned char  *MainMenu1[]=
  20. {
  21. {"  電流顯示一"},
  22. {"電流顯示二"},
  23. {"制作萬年歷"},
  24. {"溫度傳感器"},
  25. {"  QQ音樂"},
  26. {"我的圖片"},
  27. {"本地音樂"},
  28. {"更多應用"},
  29. };

  30. unsigned char  *MainMenu2[8]=
  31. {
  32. {"  全民清賬"},
  33. {"CF"},
  34. {"飛機"},
  35. {"王者榮耀"},
  36. {"  超級瑪麗"},
  37. {"魂斗羅"},
  38. {"非常英雄"},
  39. {"下一頁"},
  40. };

  41. unsigned char  *MainMenu3[]=
  42. {
  43. {"  幻月后續"},
  44. {"能否敵發送"},
  45. {"測試的個i哦"},
  46. {"飯店附近"},
  47. {"大幅度"},
  48. {"放大發送單個"},
  49. {"地方"},
  50. {"放大上輸給"},
  51. };
  52. extern const unsigned char shuzi_table[];

  53. #define LCD_RS_H      GPIOG->ODR|=0x01   //PD6拉高
  54. #define LCD_RS_L      GPIOG->ODR&=~0x01  //PD6拉低
  55. #define LCD_RW_H      GPIOG->ODR|=0x02   //PD7拉高
  56. #define LCD_RW_L      GPIOG->ODR&=~0x02  //PD7拉低
  57. #define LCD_EN_H      GPIOG->ODR|=0x04    //PD5拉高
  58. #define LCD_EN_L      GPIOG->ODR&=~0x04   //PD5拉低
  59. #define LCD_PSB_H     GPIOG->ODR|=0x08    //PD0拉高
  60. #define LCD_CSB_L     GPIOG->ODR&=~0x08   //PD0拉低
  61. /*******************************************
  62. 函數名稱:Delay_1ms
  63. 功    能:延時約1ms的時間
  64. 參    數:無
  65. 返回值  :無
  66. ********************************************/
  67. void Delay_1ms(void)
  68. {
  69.         uint i,j;
  70.    
  71.         for(i = 16;i > 0;i--)
  72.           for(j=10;j>0;j--);
  73.          
  74. }
  75. /*******************************************
  76. 函數名稱:Delay_Nms
  77. 功    能:延時N個1ms的時間
  78. 參    數:n--延時長度
  79. 返回值  :無
  80. ********************************************/
  81. void Delay_Nms(uint n)
  82. {
  83.     uint k;
  84.    
  85.     for(k = n;k > 0;k--)    Delay_1ms();
  86. }

  87. void Io_Config(void)
  88. {  GPIOB->DDR|=0xff;   //PB端口設置為輸出
  89.    GPIOB->CR1|=0xff;//推免模式
  90.    GPIOB->CR2&=~0xff;//低速模式
  91.    GPIOG->DDR|=0xff;   //PA端口設置為輸出
  92.    GPIOG->CR1|=0xff;//推免模式
  93.    GPIOG->CR2&=~0xff;//低速模式*/

  94. }

  95. //讀狀態,檢測忙
  96. void check_busy(void)
  97. {uchar busy;
  98. do
  99. { LCD_RS_L;
  100. LCD_RW_H;
  101. LCD_EN_L;
  102. Delay_1ms();
  103. LCD_EN_H;
  104. busy=GPIOB->IDR;
  105. Delay_1ms();
  106. LCD_EN_L;
  107. }
  108. while(busy&0x80);

  109. }

  110. /*******************************************
  111. 函數名稱:Write_Cmd
  112. 功    能:向液晶中寫控制命令
  113. 參    數:cmd--控制命令
  114. 返回值  :無
  115. ********************************************/
  116. void Write_Cmd(uchar cmd)
  117. {   
  118.    // check_busy();
  119.     LCD_RW_L;
  120.     LCD_RS_L;
  121.     Delay_1ms();
  122.     GPIOB->ODR&=0x00;
  123.     GPIOB->ODR|=cmd;
  124.     LCD_EN_H;
  125.     Delay_1ms();
  126.     LCD_EN_L;
  127.     Delay_1ms();        

  128.    
  129.      

  130. }
  131. /*******************************************
  132. 函數名稱:Write_Data
  133. 功    能:向液晶中寫顯示數據
  134. 參    數:dat--顯示數據
  135. 返回值  :無
  136. ********************************************/
  137. void  Write_Data(uchar dat)
  138. {  // check_busy();
  139.    LCD_RW_L;
  140.     LCD_RS_H;
  141.     Delay_1ms();
  142.     GPIOB->ODR&=0x00;
  143.     GPIOB->ODR|=dat;
  144.     LCD_EN_H;
  145.     Delay_1ms();
  146.     LCD_EN_L;
  147.     Delay_1ms();
  148. }  
  149. /*******************************************
  150. 函數名稱:Ini_Lcd
  151. 功    能:初始化液晶模塊
  152. 參    數:無
  153. 返回值  :無
  154. ********************************************/
  155. void Ini_Lcd(void)
  156. {   Io_Config();
  157.     LCD_PSB_H;
  158.     Delay_Nms(100);
  159.     Write_Cmd(0x30);   //基本指令集
  160.     Delay_Nms(10);
  161.     Write_Cmd(0x02);   // 地址歸位
  162.     Delay_Nms(10);
  163.         Write_Cmd(0x0c);   //整體顯示打開,游標關閉
  164.     Delay_Nms(10);
  165.         Write_Cmd(0x01);   //清除顯示
  166.     Delay_Nms(10);
  167.         Write_Cmd(0x06);   //游標右移
  168.     Delay_Nms(10);
  169.         Write_Cmd(0x80);   //設定顯示的起始地址
  170. }
  171. /*******************************************
  172. 函數名稱:Clear_GDRAM
  173. 功    能:清除液晶GDRAM中的隨機數據
  174. 參    數:無
  175. 返回值  :無
  176. ********************************************/
  177. void Clear_GDRAM(void)
  178. {
  179.   /*  uchar i,j,k;
  180.    
  181.         Write_Cmd(0x34);        //打開擴展指令集
  182.         i = 0x80;            
  183.         for(j = 0;j < 32;j++)
  184.         {
  185.         Write_Cmd(i++);
  186.         Write_Cmd(0x80);
  187.                   for(k = 0;k < 16;k++)
  188.                   {
  189.                       Write_Data(0x00);
  190.                   }
  191.         }
  192.         i = 0x80;
  193.          for(j = 0;j < 32;j++)
  194.         {
  195.              Write_Cmd(i++);
  196.         Write_Cmd(0x88);           
  197.                   for(k = 0;k < 16;k++)
  198.                   {
  199.                        Write_Data(0x00);
  200.                    }
  201.         }   
  202.      
  203.         Write_Cmd(0x30);        //回到基本指令集
  204.   */

  205.    Write_Cmd(0x01);
  206.    Delay_Nms(15);

  207.         
  208. }
  209. /*******************************************
  210. 函數名稱:Draw_PM
  211. 功    能:在整個液晶屏幕上畫圖
  212. 參    數:無
  213. 返回值  :無
  214. ********************************************/
  215. void Draw_PM(const uchar *ptr)
  216. {
  217.     uchar i,j,k;
  218.    
  219.         Write_Cmd(0x34);        //打開擴展指令集
  220.         i = 0x80;            
  221.         for(j = 0;j < 32;j++)
  222.         {
  223.         Write_Cmd(i++);
  224.         Write_Cmd(0x80);
  225.                   for(k = 0;k < 16;k++)
  226.                   {
  227.                       Write_Data(*ptr++);
  228.                   }
  229.         }
  230.         i = 0x80;
  231.          for(j = 0;j < 32;j++)
  232.         {
  233.              Write_Cmd(i++);
  234.         Write_Cmd(0x88);           
  235.                   for(k = 0;k < 16;k++)
  236.                   {
  237.                        Write_Data(*ptr++);
  238.                    }
  239.         }  
  240.     Write_Cmd(0x36);        //打開繪圖顯示
  241.         Write_Cmd(0x30);        //回到基本指令集
  242. }
  243. /*********************************************************/
  244. /*                                                       */
  245. /* 設定顯示位置                                          */
  246. /*                                                       */
  247. /*********************************************************/
  248. void lcd_pos(uchar X,uchar Y)
  249. {                          
  250.    uchar  pos;
  251.    if (X==0)
  252.      {X=0x80;}
  253.    else if (X==1)
  254.      {X=0x90;}
  255.    else if (X==2)
  256.      {X=0x88;}
  257.    else if (X==3)
  258.      {X=0x98;}
  259.    pos = X+Y ;  
  260.    Write_Cmd(pos);     //顯示地址
  261. }

  262. /*******************************************
  263. 函數名稱:Disp1Char
  264. 功    能:在某個位置顯示一個字符
  265. 參    數:x--位置的列坐標
  266.           y--位置的行坐標
  267.           data--顯示的字符數據
  268. 返回值  :無
  269. ********************************************/
  270. void Disp1Char(uchar x,uchar y,uchar data)
  271. {
  272.     lcd_pos( x, y );                        
  273.     Write_Data( data );               
  274. }

  275. /*******************************************
  276. 函數名稱:DispNchar
  277. 功    能:讓液晶從某個位置起連續顯示N個字符
  278. 參    數:x--位置的列坐標
  279.           y--位置的行坐標
  280.           n--字符個數
  281.           ptr--指向字符存放位置的指針
  282. 返回值  :無
  283. ********************************************/
  284. void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
  285. {
  286.     uchar i;
  287.    
  288.     for (i=0;i<n;i++)
  289.     {
  290.         Disp1Char(x++,y,ptr[i]);
  291.         if (x == 0x0f)
  292.         {
  293.            x = 0;
  294.             y ^= 1;
  295.         }
  296.     }
  297. }

  298. /*******************************************
  299. 函數名稱:DispString
  300. 功    能:讓液晶從某個位置起連續顯示N個字符
  301. 參    數:x--位置的列坐標
  302.           y--位置的行坐標
  303.           n--字符個數
  304.           ptr--指向字符存放位置的指針
  305. 返回值  :無
  306. ********************************************/

  307. void  DispString(uchar x,uchar y,uchar *ptr)
  308. {
  309.     uchar i = 0;
  310.     lcd_pos( x, y );
  311.     while(ptr[i] != '\0')
  312.      {                         //顯示字符
  313.       
  314.        Write_Data(ptr[i]);
  315.        i++;
  316.      }

  317. }
  318. /*******************************************
  319. 函數名稱:Draw_TX
  320. 功    能:顯示一個16*16大小的圖形
  321. 參    數:Yaddr--Y地址
  322.           Xaddr--X地址
  323.           dp--指向圖形數據存放地址的指針
  324. 返回值  :無
  325. ********************************************/
  326. void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
  327. {
  328.     uchar j;
  329.     uchar k=0;

  330.    // Write_Cmd(0x01);  //清屏,只能清除DDRAM
  331.     Write_Cmd(0x34);  //使用擴展指令集,關閉繪圖顯示
  332.     for(j=0;j<16;j++)
  333.     {
  334.         Write_Cmd(Yaddr++);       //Y地址
  335.         Write_Cmd(Xaddr);    //X地址
  336.           Write_Data(dp[k++]);  
  337.           Write_Data(dp[k++]);
  338.     }
  339.     Write_Cmd(0x36);  //打開繪圖顯示
  340.   //  Write_Cmd(0x30);  //回到基本指令集模式
  341. }
  342. /***********************************************
  343.                寫入用戶自定義函數
  344. ***********************************************/
  345. void CGRAM()
  346. {
  347.      int i;
  348.      Write_Cmd(0x30);
  349.      Write_Cmd(0x40);          //對CGRAM第一個自定義符操作
  350.      for(i=0;i<16;i++)
  351.        {
  352.         Write_Data(user16x16[i*2]);
  353.         Write_Data(user16x16[i*2+1]);
  354.       }
  355. }  
  356. /***********************************************
  357.                顯示用戶自定義字符
  358. ***********************************************/
  359. void DisplayCGRAM(unsigned char x,unsigned char y)
  360. {
  361. switch(y)
  362.      {
  363.    case 1: Write_Cmd(0x80+x);break;
  364.    case 2: Write_Cmd(0x90+x);break;
  365.    case 3: Write_Cmd(0x88+x);break;
  366.    case 4: Write_Cmd(0x98+x);break;
  367.    default:break;
  368.   }
  369.     Write_Data(00);                                          //é???óDò???×?·?2ù×÷0x04á?  ?ùò??±?óD′
  370.     Write_Data(00);                 //D′×?·?          Write_Data(user16x16[i*2]);
  371.                         //            Write_Data(user16x16[i*2+1]);
  372. }   

  373. /*************************************************************


  374. //為反白做準備,目地是在圖形顯示時防止有噪點


  375. *************************************************************/
  376. void display()        //為反白做準備,目地是在圖形顯示時防止有噪點

  377. {

  378. uchar i,j;

  379. Write_Cmd(0x34); //寫數據時,關閉圖形顯示

  380. for(i=0;i<32;i++)

  381. {

  382. Write_Cmd(0x80+i); //先寫入水平坐標值

  383. Write_Cmd(0x80); //寫入垂直坐標值

  384. for(j=0;j<16;j++) //再寫入兩個8位元的數據

  385. Write_Data(0x00);

  386. Delay_Nms(1);

  387. }

  388. for(i=0;i<32;i++)

  389. {

  390. Write_Cmd(0x80+i);

  391. Write_Cmd(0x88);

  392. for(j=0;j<16;j++)

  393. Write_Data(0x00);

  394. Delay_Nms(1);

  395. }
  396. Write_Cmd(0x36);//寫完數據,開圖形顯示
  397. }

  398. /*******************************************************

  399.          反白函數
  400. *********************************************************/
  401. void photodisplay(uchar x,uchar y,uchar width)        //反白,X值為0-7,Y值為0-3,width為行反白格數

  402. {

  403. uchar i,j,flag=0x00;

  404. display();

  405. if(y>1)

  406. {

  407. flag=0x08;

  408. y=y-2;

  409. }

  410. Write_Cmd(0x34); //寫數據時,關閉圖形顯示,且打開擴展指令集


  411. ……………………

  412. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
12864菜單程序.rar (1 MB, 下載次數: 61)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 观看av| 欧美在线观看免费观看视频 | 成人免费福利 | 亚洲日韩中文字幕一区 | 91免费视频 | 九色在线视频 | 日韩精品在线一区 | 91观看| 极品销魂美女一区二区 | 亚洲国产精品一区二区第一页 | 99小视频 | 一区二区三区不卡视频 | 日日夜夜精品 | 久草视 | 免费观看成人性生生活片 | 欧美亚洲国产精品 | 97精品一区二区 | 亚洲婷婷六月天 | 欧美日韩综合一区 | 久久6视频 | 精品视频一区在线 | 91不卡在线 | 免费看a | 国产福利在线看 | 国产日韩一区二区三免费高清 | 日韩伦理一区二区 | 国产欧美一区二区三区另类精品 | 日韩在线不卡 | 成人无遮挡毛片免费看 | 亚洲精品在线免费观看视频 | 久久另类视频 | 久草视频在线播放 | 黄片毛片免费观看 | 一区二区精品电影 | 91婷婷韩国欧美一区二区 | 欧美高清视频在线观看 | 亚洲综合色婷婷 | 国产激情一区二区三区 | 精品一区二区三区在线播放 | 国产ts人妖一区二区三区 | 中国一级特黄毛片大片 |