基于[三星6818]I2C驱动开发的0.96寸oled屏
基于[三星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屏相关推荐
- STM32驱动代码:STM32F4驱动7针0.96寸OLED显示字符、汉字
STM32F4驱动7针0.96寸OLED显示字符.汉字 适用于stm32f1.stm32f4移植 工程资料链接:STM32F4驱动7针0.96寸OLED.rar 一. 代码效果 二.硬件准备 1.准备 ...
- 0.96寸OLED屏硬件驱动电路
0.96寸OLED屏硬件驱动电路 该电路适合把OLED驱动电路集成到自己的板子上,最终的原理图和PCB已经上传CSDN,可直接点击链接下载: https://download.csdn.net/dow ...
- 0.96寸OLED屏显示(IIC通信)Ⅰ
0.96寸OLED屏显示(IIC通信) 一.0.96寸OLED简介 0.96寸OLED屏内部驱动IC为SSD1306:兼容6800.8080两种并行接口方式,3线或 4线的串行SPI接口方式和 I ...
- 【STM32】HAL库在7针脚0.96寸OLED屏上的移植---硬件SPI(一)
目录 SPI背景和接线 1.什么是SPI 2.如何接线 STM32CubeMX部分 1.配置时钟 2.配置SPI 3.工程生成 MDK 5 部分 1.移植OLED文件 2.修改引脚 3.修改main函 ...
- 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...
- 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示
文章目录 **一.SPI(串行外设接口)** **二.使用0.96寸OLED显示屏显示学号姓名** **三.0.96寸OLED在STM32f103上实现滚动显示长字符** **四.参考资料** 一.S ...
- 基于STM32和阿里云的矿道环境监测系统(温湿度DHT117,NRF2401(2.4G模块),气体传感器(MQ-3),0.96寸OLED屏,wifi模块)
基于STM32和阿里云的矿道环境监测系统(温湿度DHT117,NRF2401(2.4G模块),气体传感器(MQ-3)) 系统实现的功能 系统实现的是运用一块STM32F103C8T6作为发射端节点,上 ...
- 0.96寸OLED屏使用详解
如何理解OLED分辨率? 这里0.96寸OLED分辨率是128*64;即OLED显示是128行*64列; 但是由于OLED不能一次控制一个点阵,只能控制8个点阵;而且是垂直方向扫描控制;如下图;因此垂 ...
- STM32 I2C驱动0.96寸OLED屏
本文以STM32F103C8T6最小系统板为例 OLED屏为128*64像素 驱动芯片SSD1306 本文讲解标准库 硬件IIC和软件IIC 驱动OLED 硬件IIC ...
- STM32Mini基于SPI接口的0.96寸OLED屏数据显示
文章目录 一.实验资料准备 1.下载工程包 2.引脚接法 3.字模软件准备 4.了解SPI(串行外设接口) (1)SPI的定义 (2)SPI的连接方式 (3)SPI的通讯过程 5.了解OLED屏的滚屏 ...
最新文章
- java comet_用java实现comet,基于 HTTP长连接的实现,用于从服务端实时发送信息到客户端...
- html如何太假icon图标,CSS3 icon font完全指南(CSS3 font 会取代icon图标)
- linux shell 变量减法_Linux Shell (3) - 变量运算
- 设计模式(一)单例模式:5-单元素枚举类模式
- 时序数据库influxdb+grafana
- 一个WIFI热点的脚本思路,顺记shell知识
- linux线程并不真正并行,多核时代:并行程序设计探讨(3)——Windows和Linux对决(多进程多线程)...
- 领航物联网智能操作系统,指令集完成过亿元 A 轮融资
- [XHTML Tutorial] 走向XHTML标准 (4)(XHTML Syntax)
- Java内存溢出的情况
- Python—爬取全国城市名称案例(Xpath方法)
- 【MisakaHookFinder使用方法】关于如何提取一个文字游戏的文本钩子以供翻译的方法
- uni-app实战之社区交友APP(2)全局样式引入和底部导航栏开发
- 蓝牙Beacon广播数据包格式以及解析
- 阿里云oss添加cdn
- 计算机图形学透视投影知识点,计算机图形学
- python爬虫公众号音频源代码_python爬取音频下载的示例代码
- shell数组目录遍寻循环输出
- CF329B Biridian Forest
- jmeter-简单接口测试
热门文章
- 进行网络广告策划时需要遵循哪些原则呢?
- 人民银行笔面圣经收集(转)
- 虚幻四C++入坑指南09:C++实现FPS游戏(3)Pitch Yaw Roll的作用 视角旋转 跳跃
- win7系统网页激活实验
- uni-app -- 小程序添加激励视频(字节-抖音小程序)
- 距阵乘以一个未知距阵得单位矩阵 怎么算_干货分享:怎样假装一个带货流水过亿的直播达人?...
- 手机远程控制电脑方法 手机远程控制电脑软件使用教程
- matlab 分段函数 傅里叶变换,2005_09傅里叶变换及其应用 (第3版)_11482158.pdf
- Block insecure private network requests
- 清华大学施一公,刚刚发现他的科学网的博客,好博啊