jennyzhaojie 发表于 2017-10-13 09:44

基于CH554开发板的OLED屏显示

<div class='showpostmsg'> 本帖最后由 jennyzhaojie 于 2017-10-15 10:53 编辑

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


OLED屏与CH554的连接关系如下:SCL---P1.0SDA--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通讯的相关函数如下: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屏显示所用到的函数如下: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,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);
}
实现显示效果的主函数为: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原创,如需转载或用于商业用途需征得作者同意并注明出处



</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

沁恒USB单片机 发表于 2017-10-14 15:35

:):handshake:handshake
页: [1]
查看完整版本: 基于CH554开发板的OLED屏显示