5603|1

95

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

基于CH554开发板的OLED屏显示 [复制链接]

本帖最后由 jennyzhaojie 于 2017-10-15 10:53 编辑

    由于CH554开发板所配备的外设资源有限,所以为它丰富相应的外设资源及功能是十分重要的。为节省对I/O口资源的占用,这里所选用的器件是一个采用I2C接口的0.96寸双色OLED屏,除电源外它只使用2I/O来模拟I2C通讯以使OLED屏工作,其显示效果如下图所示。
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原创,如需转载或用于商业用途需征得作者同意并注明出处



此帖出自单片机论坛

最新回复

  详情 回复 发表于 2017-10-14 15:35
点赞 关注
 

回复
举报

305

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
此帖出自单片机论坛
 
个人签名单价1元含税的USB和Touchkey单片机CH551G已大批量出货,试样QQ:1258305301
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表