|
本帖最后由 jennyzhaojie 于 2017-10-15 10:53 编辑
由于CH554开发板所配备的外设资源有限,所以为它丰富相应的外设资源及功能是十分重要的。为节省对I/O口资源的占用,这里所选用的器件是一个采用I2C接口的0.96寸双色OLED屏,除电源外它只使用2个I/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通讯的相关函数如下: - 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[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);
- }
复制代码
实现显示效果的主函数为: - 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原创,如需转载或用于商业用途需征得作者同意并注明出处
|
|