[应用相关] SSD1306的OLED上实现数字正反显示操作

[复制链接]
1164|4
 楼主| gaoyang9992006 发表于 2023-4-26 14:49 | 显示全部楼层 |阅读模式
有朋友看了我的贴问我,接下来分享一下。
例如我定义一个函数,可以显示带框框的数字

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


  1. void number_not(unsigned char numb,unsigned char x,unsigned char y)
  2. {
  3.         unsigned char i;
  4.         for(i=0;i<16;i++)
  5.         {
  6.                 if(i==0||i==15)
  7.                 {
  8.                         OLED_Set_Pos(x+i,y+0);
  9.                         OLED_WR_Byte(~0xFF,OLED_DATA);
  10.                         OLED_Set_Pos(x+i,y+1);
  11.                         OLED_WR_Byte(~0xFF,OLED_DATA);
  12.                 }
  13.                 else if((i>0&&i<4)||(i>12&&i<16))
  14.                 {
  15.                         OLED_Set_Pos(x+i,y+0);
  16.                         OLED_WR_Byte(~0x01,OLED_DATA);
  17.                         OLED_Set_Pos(x+i,y+1);
  18.                         OLED_WR_Byte(~0x80,OLED_DATA);       
  19.                 }
  20.                 else
  21.                 {
  22.                         OLED_Set_Pos(x+i,y+0);
  23.                         OLED_WR_Byte(~(0x01|num[numb][i-4]),OLED_DATA);
  24.                         OLED_Set_Pos(x+i,y+1);
  25.                         OLED_WR_Byte(~(0x80|num[numb][i+4]),OLED_DATA);
  26.                 }
  27.         }
  28. }
这个大家好理解吧。
如何反色显示呢?就是让最终屏幕上要显示的1变成0,让要实现的0变成1即可
如下
  1. void number_not(unsigned char numb,unsigned char x,unsigned char y)
  2. {
  3.         unsigned char i;
  4.         for(i=0;i<16;i++)
  5.         {
  6.                 if(i==0||i==15)
  7.                 {
  8.                         OLED_Set_Pos(x+i,y+0);
  9.                         OLED_WR_Byte(~0xFF,OLED_DATA);
  10.                         OLED_Set_Pos(x+i,y+1);
  11.                         OLED_WR_Byte(~0xFF,OLED_DATA);
  12.                 }
  13.                 else if((i>0&&i<4)||(i>12&&i<16))
  14.                 {
  15.                         OLED_Set_Pos(x+i,y+0);
  16.                         OLED_WR_Byte(~0x01,OLED_DATA);
  17.                         OLED_Set_Pos(x+i,y+1);
  18.                         OLED_WR_Byte(~0x80,OLED_DATA);       
  19.                 }
  20.                 else
  21.                 {
  22.                         OLED_Set_Pos(x+i,y+0);
  23.                         OLED_WR_Byte(~(0x01|num[numb][i-4]),OLED_DATA);
  24.                         OLED_Set_Pos(x+i,y+1);
  25.                         OLED_WR_Byte(~(0x80|num[numb][i+4]),OLED_DATA);
  26.                 }
  27.         }
  28. }
另外还可以合并这两个函数为一个函数

评论

学习一下  发表于 2023-4-27 08:59
 楼主| gaoyang9992006 发表于 2023-4-26 14:49 | 显示全部楼层
下面通过三目运算符合并这两个功能的函数为一个函数
  1. void numberx(unsigned char numb, unsigned char x, unsigned char y, unsigned char flag) {
  2.     unsigned char i;
  3.     for (i = 0; i < 16; i++) {
  4.         if (i == 0 || i == 15) {
  5.             OLED_Set_Pos(x + i, y + 0);
  6.             OLED_WR_Byte(flag ? ~0xFF : 0xFF, OLED_DATA);
  7.             OLED_Set_Pos(x + i, y + 1);
  8.             OLED_WR_Byte(flag ? ~0xFF : 0xFF, OLED_DATA);
  9.         } else if ((i > 0 && i < 4) || (i > 12 && i < 16)) {
  10.             OLED_Set_Pos(x + i, y + 0);
  11.             OLED_WR_Byte(flag ? ~0x01 : 0x01, OLED_DATA);
  12.             OLED_Set_Pos(x + i, y + 1);
  13.             OLED_WR_Byte(flag ? ~0x80 : 0x80, OLED_DATA);
  14.         } else {
  15.             OLED_Set_Pos(x + i, y + 0);
  16.             OLED_WR_Byte(flag ? ~(0x01 | num[numb][i - 4]) : (0x01 | num[numb][i - 4]), OLED_DATA);
  17.             OLED_Set_Pos(x + i, y + 1);
  18.             OLED_WR_Byte(flag ? ~(0x80 | num[numb][i + 4]) : (0x80 | num[numb][i + 4]), OLED_DATA);
  19.         }
  20.     }
  21. }
 楼主| gaoyang9992006 发表于 2023-4-26 14:50 | 显示全部楼层
635506448c9c60f12c.png
最后上效果。
小灵通2018 发表于 2023-4-26 14:58 | 显示全部楼层
大佬无私奉献。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2052

主题

16403

帖子

222

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