標題:
ST7567A-12864LCD屏幕驅(qū)動程序與資料
[打印本頁]
作者:
z6z7z8
時間:
2022-3-9 22:56
標題:
ST7567A-12864LCD屏幕驅(qū)動程序與資料
入手一個
ST7567A-12864LCD屏
的屏幕,不知道怎么驅(qū)動。自己搗鼓了很久,先用網(wǎng)上的代碼,發(fā)現(xiàn)行不通。
我就在網(wǎng)上找了很久,找到了這款屏幕的資料。
1.png
(173.6 KB, 下載次數(shù): 81)
下載附件
2022-3-10 02:12 上傳
這個屏幕跟常見的LCD12864是不一樣的,它沒有字庫。
下面是單片機驅(qū)動代碼:
#include <reg52.h>
#include <intrins.h>
#include "LCD12864.h"
#include "charcode.h"
#include <delay.h>
//寫入一個命令到12864
void LCD12864_Write_A_Command(uchar cmd)
{
CSPIN = 0; //打開片選
RDPIN = 1; //讀失能
RSPIN = 0; //選擇命令
RWPIN = 0; //選擇寫模式
_nop_();
_nop_();
LCD_DATA_PORT = cmd; //放置命令
_nop_();
_nop_();
RWPIN = 1; //寫入命令
}
//寫入一個數(shù)據(jù)到12864
void LCD12864_Write_A_Data(uchar dat)
{
CSPIN = 0; //打開片選
RDPIN = 1; //讀失能
RSPIN = 1; //選擇數(shù)據(jù)
RWPIN = 0; //選擇寫模式
_nop_();
_nop_();
LCD_DATA_PORT = dat; //放置數(shù)據(jù)
_nop_();
_nop_();
RWPIN = 1; //寫數(shù)據(jù)
}
//初始化12864
void LCD12864_Init(void)
{
uchar i;
RESET = 0;
for (i=0; i<100; i++);
CSPIN = 0;
RESET = 1;
//----------------Start Initial Sequence-------//
//------程序初始化設(shè)置,具體命令可以看文件夾下的數(shù)據(jù)手冊---//
//--軟件初始化--//
LCD12864_Write_A_Command(0xE2); //reset
for (i=0; i<100; i++); //延時一下
//--表格第8個命令,0xA0段(左右)方向選擇正常方向(0xA1為反方向)--//
LCD12864_Write_A_Command(0xA0); //ADC select segment direction
//--表格第15個命令,0xC8普通(上下)方向選擇選擇反向,0xC8為正常方向,0xC0反向--//
LCD12864_Write_A_Command(0xC8); //Common direction
//--表格第9個命令,0xA6為設(shè)置字體為黑色,背景為白色---//
//--0xA7為設(shè)置字體為白色,背景為黑色---//
LCD12864_Write_A_Command(0xA6); //reverse display
//--表格第10個命令,0xA4像素正常顯示,0xA5像素全開--//
LCD12864_Write_A_Command(0xA4); //normal display
//--表格第11個命令,0xA3偏壓為1/7,0xA2偏壓為1/9--//
LCD12864_Write_A_Command(0xA2); //bias set 1/9
//--表格第19個命令,這個是個雙字節(jié)的命令,0xF800選擇增壓為4X;--//
//--0xF801,選擇增壓為5X,其實效果差不多--//
LCD12864_Write_A_Command(0xF8); //Boost ratio set
LCD12864_Write_A_Command(0x01); //x4
//--表格第18個命令,這個是個雙字節(jié)命令,高字節(jié)為0X81,低字節(jié)可以--//
//--選擇從0x00到0X3F。用來設(shè)置背景光對比度。---/
LCD12864_Write_A_Command(0x81); //V0 a set
LCD12864_Write_A_Command(0x23);
//--表格第17個命令,選擇調(diào)節(jié)電阻率--//
LCD12864_Write_A_Command(0x25); //Ra/Rb set
//--表格第16個命令,電源設(shè)置。--//
LCD12864_Write_A_Command(0x2F);
for (i=0; i<100; i++);
//--表格第2個命令,設(shè)置顯示開始位置--//
LCD12864_Write_A_Command(0x40); //start line
//--表格第1個命令,開啟顯示--//
LCD12864_Write_A_Command(0xAF); // display on
for (i=0; i<100; i++);
}
//清屏12864
void LCD12864_Clear_Screen(void)
{
uchar i, j;
for(i=0; i<8; i++)
{
//--表格第3個命令,設(shè)置Y的坐標--//
//--Y軸有64個,一個坐標8位,也就是有8個坐標--//
//所以一般我們使用的也就是從0xB0到0x07,就夠了--//
LCD12864_Write_A_Command(0xB0 + i);
//--表格第4個命令,設(shè)置X坐標--//
//--當你的段初始化為0xA1時,X坐標從0x10,0x04到0x18,0x04,一共128位--//
//--當你的段初始化為0xA0時,X坐標從0x10,0x00到0x18,0x00,一共128位--//
//--在寫入數(shù)據(jù)之后X坐標的坐標是會自動加1的,我們初始化使用0xA0所以--//
//--我們的X坐標從0x10,0x00開始---//
LCD12864_Write_A_Command(0x10);
LCD12864_Write_A_Command(0x00);
//--X軸有128位,就一共刷128次,X坐標會自動加1,所以我們不用再設(shè)置坐標--//
for(j = 0; j < 128; j++)
{
LCD12864_Write_A_Data(0x00); //如果設(shè)置背景為白色時,清屏選擇0XFF
}
}
}
// 清屏12864,指定區(qū)域清屏(x1, y1)-(x2, y2)
uchar LCD12864_Clear_XYScreen(uchar x1, uchar y1, uchar x2, uchar y2)
{
uchar i, j, x11, x22;
//--Y的坐標只能從0到7,大于則直接返回--//
if((y1 > 7 || y1 < 0) || (y2 > 7 || y2 < 0)){
return 0;
}
//--X的坐標只能從0到127,大于則直接返回--//
if((x1 > 127 || x1 < 0) || (x2 > 127 || x2 < 0)){
return 0;
}
for(i = y1; i <= y2; i++)
{
LCD12864_Write_A_Command(0xB0 + i); //設(shè)置y坐標
x11 = (x1 >> 4) & 0x0F; //由于X坐標要兩句命令,分高低4位,所以這里先取出高4位
x22 = x1 & 0x0F; //取低四位
//--設(shè)置X坐標--//
LCD12864_Write_A_Command(0x10 + x11); //高4位
LCD12864_Write_A_Command(0x00 + x22); //低4位
//X坐標會自動加1,所以我們不用再設(shè)置坐標--//
for(j = x1; j <= x2; j++)
{
LCD12864_Write_A_Data(0x00); //如果設(shè)置背景為白色時,清屏選擇0XFF
}
}
return 1;
}
//在12864上面顯示漢字,reentrant參數(shù)使函數(shù)重入
//x,y為需要顯示漢字的起始XY坐標,sized為漢字的分辨率大小,*cn為漢字字庫數(shù)組
uchar LCD12864_Display_CnCHAR(uchar x, uchar y, uchar sized, uchar *cn) reentrant
{
uchar i, j, x1, x2;
//--Y的坐標只能從0到7,大于則直接返回--//
if(y > 7 || y < 0){
return 0;
}
//--X的坐標只能從0到127,大于則直接返回--//
if(x > 127 || x <0){
return 0;
}
y += 0xB0; //求取Y坐標的值
//--設(shè)置Y坐標--//
LCD12864_Write_A_Command(y);
x1 = (x >> 4) & 0x0F; //由于X坐標要兩句命令,分高低4位,所以這里先取出高4位
x2 = x & 0x0F; //去低四位
//--設(shè)置X坐標--//
LCD12864_Write_A_Command(0x10 + x1); //高4位
LCD12864_Write_A_Command(0x00 + x2); //低4位
for(i = 0; i < (sized / 8); i++){
for(j = 0; j < sized; j++){
LCD12864_Write_A_Data(*cn++);
}
//--設(shè)置Y坐標--//
y++;
LCD12864_Write_A_Command(y);
//新行要重新設(shè)置列地址
x1 = (x >> 4) & 0x0F; //由于X坐標要兩句命令,分高低4位,所以這里先取出高4位
x2 = x & 0x0F; //去低四位
//--設(shè)置X坐標--//
LCD12864_Write_A_Command(0x10 + x1); //高4位
LCD12864_Write_A_Command(0x00 + x2); //低4位
}
return 1;
}
//在12864上面顯示BMP圖像
//x,y為需要顯示圖像的起始XY坐標,sized為圖像的分辨率大小,*cn為圖像數(shù)組
uchar LCD12864_Display_BMP(uchar x, uchar y, uchar sized, uchar *cn)
{
uchar i, j, x1, x2;
//--Y的坐標只能從0到7,大于則直接返回--//
if(y > 7 || y < 0){
return 0;
}
//--X的坐標只能從0到127,大于則直接返回--//
if(x > 127 || x <0){
return 0;
}
y += 0xB0; //求取Y坐標的值
//--設(shè)置Y坐標--//
LCD12864_Write_A_Command(y);
x1 = (x >> 4) & 0x0F; //由于X坐標要兩句命令,分高低4位,所以這里先取出高4位
x2 = x & 0x0F; //去低四位
//--設(shè)置X坐標--//
LCD12864_Write_A_Command(0x10 + x1); //高4位
LCD12864_Write_A_Command(0x00 + x2); //低4位
for(i = 0; i < (sized / 8); i++){ //sized/8為顯示完圖像需要的行數(shù),一行為8位,所以顯示16x16的圖像需要兩行
for(j = 0; j < sized; j++){ //sized為顯示完圖像需要的列數(shù),一列1位,所以顯示16x16的圖像需要16列
LCD12864_Write_A_Data(*cn++);
}
//--設(shè)置Y坐標--//
//顯示完第一行的數(shù)據(jù),需要重新設(shè)置下一行的地址
y++;
LCD12864_Write_A_Command(y);
//寫列數(shù)據(jù)時,x坐標會自動+1,所以新行要重新設(shè)置列地址
x1 = (x >> 4) & 0x0F; //由于X坐標要兩句命令,分高低4位,所以這里先取出高4位
x2 = x & 0x0F; //去低四位
//--設(shè)置X坐標--//
LCD12864_Write_A_Command(0x10 + x1); //高4位
LCD12864_Write_A_Command(0x00 + x2); //低4位
}
return 1;
}
uchar a;
//啟動頁
void LCD_Start_Page(void)
{
while(1){
a=a+1;
if(a>9){
a=0;
}
LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, number+a*32);
LCD12864_Display_CnCHAR(14, 6, CHINESECHARSIZE16, function+4*32);
LCD12864_Display_CnCHAR(30, 6, CHINESECHARSIZE16, function+5*32);
Delay1000ms();
LCD12864_Clear_Screen();
}
//LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, number);//功
//LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, number + 32);//能
//LCD12864_Display_CnCHAR(95, 6, CHINESECHARSIZE16, number + 64);//鎖
//LCD12864_Display_CnCHAR(111, 6, CHINESECHARSIZE16, number + 96);//定
//LCD12864_Display_CnCHAR(16, 1, CHINESECHARSIZE16, number);//中
//LCD12864_Display_CnCHAR(40, 1, CHINESECHARSIZE16, number + 72);//國
//LCD12864_Display_CnCHAR(64, 1, CHINESECHARSIZE16, number + 144);//聯(lián)
//LCD12864_Display_CnCHAR(88, 1, CHINESECHARSIZE16, number + 216);//通
}
//顯示左右圖標
void LCD_Display_ForRew(void)
{
LCD12864_Display_BMP(20, 2, BMPSIZE16, for_rew);//左圖標
LCD12864_Display_BMP(92, 2, BMPSIZE16, for_rew + 32);//右圖標
}
//顯示短信信息頁
void LCD_Display_Message(void)
{
LCD_Display_ForRew();//顯示左右圖標
LCD12864_Display_BMP(48, 0, BMPSIZE32, message);//顯示信息圖標
//LCD12864_Clear_XYScreen(40, 4, 88, 5);//清除顯示屏指定位置信息
LCD12864_Display_CnCHAR(48, 4, CHINESECHARSIZE16, message + 128);//信
LCD12864_Display_CnCHAR(64, 4, CHINESECHARSIZE16, message + 160);//息
LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, select_return);//選
LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, select_return + 32);//擇
LCD12864_Display_CnCHAR(95, 6, CHINESECHARSIZE16, select_return + 64);//返
LCD12864_Display_CnCHAR(111, 6, CHINESECHARSIZE16, select_return + 96);//回
}
//顯示聯(lián)系人信息頁
void LCD_Display_Contact(void)
{
LCD_Display_ForRew();//顯示左右圖標
LCD12864_Display_BMP(48, 0, BMPSIZE32, contact);//顯示聯(lián)系人圖標
//LCD12864_Clear_XYScreen(40, 4, 88, 5);//清除顯示屏指定位置信息
LCD12864_Display_CnCHAR(40, 4, CHINESECHARSIZE16, contact + 128);//聯(lián)
LCD12864_Display_CnCHAR(56, 4, CHINESECHARSIZE16, contact + 160);//系
LCD12864_Display_CnCHAR(72, 4, CHINESECHARSIZE16, contact + 192);//人
LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, select_return);//選
LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, select_return + 32);//擇
LCD12864_Display_CnCHAR(95, 6, CHINESECHARSIZE16, select_return + 64);//返
LCD12864_Display_CnCHAR(111, 6, CHINESECHARSIZE16, select_return + 96);//回
}
//鎖定屏幕
void LCD_Locked_Screen(void)
{
LCD12864_Display_CnCHAR(4, 1, CHINESECHARSIZE24, locked_screen);//屏
LCD12864_Display_CnCHAR(28, 1, CHINESECHARSIZE24, locked_screen + 72);//幕
LCD12864_Display_CnCHAR(52, 1, CHINESECHARSIZE24, locked_screen + 144);//已
LCD12864_Display_CnCHAR(74, 1, CHINESECHARSIZE24, locked_screen + 216);//鎖
LCD12864_Display_CnCHAR(98, 1, CHINESECHARSIZE24, locked_screen + 288);//定
LCD12864_Display_CnCHAR(0, 6, CHINESECHARSIZE16, locked_screen + 360);//解
LCD12864_Display_CnCHAR(16, 6, CHINESECHARSIZE16, locked_screen + 392);//鎖
}
復制代碼
驅(qū)動芯片的資料(僅供參考):
ST7565p數(shù)據(jù)手冊.pdf
(858.26 KB, 下載次數(shù): 99)
2022-3-9 22:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
其他不重要資料(僅供參考):
12864數(shù)據(jù)手冊.pdf
(1.3 MB, 下載次數(shù): 72)
2022-3-9 22:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
12864轉(zhuǎn)接原理圖.pdf
(148.73 KB, 下載次數(shù): 52)
2022-3-9 22:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
實驗必讀.doc
(291 KB, 下載次數(shù): 51)
2022-3-9 22:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1