社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 584|回复: 1

[原创] 基于CH554开发板的OLED屏显示

[复制链接]

47

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-10-13 09:44:12 | 显示全部楼层 |阅读模式
本帖最后由 jennyzhaojie 于 2017-10-15 10:53 编辑

    由于CH554开发板所配备的外设资源有限,所以为它丰富相应的外设资源及功能是十分重要的。为节省对I/O口资源的占用,这里所选用的器件是一个采用I2C接口的0.96寸双色OLED屏,除电源外它只使用2I/O来模拟I2C通讯以使OLED屏工作,其显示效果如下图所示。
截图.png OLED屏显示效果


OLED屏与CH554的连接关系如下:
SCL---P1.0
SDA--P1.1
故为了便于编程,所做的定义为:
sbit scl = P1^0;
sbit sda = P1^1;
#define OLED_SCLK_Clr() scl =0
#define OLED_SCLK_Set() scl =1
#define OLED_SDIN_Clr() sda =0
#define OLED_SDIN_Set() sda =1

进行I2C通讯的相关函数如下:
  1. void IIC_Start()
  2. {

  3.          OLED_SCLK_Set();
  4.          OLED_SDIN_Set();
  5.          OLED_SDIN_Clr();
  6.          OLED_SCLK_Clr();
  7. }

  8. void IIC_Stop()
  9. {
  10.   OLED_SCLK_Set();
  11.          OLED_SDIN_Clr();
  12.          OLED_SDIN_Set();
  13. }

  14. void IIC_Wait_Ack()
  15. {
  16.          OLED_SCLK_Set() ;
  17.          OLED_SCLK_Clr();
  18. }

  19. void Write_IIC_Byte(unsigned char IIC_Byte)
  20. {
  21.          unsigned char i;
  22.          unsigned char m,da;
  23.          da=IIC_Byte;
  24.          OLED_SCLK_Clr();
  25.          for(i=0;i<8;i++)                  
  26.          {
  27.                    m=da;
  28.                    m=m&0x80;
  29.                    if(m==0x80)
  30.                    {OLED_SDIN_Set();}
  31.                    else OLED_SDIN_Clr();
  32.                    da=da<<1;
  33.                    OLED_SCLK_Set();
  34.                    OLED_SCLK_Clr();
  35.                    }
  36. }

  37. void Write_IIC_Command(unsigned char IIC_Command)
  38. {
  39.    IIC_Start();
  40.    Write_IIC_Byte(0x78);     
  41. IIC_Wait_Ack();
  42.    Write_IIC_Byte(0x00);                        
  43. IIC_Wait_Ack();
  44.    Write_IIC_Byte(IIC_Command);
  45. IIC_Wait_Ack();
  46.    IIC_Stop();
  47. }

  48. void Write_IIC_Data(unsigned char IIC_Data)
  49. {
  50.    IIC_Start();
  51.    Write_IIC_Byte(0x78);                        
  52. IIC_Wait_Ack();
  53.    Write_IIC_Byte(0x40);                        
  54. IIC_Wait_Ack();
  55.    Write_IIC_Byte(IIC_Data);
  56. IIC_Wait_Ack();
  57.    IIC_Stop();
  58. }
复制代码

OLED屏显示所用到的函数如下:
  1. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  2. {
  3.          if(cmd)
  4.          {
  5.         Write_IIC_Data(dat);
  6.          }
  7.          else
  8.          {
  9.         Write_IIC_Command(dat);
  10.          }
  11. }

  12. void OLED_Set_Pos(unsigned char x, unsigned char y)
  13. {      
  14.          OLED_WR_Byte(0xb0+y,OLED_CMD);
  15.          OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  16.          OLED_WR_Byte((x&0x0f),OLED_CMD);
  17. }

  18. void OLED_Clear(void)
  19. {
  20.          unsigned char i,n;            
  21.          for(i=0;i<8;i++)
  22.          {
  23.                    OLED_WR_Byte (0xb0+i,OLED_CMD);   
  24.                    OLED_WR_Byte (0x00,OLED_CMD);     
  25.                    OLED_WR_Byte (0x10,OLED_CMD);      
  26.                    for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  27.          }
  28. }

  29. void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
  30. {        
  31.              unsigned char c=0,i=0;   
  32.                    c=chr-' ';           
  33.                    if(x>Max_Column-1){x=0;y=y+2;}
  34.                    if(Char_Size ==6)
  35.                    {      
  36.                                      OLED_Set_Pos(x,y);
  37.                                      for(i=0;i<6;i++)
  38.                                      OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  39.                    }
  40. }

  41. void OLED_Init(void)
  42. {      
  43.     Port1Cfg(1,0);     //P1配置第0口模式为1
  44.     Port1Cfg(1,1);     //P1配置第1口模式为1
  45.     mDelaymS(800);  
  46.     OLED_WR_Byte(0xAE,OLED_CMD);
  47.          OLED_WR_Byte(0x00,OLED_CMD);
  48.          OLED_WR_Byte(0x10,OLED_CMD);
  49.          OLED_WR_Byte(0x40,OLED_CMD);
  50.          OLED_WR_Byte(0xB0,OLED_CMD);
  51.          OLED_WR_Byte(0x81,OLED_CMD);
  52.          OLED_WR_Byte(0xFF,OLED_CMD);  
  53.          OLED_WR_Byte(0xA1,OLED_CMD);
  54.          OLED_WR_Byte(0xA6,OLED_CMD);
  55.          OLED_WR_Byte(0xA8,OLED_CMD);
  56.          OLED_WR_Byte(0x3F,OLED_CMD);
  57.          OLED_WR_Byte(0xC8,OLED_CMD);
  58.          OLED_WR_Byte(0xD3,OLED_CMD);
  59.          OLED_WR_Byte(0x00,OLED_CMD);
  60.          OLED_WR_Byte(0xD5,OLED_CMD);
  61.          OLED_WR_Byte(0x80,OLED_CMD);
  62.          OLED_WR_Byte(0xD8,OLED_CMD);
  63.          OLED_WR_Byte(0x05,OLED_CMD);
  64.          OLED_WR_Byte(0xD9,OLED_CMD);
  65.          OLED_WR_Byte(0xF1,OLED_CMD);
  66.         
  67.          OLED_WR_Byte(0xDA,OLED_CMD);
  68.          OLED_WR_Byte(0x12,OLED_CMD);
  69.          OLED_WR_Byte(0xDB,OLED_CMD);
  70.          OLED_WR_Byte(0x30,OLED_CMD);
  71.          OLED_WR_Byte(0x8D,OLED_CMD);
  72.          OLED_WR_Byte(0x14,OLED_CMD);
  73.          OLED_WR_Byte(0xAF,OLED_CMD);
  74. }
复制代码

实现显示效果的主函数为:
  1. void main( )
  2. {
  3.     CfgFsys( );        
  4.          OLED_Init();                       
  5.          OLED_Clear();
  6.          OLED_ShowChar(0,0,'a',6);
  7.          OLED_ShowChar(0,1,'A',6);
  8.     OLED_ShowString(6,3,"0.96' OLED TEST",6);
  9.     while(1);
  10. }
复制代码
有了前面的基础,配上A/D转换就可以直接观察采样结果了。

此内容由EEWORLD论坛网友jennyzhaojie原创,如需转载或用于商业用途需征得作者同意并注明出处



此帖出自单片机论坛


回复

使用道具 举报

204

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-10-14 15:35:51 | 显示全部楼层
单价1.3元的USB和Touchkey单片机CH552G已全面供货,试样QQ:1258305301


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-7-20 07:18 , Processed in 0.091087 second(s), 17 queries , Gzip On, Redis On.

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