[PIC®/AVR®/dsPIC®产品] 简单的OLED反色表示菜单选中方法

[复制链接]
2273|6
 楼主| gaoyang9992006 发表于 2023-5-5 20:40 | 显示全部楼层 |阅读模式
  1. #include<myboard.h>

  2. unsigned char code num[][16]={
  3. {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",0*/
  4. {0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",1*/
  5. {0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",2*/
  6. {0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",3*/
  7. {0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24},/*"4",4*/
  8. {0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00},/*"5",5*/
  9. {0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00},/*"6",6*/
  10. {0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00},/*"7",7*/
  11. {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},/*"8",8*/
  12. {0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00},/*"9",9*/
  13. };



  14. /*
  15. numb:显示的数字,0-9
  16. x:坐标:0-127
  17. y:坐标:0-3
  18. flag:0为正显示,1为反显示
  19. */
  20. void numberx(unsigned char numb, unsigned char x, unsigned char y, unsigned char flag) {
  21.     unsigned char i;
  22.     for (i = 0; i < 16; i++) {
  23.         if (i == 0 || i == 15) {
  24.             OLED_Set_Pos(x + i, y + 0);
  25.             OLED_WR_Byte(flag ? ~0xFF : 0xFF, OLED_DATA);
  26.             OLED_Set_Pos(x + i, y + 1);
  27.             OLED_WR_Byte(flag ? ~0xFF : 0xFF, OLED_DATA);
  28.         } else if ((i > 0 && i < 4) || (i > 12 && i < 16)) {
  29.             OLED_Set_Pos(x + i, y + 0);
  30.             OLED_WR_Byte(flag ? ~0x01 : 0x01, OLED_DATA);
  31.             OLED_Set_Pos(x + i, y + 1);
  32.             OLED_WR_Byte(flag ? ~0x80 : 0x80, OLED_DATA);
  33.         } else {
  34.             OLED_Set_Pos(x + i, y + 0);
  35.             OLED_WR_Byte(flag ? ~(0x01 | num[numb][i - 4]) : (0x01 | num[numb][i - 4]), OLED_DATA);
  36.             OLED_Set_Pos(x + i, y + 1);
  37.             OLED_WR_Byte(flag ? ~(0x80 | num[numb][i + 4]) : (0x80 | num[numb][i + 4]), OLED_DATA);
  38.         }
  39.     }
  40. }


  41. void main(void)
  42. {
  43.         unsigned char i=0;
  44.         char fla=0,tem;
  45.         OLED_Init();
  46.         OLED_ColorTurn(0);//0正常显示,1 反色显示
  47.   OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示       
  48.         OLED_Display_Off();
  49.         OLED_Display_On();
  50.        
  51.         for(i=0;i<8;i++)
  52.                 numberx(i,16*i,0,0);
  53.                 numberx(fla,16*(fla),0,1);
  54.         while(1)
  55.         {
  56.                 if(KEY1==0)
  57.                         {
  58.                                 tem=fla--;
  59.                                 while(KEY1==0);
  60.                                 numberx(tem,16*(tem),0,0);
  61.                                 if(fla<0)  fla=7;
  62.                                 numberx(fla,16*(fla),0,1);                       
  63.                         }
  64.                 if(KEY2==0)
  65.                          {
  66.                                         tem=fla++;
  67.                                         while(KEY2==0);
  68.                                          numberx(tem,16*(tem),0,0);
  69.                                         if(fla==8) fla=0;
  70.                                         numberx(fla,16*(fla),0,1);       
  71.                          }
  72.                          
  73.                

  74.                
  75.         }
  76.        
  77. }
显示效果
该例子中显示的是16*16的点阵0~9,也可以改成你要的图标,方法是类似的,创建一个可以显示正色和反色的函数。
比如我这里是:numberx
思路:默认是现在正色,设置一个标志位记录按键操作的结果,并判断完成菜单选中的选择。
当按键触发后,将当前选中的切换到正色,并更新标志记录,刷新此时被选中的新图标。


思路就是这样的,设定菜单图标的不同样式即可实现漂亮的菜单切换功能。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| gaoyang9992006 发表于 2023-5-5 20:41 | 显示全部楼层
大家看看是不是那个tem也可以省略,先使用**标志变量,然后++,后判断给刷新后的。
lcczg 发表于 2023-5-6 09:59 | 显示全部楼层
巧妙
OLED_WR_Byte函数是如何实现的呐?
 楼主| gaoyang9992006 发表于 2023-5-6 19:30 | 显示全部楼层
lcczg 发表于 2023-5-6 09:59
巧妙
OLED_WR_Byte函数是如何实现的呐?

这是OLED屏幕的驱动库函数里的。
iyoum 发表于 2023-5-11 16:03 | 显示全部楼层
这个方案做的不错。              
dspmana 发表于 2023-5-13 10:21 | 显示全部楼层
可以按照字符串按段反选吗              
 楼主| gaoyang9992006 发表于 2023-5-15 09:28 | 显示全部楼层
dspmana 发表于 2023-5-13 10:21
可以按照字符串按段反选吗

那要重新写一个字符串的函数,调用这种支持反色的单个字显示函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部