社区导航

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

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

[复制链接]

15

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 6 天前 | 显示全部楼层 |阅读模式
本帖最后由 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通讯的相关函数如下:
[C] 纯文本查看 复制代码
void IIC_Start()
{
 
         OLED_SCLK_Set();
         OLED_SDIN_Set();
         OLED_SDIN_Clr();
         OLED_SCLK_Clr();
}
 
void IIC_Stop()
{
  OLED_SCLK_Set();
         OLED_SDIN_Clr();
         OLED_SDIN_Set();
}
 
void IIC_Wait_Ack()
{
         OLED_SCLK_Set() ;
         OLED_SCLK_Clr();
}
 
void Write_IIC_Byte(unsigned char IIC_Byte)
{
         unsigned char i;
         unsigned char m,da;
         da=IIC_Byte;
         OLED_SCLK_Clr();
         for(i=0;i<8;i++)                  
         {
                   m=da;
                   m=m&0x80;
                   if(m==0x80)
                   {OLED_SDIN_Set();}
                   else OLED_SDIN_Clr();
                   da=da<<1;
                   OLED_SCLK_Set();
                   OLED_SCLK_Clr();
                   }
}
 
void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);     
 IIC_Wait_Ack();
   Write_IIC_Byte(0x00);                        
 IIC_Wait_Ack();
   Write_IIC_Byte(IIC_Command);
 IIC_Wait_Ack();
   IIC_Stop();
}
 
void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);                        
 IIC_Wait_Ack();
   Write_IIC_Byte(0x40);                        
 IIC_Wait_Ack();
   Write_IIC_Byte(IIC_Data);
 IIC_Wait_Ack();
   IIC_Stop();
}

OLED屏显示所用到的函数如下:
[C] 纯文本查看 复制代码
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
         if(cmd)
         {
        Write_IIC_Data(dat);
         }
         else
         {
        Write_IIC_Command(dat);
         }
}
 
void OLED_Set_Pos(unsigned char x, unsigned char y)
{      
         OLED_WR_Byte(0xb0+y,OLED_CMD);
         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
         OLED_WR_Byte((x&0x0f),OLED_CMD);
}
 
void OLED_Clear(void) 
{ 
         unsigned char i,n;            
         for(i=0;i<8;i++) 
         { 
                   OLED_WR_Byte (0xb0+i,OLED_CMD);   
                   OLED_WR_Byte (0x00,OLED_CMD);     
                   OLED_WR_Byte (0x10,OLED_CMD);       
                   for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
         }
}
 
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
{        
             unsigned char c=0,i=0;   
                   c=chr-' ';           
                   if(x>Max_Column-1){x=0;y=y+2;}
                   if(Char_Size ==6)
                   {       
                                     OLED_Set_Pos(x,y);
                                     for(i=0;i<6;i++)
                                     OLED_WR_Byte(F6x8[c][i],OLED_DATA);
                   }
}
 
void OLED_Init(void)
{      
    Port1Cfg(1,0);     //P1配置第0口模式为1
    Port1Cfg(1,1);     //P1配置第1口模式为1
    mDelaymS(800);  
    OLED_WR_Byte(0xAE,OLED_CMD);
         OLED_WR_Byte(0x00,OLED_CMD);
         OLED_WR_Byte(0x10,OLED_CMD);
         OLED_WR_Byte(0x40,OLED_CMD); 
         OLED_WR_Byte(0xB0,OLED_CMD);
         OLED_WR_Byte(0x81,OLED_CMD);
         OLED_WR_Byte(0xFF,OLED_CMD);  
         OLED_WR_Byte(0xA1,OLED_CMD);
         OLED_WR_Byte(0xA6,OLED_CMD);
         OLED_WR_Byte(0xA8,OLED_CMD);
         OLED_WR_Byte(0x3F,OLED_CMD);
         OLED_WR_Byte(0xC8,OLED_CMD);
         OLED_WR_Byte(0xD3,OLED_CMD);
         OLED_WR_Byte(0x00,OLED_CMD);
         OLED_WR_Byte(0xD5,OLED_CMD);
         OLED_WR_Byte(0x80,OLED_CMD);
         OLED_WR_Byte(0xD8,OLED_CMD);
         OLED_WR_Byte(0x05,OLED_CMD);
         OLED_WR_Byte(0xD9,OLED_CMD);
         OLED_WR_Byte(0xF1,OLED_CMD);
        
         OLED_WR_Byte(0xDA,OLED_CMD);
         OLED_WR_Byte(0x12,OLED_CMD);
         OLED_WR_Byte(0xDB,OLED_CMD);
         OLED_WR_Byte(0x30,OLED_CMD);
         OLED_WR_Byte(0x8D,OLED_CMD);
         OLED_WR_Byte(0x14,OLED_CMD);
         OLED_WR_Byte(0xAF,OLED_CMD);
}

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

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



此帖出自单片机论坛

回复

使用道具 举报

73

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 5 天前 | 显示全部楼层
单价1.3元的USB和Touchkey单片机CH552G已全面供货,试样QQ:1258305301

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2017-10-19 17:16 , Processed in 0.476962 second(s), 16 queries , Redis On.

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