入手一个ST7567A-12864LCD屏的屏幕,不知道怎么驱动。自己捣鼓了很久,先用网上的代码,发现行不通。
我就在网上找了很久,找到了这款屏幕的资料。
这个屏幕跟常见的LCD12864是不一样的,它没有字库。
下面是单片机驱动代码:
- #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; //写入命令
- }
- //写入一个数据到12864
- void LCD12864_Write_A_Data(uchar dat)
- {
- CSPIN = 0; //打开片选
- RDPIN = 1; //读失能
- RSPIN = 1; //选择数据
- RWPIN = 0; //选择写模式
- _nop_();
- _nop_();
- LCD_DATA_PORT = dat; //放置数据
- _nop_();
- _nop_();
- RWPIN = 1; //写数据
- }
- //初始化12864
- void LCD12864_Init(void)
- {
- uchar i;
- RESET = 0;
- for (i=0; i<100; i++);
- CSPIN = 0;
- RESET = 1;
- //----------------Start Initial Sequence-------//
- //------程序初始化设置,具体命令可以看文件夹下的数据手册---//
- //--软件初始化--//
- 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为设置字体为黑色,背景为白色---//
- //--0xA7为设置字体为白色,背景为黑色---//
- 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个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
- //--0xF801,选择增压为5X,其实效果差不多--//
- LCD12864_Write_A_Command(0xF8); //Boost ratio set
- LCD12864_Write_A_Command(0x01); //x4
- //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
- //--选择从0x00到0X3F。用来设置背景光对比度。---/
- LCD12864_Write_A_Command(0x81); //V0 a set
- LCD12864_Write_A_Command(0x23);
- //--表格第17个命令,选择调节电阻率--//
- LCD12864_Write_A_Command(0x25); //Ra/Rb set
- //--表格第16个命令,电源设置。--//
- LCD12864_Write_A_Command(0x2F);
- for (i=0; i<100; i++);
- //--表格第2个命令,设置显示开始位置--//
- 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个命令,设置Y的坐标--//
- //--Y轴有64个,一个坐标8位,也就是有8个坐标--//
- //所以一般我们使用的也就是从0xB0到0x07,就够了--//
- LCD12864_Write_A_Command(0xB0 + i);
- //--表格第4个命令,设置X坐标--//
- //--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--//
- //--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--//
- //--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--//
- //--我们的X坐标从0x10,0x00开始---//
- LCD12864_Write_A_Command(0x10);
- LCD12864_Write_A_Command(0x00);
- //--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//
- for(j = 0; j < 128; j++)
- {
- LCD12864_Write_A_Data(0x00); //如果设置背景为白色时,清屏选择0XFF
- }
- }
- }
- // 清屏12864,指定区域清屏(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); //设置y坐标
- x11 = (x1 >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x22 = x1 & 0x0F; //取低四位
- //--设置X坐标--//
- LCD12864_Write_A_Command(0x10 + x11); //高4位
- LCD12864_Write_A_Command(0x00 + x22); //低4位
- //X坐标会自动加1,所以我们不用再设置坐标--//
- for(j = x1; j <= x2; j++)
- {
- LCD12864_Write_A_Data(0x00); //如果设置背景为白色时,清屏选择0XFF
- }
- }
- return 1;
- }
- //在12864上面显示汉字,reentrant参数使函数重入
- //x,y为需要显示汉字的起始XY坐标,sized为汉字的分辨率大小,*cn为汉字字库数组
- 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坐标的值
- //--设置Y坐标--//
- LCD12864_Write_A_Command(y);
- x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x2 = x & 0x0F; //去低四位
- //--设置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++);
- }
- //--设置Y坐标--//
- y++;
- LCD12864_Write_A_Command(y);
- //新行要重新设置列地址
- x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x2 = x & 0x0F; //去低四位
- //--设置X坐标--//
- LCD12864_Write_A_Command(0x10 + x1); //高4位
- LCD12864_Write_A_Command(0x00 + x2); //低4位
- }
- return 1;
- }
- //在12864上面显示BMP图像
- //x,y为需要显示图像的起始XY坐标,sized为图像的分辨率大小,*cn为图像数组
- 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坐标的值
- //--设置Y坐标--//
- LCD12864_Write_A_Command(y);
- x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x2 = x & 0x0F; //去低四位
- //--设置X坐标--//
- LCD12864_Write_A_Command(0x10 + x1); //高4位
- LCD12864_Write_A_Command(0x00 + x2); //低4位
- for(i = 0; i < (sized / 8); i++){ //sized/8为显示完图像需要的行数,一行为8位,所以显示16x16的图像需要两行
- for(j = 0; j < sized; j++){ //sized为显示完图像需要的列数,一列1位,所以显示16x16的图像需要16列
- LCD12864_Write_A_Data(*cn++);
- }
- //--设置Y坐标--//
- //显示完第一行的数据,需要重新设置下一行的地址
- y++;
- LCD12864_Write_A_Command(y);
- //写列数据时,x坐标会自动+1,所以新行要重新设置列地址
- x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x2 = x & 0x0F; //去低四位
- //--设置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);//联
- //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);//回
- }
- //显示联系人信息页
- void LCD_Display_Contact(void)
- {
- LCD_Display_ForRew();//显示左右图标
- LCD12864_Display_BMP(48, 0, BMPSIZE32, contact);//显示联系人图标
- //LCD12864_Clear_XYScreen(40, 4, 88, 5);//清除显示屏指定位置信息
- LCD12864_Display_CnCHAR(40, 4, CHINESECHARSIZE16, contact + 128);//联
- 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);//锁
- }
复制代码
驱动芯片的资料(仅供参考):
ST7565p数据手册.pdf
(858.26 KB, 下载次数: 99)
其他不重要资料(仅供参考):
12864数据手册.pdf
(1.3 MB, 下载次数: 72)
12864转接原理图.pdf
(148.73 KB, 下载次数: 52)
实验必读.doc
(291 KB, 下载次数: 51)
|