记录下在imx6ull开发板下点亮ssd1306oled屏幕

ssd1306的屏幕

	1、接口:我使用的是i2c接口,想学习一下i2c的编程。当然也有spi等可自行选择
	2、地址模式:页地址模式,觉得用着顺手,就选择了页地址模式。开始用ssd1306时
	候头疼的就是它的地址模式。看手册总是看着晕乎乎的,还是直接上手用一下来得直
	接。我理解的页地址模式是,它由两部分构成:起始页和其实列地址。
			起始页:ssd1306将高度的64个点分为了8页(0-7),每页一个字节,也就
	是8位,这样刚好64个点。所以每输入一个字节,会控制8个点的亮灭。
			列地址:这个好理解,宽度128个点。所以列地址也就是0-127了。但是128是
	需要8位才能表示,所以涉及到了列地址的高四位和第四位。取地址代码可以参考如下。
		  WriteCmd(0xb0 + y);    //设置页地址
          WriteCmd(((m&0xf0) >> 4)|0x10);    //设置起始列的高地址
          WriteCmd((m&0x0f));               //设置起始列低地址
static void WriteCmd(u8 I2C_Command)
{
     
    u8 buf[2];      //定义临时数据包
    
    struct i2c_client *client = (struct i2c_client *)oled_device.private_data;
    buf[0] = 0x00; //表示下一个数据是命令
    buf[1] = I2C_Command;
    
    i2c_master_send(client, buf, 2);  
}

假设m是待写入的列地址,y是待写入的页地址。WriteCmd的函数是参照网上的了,没有自己造轮子了。小插曲,当我试图用i2c_transfer函数发送数据时,一直没成功,但也没报错。。。没搞懂。索性删了,用的现在的函数了。

PCtoLCD取模

	下图是我取模时的设置

记录下在imx6ull开发板下点亮ssd1306oled屏幕_第1张图片
采用的是逐列式,也就是有第一列开始由上到下取模,共取128列。得到1024个十六进制数据。将数据输入给ssd1306就行。
因为取模方式的不同,读数据的函数也不相同。我的函数如下,契合逐列式的取模。我选择将函数写在了应用程序中,数据由应用程序传进来。

ssize_t oled_write (struct file *fp, const char __user *buf, size_t size, loff_t *ppos)
{
     
    unsigned char m,n;
    
    for(m=0;m<128;m++){
     
        for(n=0;n<8;n++){
     
            WriteCmd(0xb0+n);       //设置页地址
            WriteCmd(((m&0xf0) >> 4)|0x10);    //设置起始列的高地址
            WriteCmd((m&0x0f));         //设置起始列低地址
            WriteDat(*buf++);
        }
    }
    return 0;
}
static void WriteDat(u8 I2C_Data)   
{
     
    u8 buf[2];    /*定义临时数据包*/
    struct i2c_client *client = (struct i2c_client *)oled_device.private_data;
    buf[0] = 0x40;/*表示接下来的接受的是数据而不是命令*/
    buf[1] = I2C_Data;
    i2c_master_send(client, buf, 2);
}

取模时的图
记录下在imx6ull开发板下点亮ssd1306oled屏幕_第2张图片
最后的显示效果
记录下在imx6ull开发板下点亮ssd1306oled屏幕_第3张图片

你可能感兴趣的:(记录下在imx6ull开发板下点亮ssd1306oled屏幕)