STM8L驱动I2C类型的12864
原理
之前没有操作过12864这种类型的屏,但是,操作过其他类型的,原理都是相通的。12864是拥有128x64像素点这类屏幕的称号吧。屏幕有64行,128列;每个汉字是16x16,所以一个这样的屏,最多可以显示4x8的汉字或者8x16的字符。
我使用的是不带字库的I2C接口的屏幕,主芯片是ST7656。这样的屏,只能写,不能读。先配置屏幕,然后通过字模制作软件制作出待显示内容的像素数字,最后,通过数据线传送给屏幕显示。了解了原理后,接下来就根据主芯片的数据手册进行配置屏幕就好了。
硬件连线
- CS:片选
- RST: 复位
- RS:数据或命令选择
- SDA:I2C数据线
- SCL:I2C时钟线
I2C采用的是软件模拟的
底层写操作
#define IO_ST7565_CS_0 GPIO_WriteBit(GPIOB, GPIO_Pin_5, RESET)
#define IO_ST7565_CS_1 GPIO_WriteBit(GPIOB, GPIO_Pin_5, SET)#define IO_ST7565_SDA_0 GPIO_WriteBit(GPIOB, GPIO_Pin_1, RESET)
#define IO_ST7565_SDA_1 GPIO_WriteBit(GPIOB, GPIO_Pin_1, SET) #define IO_ST7565_SCK_0 GPIO_WriteBit(GPIOB, GPIO_Pin_2, RESET)
#define IO_ST7565_SCK_1 GPIO_WriteBit(GPIOB, GPIO_Pin_2, SET) #define IO_ST7565_RST_0 GPIO_WriteBit(GPIOB, GPIO_Pin_4, RESET)
#define IO_ST7565_RST_1 GPIO_WriteBit(GPIOB, GPIO_Pin_4, SET)#define IO_ST7565_RS_0 GPIO_WriteBit(GPIOB, GPIO_Pin_3, RESET)
#define IO_ST7565_RS_1 GPIO_WriteBit(GPIOB, GPIO_Pin_3, SET)static void io_delay(uint16_t nCount)
{while (nCount--);
}/* rs == 1 data rs==0 cmd */
void ST7565_Write(uint8_t dat,uint8_t rs)
{uint8_t i;IO_ST7565_SCK_0;IO_ST7565_CS_0;if(!rs){IO_ST7565_RS_0; //Command}else{IO_ST7565_RS_1;}io_delay(5);for(i = 0; i < 8; i++){ if( dat & 0x80){IO_ST7565_SDA_1;}else{IO_ST7565_SDA_0;}dat <<= 1;IO_ST7565_SCK_1;io_delay(5);IO_ST7565_SCK_0;io_delay(5);}io_delay(5);IO_ST7565_CS_1;IO_ST7565_RS_1;io_delay(5);
}/* write cmd */
void writec(uint8_t com)
{ ST7565_Write(com,0);
}/* write data */
void writed(uint8_t dat)
{ ST7565_Write(dat,1);
}
初始化
void LcmClear(uint8_t FillData)
{uint8_t i,j;for(i=0;i<8;i++){writec(0xB0|i); //Set Page Addresswritec(0x10); //Set Column Address = 0writec(0x00); //Colum from S1 -> S128 auto addfor(j=0;j<132;j++){writed( FillData );}}
}void LcmInit(void)
{IO_ST7565_CS_1;IO_ST7565_RST_0;delay_ms(10); //hard reset for 10msIO_ST7565_RST_1;delay_ms(10); writec(0xAE); //Display OFFwritec(0xA2); //1/64 Duty 1/9 Biaswritec(0xA0); //ADC select S0->S131(玻璃设计用S1-S128)writec(0xC0); //com1 --> com64writec(0x24); //对某些模块没用,用的外部Rb/Rawritec(0x81); //Sets V0writec(48); //内部电位器调节对比度writec(0x2F); //voltage follower ON regulator ON booster ONwritec(0xA6); //Normal Display (not reverse dispplay)writec(0xA4); //Entire Display Disablewritec(0x40); //Set Display Start Line = com0writec(0xB0); //Set Page Address = 0writec(0x10); //Set Column Address 4 higher bits = 0writec(0x00); //Set Column Address 4 lower bits = 1 , from IC SEG1 -> SEG128LcmClear(0);writec(0xAF); //Display ON
}
上面的这些命令代表什么含义,输入的命令值具体代表什么,都可以在ST7656的官方数据手册中找到答案。
应用
使用字模软件制作字模:
uint8_t hzk[] = {/*-- 文字: 请 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFE,0x04,0x08,0x00,0xFF,0xA8,0xA8,0xA8,0xAA,0xA9,0xFE,0x00,0x00,0x00,0x02,0x42,0x33,0x00,0x00,0x22,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x22,0x02,0x00,
}uint8_t num[] = {/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,
}/* page: 0 - 7; col: 0 - 128 */
void show_char(uint8_t page, uint8_t col, uint8_t *data)
{uint8_t i;/* set page address */writec(0xB0 | page);/* set column address */writec(0x10 | col >> 4);writec(col & 0xf);for(i = 8; i < 16; i++) {writed(data[i]);}page++;/* set page address */writec(0xB0 | page);/* set column address */writec((0x10 | (col >> 4)));writec(col & 0xf);for(i = 0; i < 8; i++){writed(data[i]);}
}/* page: 0/2/4/6; col: 0 - 128 */
void show_chinese(uint8_t page, uint8_t col, uint8_t *data)
{uint8_t i;/* set page address */writec(0xB0 | page);/* set column address */writec(0x10 | col >> 4);writec(col & 0xf);for(i = 0; i < 16; i++) {writed(data[i]);}page++;/* set page address */writec(0xB0 | page);/* set column address */writec((0x10 | (col >> 4)));writec(col & 0xf);for(i = 16; i < 32; i++){writed(data[i]);}
}show_chinese(4, 0x20, hzk);
show_char(2, 0x30, num);
资料
字模软件: https://download.csdn.net/download/donglicaiju76152/10805852
ST7656数据手册: https://download.csdn.net/download/donglicaiju76152/10805849
STM8L驱动I2C类型的12864相关推荐
- Arduino驱动I2C接口12864LCD大屏液晶模块方法及库文件
关键词:Arduino显示,12864液晶模块,中文显示,IIC接口,I2C接口,12864驱动程序 液晶显示模块目前在中国发展已经有30多个年头了,市场上应用最广泛的要属于128*64点阵的显示屏, ...
- linux驱动--i2c驱动学习
转至:http://blog.csdn.net/ghostyu/article/details/8094049 预备知识 在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c ...
- STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片)
STM32 HAL 驱动I2C总线0.91寸OLED模块(基于SSD1306显示驱动芯片) 基于SSD1306驱动芯片的OLED模块有多种型号,有0.91英寸,0.96英寸等等.OLED采用单色显示方 ...
- 基于Lua框架下Air103使用U8g2库驱动I2C OLED图像显示
基于Lua框架下Air103使用U8g2库驱动I2C OLED屏幕图像演示
- ESP32基于Arduino框架下U8g2驱动I2C OLED 时间显示
ESP32基于Arduino框架下U8g2驱动I2C OLED时间显示
- 和12岁小同志搞创客开发:如何驱动各类型传感器?
目录 1.数字量输出类型传感器 2.数字量输入类型传感器 3.模拟量电压类型传感器 4.模拟量电流类型传感器 5.协议类型传感器 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和 ...
- (6)LinuxI2C驱动--I2C设备驱动
本节主要分析eeprom的所属的i2c设备驱动,此驱动主要实现了能够通过sysfs文件系统访问eeprom. 1. eeprom板级设备资源 因为原开发板的eeprom驱动还没调试好,板级资源还没写好 ...
- CSR8670蓝牙芯片驱动I2C接口的1602LCD显示屏
硬件操作的说明: 1. 使用晶联电子的1602A LCD的I2C通信接口,其工作电压是3.3V (所以CSR867x I2C信号有电平也要就要是3.3V,若是1.8V则会驱动失败 2.CSR8670 ...
- Linux驱动 | MPU6050驱动(I2C)
MPU6050 2. MPU6050模块 - [野火]STM32模块例程介绍 文档 https://doc.embedfire.com/module/module_tutorial/zh/latest ...
- ESP32驱动0.96寸12864 OLED显示屏
ESP32学习导航帖 1.用adafruit_ssd1306库 代码 #include <Wire.h> #include <Adafruit_SSD1306.h> #defi ...
最新文章
- w​i​n​8​.1​无​线​上​网​ ​B​r​o​a​d​c​o​m​ ​8​0​2​.​1​1​n​ ​受​限​问​题
- python中处理日期和时间的标准模块是-关于时间和Python的时间处理模块
- php 注册树,php常用设计模式(单例,工厂,注册树模式)
- 201112阶段二qt图形视图框架
- 目录操作相关的系统函数
- 觅凤c语言教程,C语言程序设计教程 第1章.ppt
- extjs 月份选择控件_ExtJs日期控件案例(可控制时间的选择) | 学步园
- mybatis 插入数据后返回自增id
- jsp servlet示例_Java Servlet Cookies示例
- redis scan命令详解
- 下载verycd的方法下载电驴资源隐藏资源的最新可用方法
- adb shell 命令
- 使用instsrv.exe和srvany.exe创建windows服务
- 华为研发机试题目集合整理
- “程序员猝死”引发的思考
- 北航计算机学院好气派,2017年北京航空航天大学国内排名第几
- msgbox在matlab中,Matlab load global 变量 length( ) 函数 msgbox( )函数
- 聚苯硫醚离子液体|苯硼酸离子液体|聚缩醛离子液体|透明质酸离子液体
- 50本关于软件测试的书籍
- c语言如何不用数组排序,c语言实现数组排序.docx
热门文章
- 【金融量化】基金止盈止损法则
- html5制作当当图书榜页面,当当图书.html
- Labview程序优化
- snmp安装及自定义mib
- spoon mysql教程_kettle 教程(一):简介及入门
- 机器学习数据预处理之字符串转数字
- 解决知网外文文献无法下载全文的问题
- php读取excel 报错_php读取excel内存溢出
- G代码表《G代码大全》
- 腾讯联手联通推出车联网“网卡”,打“内容”+“流量”的组合拳...