找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3227|回复: 0
收起左侧

stm8的12864菜单程序 反白滚动菜单

[复制链接]
ID:76293 发表于 2017-12-4 20:42 | 显示全部楼层 |阅读模式
通过移植51单片机的菜单显示程序,成功显示并增加反白滚动 菜单
0.png
单片机源程序如下:
  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, 下载次数: 60)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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