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

資料

字模軟件: https://download.csdn.net/download/donglicaiju76152/10805852
ST7656數據手冊: https://download.csdn.net/download/donglicaiju76152/10805849

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章