STM8L驱动I2C类型的12864

2019-11-11来源: eefocus关键字: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 Address

writec(0x10); //Set Column Address = 0

writec(0x00); //Colum from S1 -> S128 auto add

for(j=0;j<132;j++)

{

writed( FillData );

}

}

}


void LcmInit(void)

{

IO_ST7565_CS_1;

IO_ST7565_RST_0;

delay_ms(10); //hard reset for 10ms

IO_ST7565_RST_1;

delay_ms(10); 


writec(0xAE); //Display OFF

writec(0xA2); //1/64 Duty 1/9 Bias

writec(0xA0); //ADC select S0->S131(玻璃设计用S1-S128)

writec(0xC0); //com1 --> com64

writec(0x24); //对某些模块没用,用的外部Rb/Ra

writec(0x81); //Sets V0

writec(48);   //内部电位器调节对比度

writec(0x2F); //voltage follower ON regulator ON booster ON

writec(0xA6); //Normal Display (not reverse dispplay)

writec(0xA4); //Entire Display Disable

writec(0x40); //Set Display Start Line = com0

writec(0xB0); //Set Page Address = 0

writec(0x10); //Set Column Address 4 higher bits = 0

writec(0x00); //Set Column Address 4 lower bits = 1 , from IC SEG1 -> SEG128

LcmClear(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);

关键字:STM8L  驱动I2C类型  12864 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479614.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8S003的GPIO模拟I2C切换输入输出的解决办法
下一篇:stm8 调试硬件I2C心得

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8L低功耗调试总结
STM8L低功耗调试资料准备功耗数据目标实现低功耗资料准备在调试STM单片机相关功能时,习惯性的进入到STM官方论坛进行资料下载。调试STM8功耗也不例外,找到STM8L的应用笔记,选择最热,先看看官方提供的STM8入门文档,入门资料可以选择中文或者英文(STM8L和STM8AL入门)。资料里面有一段话,对功耗调试相当重要:6.6 不使用的 I/O 和特性微控制器都是为多种应用设计的,通常一个应用不会使用 100 % 的微控制器资源。为了避免不必要的功率消耗 (对电池供电应用特别重要),同时提高 EMC 性能,闲置时钟、计数器或 I/O 都不应浮空。 I/O 应该外部强制 (上拉或者下拉到闲置 I/O 引脚),并且不使用的功能应
发表于 2019-11-14
STM8L低功耗调试总结
halt低功耗模式
1. stm8l152有5种低功耗模式,wait mode, low power run mode, low power wait mode, active-halt mode, halt mode.2. 在halt模式下,cpu和外设时钟停止,可以通过外部中断或者复位来唤醒。3. 本实验设计为:led灯亮,紧接着进入halt模式,有按键时,中断,快速唤醒,led灯灭。     PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能     //所有IO输出低电平    GPIO_Init(GPIOA
发表于 2019-11-14
STM8L051低功耗模式测试文档
STM8L051的五种低功耗模式wait ,low power run mode,low power wait mode,Ative-Halt mode,Halt mode。WAIT  mode  在等待模式,CPU的时钟是停止的,被选择的外设继续运行。WAIT mode 分为两种方式:WFE,WFI。WFE是等待事件发生,才从等待模式中唤醒。WFI是等待中断发生,才从等待模式中唤醒。low power run mode  在低功耗运行模式下,CPU和被选择的外设在工作,程序执行在LSI或者LSE下,从RAM中执行程序,Flash和EEPROM都要停止运行。电压被配置成Ultra Low Power
发表于 2019-11-14
stm8l 低功耗 halt_active模式
第一次尝试做低功耗,芯片stm8l,用的半halt模式1、关于唤醒,可以用外部中断和RTC(stm8l不同的模式用的唤醒方式均不同)2、关于省电,如果没达到理想的电流,一般都是gpio口问题,没用到的都悬浮输入或输出低都是可以的,用到的统一量一下电平,看看哪个状态不对
发表于 2019-11-14
STM8L EXITB一个端口两个中断的实现
void EXTI_Config(void){     EXTI_DeInit();       EXTI_SetPinSensitivity(EXTI_Pin_5,EXTI_Trigger_Falling);     ITC_SetSoftwarePriority(EXTI5_IRQn, ITC_PriorityLevel_1);    GPIO_Init(KEY_PORT, KEY_RT_PIN, GPIO_Mode_In_PU_IT);    EXTI_SetPinSensitivity(
发表于 2019-11-14
STM8L 151G6U6 驱动RW1820温度传感器
兼容DS18B20以及RW1820(VDD=2.8V)版本#define RW1820_DQ_OUT  GPIO_Init(GPIOC, GPIO_PIN_2,GPIO_Mode_Out_OD_HiZ_Slow); //输出#define RW1820_DQ_IN   GPIO_Init(GPIOC, GPIO_PIN_2, GPIO_Mode_In_PU_No_IT);     //输入#define RW1820_DQ_HIGH          GPIO_SetBits(GPIOC, GPIO_PIN_2); //拉高#define RW
发表于 2019-11-13
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved