基于[三星6818]I2C驱动开发的0.96寸oled屏

  • 找OLED屏的原厂找配置源码
  • 更改源码适配LINUX系统(源码是MCU使用的),直接附上改后的源码
    • dev驱动代码(当使用plaform注册驱动时一般要用到两个.c文件一个是设备代码一个是驱动代码)
    • drv驱动代码
    • main函数入口
  • 效果图

找OLED屏的原厂找配置源码

下载地址

更改源码适配LINUX系统(源码是MCU使用的),直接附上改后的源码

dev驱动代码(当使用plaform注册驱动时一般要用到两个.c文件一个是设备代码一个是驱动代码)

#eeprom_dev.c
static struct i2c_board_info gec6818_eeprom_info = { //第一个参数必须要与drv下I2C的name一致,参数2为i2c设备地址,一般读写位不要整体右移一位I2C_BOARD_INFO("gec6818_eeprom", 0x3c),
};static struct i2c_client *gec6818_eeprom_client;static int gec6818_eeprom_dev_init(void)
{struct i2c_adapter *i2c_adap;// 获取设备号为 2 的adpter ,也就是adapter->nr == 2(当使用sda2和sck2时)i2c_adap = i2c_get_adapter(2);//直接使用 i2c_new_device 创建 client 自动注册到i2c_bus_type 中去(drv代码probe中有用到)//client->name == "gec6818_eeprom" //client->addr = 0x3cgec6818_eeprom_client = i2c_new_device(i2c_adap, &gec6818_eeprom_info);// 释放掉 adapteri2c_put_adapter(i2c_adap);return 0;
}static void gec6818_eeprom_dev_exit(void)
{i2c_unregister_device(gec6818_eeprom_client);
}module_init(gec6818_eeprom_dev_init);
module_exit(gec6818_eeprom_dev_exit);

drv驱动代码

#eeprom_drv.c
static struct i2c_client *this_client;static int  gec6818_eeprom_open (struct inode * inode, struct file *file)
{printk("gec6818_eeprom_open \n");return 0;
}static int  gec6818_eeprom_release (struct inode * inode, struct file *file)
{printk("gec6818_eeprom_release \n");return 0;
}// buf[0] : addr
// buf[1] : data
//
static ssize_t gec6818_eeprom_write (struct file * file, const char __user * buf, size_t len, loff_t * off)
{int rt;char wbuf[2]={0};unsigned char addr, data;if(len > sizeof wbuf)return -EINVAL;rt = copy_from_user(wbuf, buf, 2);//把应用层传下的数据拷贝到内核if(rt != 0)return -EFAULT;//写入的地址addr = wbuf[0];//写入的数据data = wbuf[1];//printk("addr = %x, data = %x\n", addr, data);//传输1字节数据rt = i2c_smbus_write_byte_data(this_client, addr, data);if(rt < 0)return rt; return 2;
}// 传入: buf[0] : addr
// 输出: buf[0] : data
//
static ssize_t gec6818_eeprom_read (struct file *file, char __user *buf, size_t len, loff_t * offs)
{int rt=0;unsigned char addr, data;rt=copy_from_user(&addr, buf, 1);if(rt != 0)return -EFAULT;   //读取1字节数据rt = i2c_smbus_read_byte_data(this_client, addr);if(rt < 0)return rt;//若正确,获取读取到的字节data = rt & 0xFF;rt = copy_to_user(buf, &data, 1);if(rt != 0)return -EFAULT;return 1;
}static const struct file_operations gec6818_eeprom_fops = {.owner         = THIS_MODULE,.write       = gec6818_eeprom_write,.open       = gec6818_eeprom_open,.release     = gec6818_eeprom_release,.read         = gec6818_eeprom_read,
};static struct miscdevice gec6818_eeprom_miscdev = {.minor        = MISC_DYNAMIC_MINOR,  //MISC_DYNAMIC_MINOR,动态分配次设备号.name      = "gec6818_eeprom",      //设备名称,/dev/gec6818_eeprom  .fops       = &gec6818_eeprom_fops,    //文件操作集
};static int gec6818_eeprom_probe(struct i2c_client *client, const struct i2c_device_id *id)
{int rt;//检查是否支持I2C功能if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {printk("i2c_check_functionality fail\n");return -ENODEV;}   //混杂设备的注册rt = misc_register(&gec6818_eeprom_miscdev);if (rt) {printk("misc_register fail\n");return rt;}//保存client指针,里面有各种设备信息this_client = client;printk("gec6818_eeprom_probe ok\n");return 0;
}static int __devexit gec6818_eeprom_remove(struct i2c_client *client)
{misc_deregister(&gec6818_eeprom_miscdev);return 0;
}static const struct i2c_device_id gec6818_eeprom_id[] = {{ "gec6818_eeprom", 0 },   //设备类型,ID号{ }                            //标识结束
};//添加到内核i2c设备列表
MODULE_DEVICE_TABLE(i2c, gec6818_eeprom_id);// 分配/设置i2c_driver
static struct i2c_driver gec6818_eeprom_driver = {.driver = {.name = "gec6818_eeprom",                     //用于匹配设备(dev下的name).owner = THIS_MODULE,},.probe       = gec6818_eeprom_probe,                    //驱动初始化函数.remove    = __devexit_p(gec6818_eeprom_remove),  //驱动删除.id_table = gec6818_eeprom_id,                       //添加设备ID
};//入口函数
static int __init gec6818_eeprom_drv_init(void)
{printk("gec6818_eeprom_init\n");//添加I2C设备return i2c_add_driver(&gec6818_eeprom_driver);
}//出口函数
static void __exit gec6818_eeprom_drv_exit(void)
{//删除I2C设备i2c_del_driver(&gec6818_eeprom_driver);printk("gec6818 eeprom exit\n");
}module_init(gec6818_eeprom_drv_init);
module_exit(gec6818_eeprom_drv_exit)

main函数入口

#eeprom_test.c  //调用驱动程序代码
#define OLED_CMD  0 //写命令
#define OLED_DATA 1 //写数据
#define u8 unsigned char
int fd=-1;
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{unsigned char buf[2]={0};buf[0]=0x00;buf[1]=IIC_Command;write(fd,buf,2);
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{unsigned char buf[2]={0};buf[0]=0x40;buf[1]=IIC_Data;write(fd,buf,2);
}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_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
{unsigned char c=0,i=0;c=chr-' ';if(x>128-1){x=0;y=y+2;}if(Char_Size ==16){OLED_Set_Pos(x,y);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);OLED_Set_Pos(x,y+1);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);}else{OLED_Set_Pos(x,y);for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);}
}void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
{unsigned char j=0;while (chr[j]!='\0'){OLED_ShowChar(x,y,chr[j],Char_Size);x+=8;if(x>120){x=0;y+=2;}j++;}
}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);}
}int OLED_init(){//OLED 初始化OLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line addressOLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128OLED_WR_Byte(0xA1,OLED_CMD);//set segment remapOLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}
int main(int argc, char **argv)
{int len;int i=0;char buf[8];//打开gec6818_eeprom设备fd = open("/dev/gec6818_eeprom",O_RDWR);if(fd < 0){perror("open /dev/gec6818_eeprom:");return fd;}OLED_init();//oled初始化OLED_Clear();//oled清屏OLED_ShowString(24,0,(u8 *)"Teacher.Wen",16);//oled显示字符串while(1){}close(fd);return 0;
}

效果图

基于[三星6818]I2C驱动开发的0.96寸oled屏相关推荐

  1. STM32驱动代码:STM32F4驱动7针0.96寸OLED显示字符、汉字

    STM32F4驱动7针0.96寸OLED显示字符.汉字 适用于stm32f1.stm32f4移植 工程资料链接:STM32F4驱动7针0.96寸OLED.rar 一. 代码效果 二.硬件准备 1.准备 ...

  2. 0.96寸OLED屏硬件驱动电路

    0.96寸OLED屏硬件驱动电路 该电路适合把OLED驱动电路集成到自己的板子上,最终的原理图和PCB已经上传CSDN,可直接点击链接下载: https://download.csdn.net/dow ...

  3. 0.96寸OLED屏显示(IIC通信)Ⅰ

    0.96寸OLED屏显示(IIC通信) 一.0.96寸OLED简介   0.96寸OLED屏内部驱动IC为SSD1306:兼容6800.8080两种并行接口方式,3线或 4线的串行SPI接口方式和 I ...

  4. 【STM32】HAL库在7针脚0.96寸OLED屏上的移植---硬件SPI(一)

    目录 SPI背景和接线 1.什么是SPI 2.如何接线 STM32CubeMX部分 1.配置时钟 2.配置SPI 3.工程生成 MDK 5 部分 1.移植OLED文件 2.修改引脚 3.修改main函 ...

  5. 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结

    目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...

  6. 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示

    文章目录 **一.SPI(串行外设接口)** **二.使用0.96寸OLED显示屏显示学号姓名** **三.0.96寸OLED在STM32f103上实现滚动显示长字符** **四.参考资料** 一.S ...

  7. 基于STM32和阿里云的矿道环境监测系统(温湿度DHT117,NRF2401(2.4G模块),气体传感器(MQ-3),0.96寸OLED屏,wifi模块)

    基于STM32和阿里云的矿道环境监测系统(温湿度DHT117,NRF2401(2.4G模块),气体传感器(MQ-3)) 系统实现的功能 系统实现的是运用一块STM32F103C8T6作为发射端节点,上 ...

  8. 0.96寸OLED屏使用详解

    如何理解OLED分辨率? 这里0.96寸OLED分辨率是128*64;即OLED显示是128行*64列; 但是由于OLED不能一次控制一个点阵,只能控制8个点阵;而且是垂直方向扫描控制;如下图;因此垂 ...

  9. STM32 I2C驱动0.96寸OLED屏

    本文以STM32F103C8T6最小系统板为例               OLED屏为128*64像素  驱动芯片SSD1306 本文讲解标准库  硬件IIC和软件IIC 驱动OLED 硬件IIC ...

  10. STM32Mini基于SPI接口的0.96寸OLED屏数据显示

    文章目录 一.实验资料准备 1.下载工程包 2.引脚接法 3.字模软件准备 4.了解SPI(串行外设接口) (1)SPI的定义 (2)SPI的连接方式 (3)SPI的通讯过程 5.了解OLED屏的滚屏 ...

最新文章

  1. java comet_用java实现comet,基于 HTTP长连接的实现,用于从服务端实时发送信息到客户端...
  2. html如何太假icon图标,CSS3 icon font完全指南(CSS3 font 会取代icon图标)
  3. linux shell 变量减法_Linux Shell (3) - 变量运算
  4. 设计模式(一)单例模式:5-单元素枚举类模式
  5. 时序数据库influxdb+grafana
  6. 一个WIFI热点的脚本思路,顺记shell知识
  7. linux线程并不真正并行,多核时代:并行程序设计探讨(3)——Windows和Linux对决(多进程多线程)...
  8. 领航物联网智能操作系统,指令集完成过亿元 A 轮融资
  9. [XHTML Tutorial] 走向XHTML标准 (4)(XHTML Syntax)
  10. Java内存溢出的情况
  11. Python—爬取全国城市名称案例(Xpath方法)
  12. 【MisakaHookFinder使用方法】关于如何提取一个文字游戏的文本钩子以供翻译的方法
  13. uni-app实战之社区交友APP(2)全局样式引入和底部导航栏开发
  14. 蓝牙Beacon广播数据包格式以及解析
  15. 阿里云oss添加cdn
  16. 计算机图形学透视投影知识点,计算机图形学
  17. python爬虫公众号音频源代码_python爬取音频下载的示例代码
  18. shell数组目录遍寻循环输出
  19. CF329B Biridian Forest
  20. jmeter-简单接口测试

热门文章

  1. 进行网络广告策划时需要遵循哪些原则呢?
  2. 人民银行笔面圣经收集(转)
  3. 虚幻四C++入坑指南09:C++实现FPS游戏(3)Pitch Yaw Roll的作用 视角旋转 跳跃
  4. win7系统网页激活实验
  5. uni-app -- 小程序添加激励视频(字节-抖音小程序)
  6. 距阵乘以一个未知距阵得单位矩阵 怎么算_干货分享:怎样假装一个带货流水过亿的直播达人?...
  7. 手机远程控制电脑方法 手机远程控制电脑软件使用教程
  8. matlab 分段函数 傅里叶变换,2005_09傅里叶变换及其应用 (第3版)_11482158.pdf
  9. Block insecure private network requests
  10. 清华大学施一公,刚刚发现他的科学网的博客,好博啊