|
网上这个液晶驱动基本没有,写了几天,实测基本功能都能实现,供大家参考
下载:
128128驱动.zip
(6.67 KB, 下载次数: 106)
部分程序预览:
- /************* 8080接口协议******************************/
- #include "128128driver.h"
- //#include "stm32f10x_gpio.h"
- //#include "stm32f10x_rcc.h"
- #include "ziku.h"
- #include "chziku.h"
- #include "systick.h"
- /************* 定义函数变量******************************/
- void lcd_busy(void);
- void SysTick_Init(void);
- void lcd_clear(void);
- extern const struct typFont16 Font16lib[];
-
- /**********************************************************
- ****************** 配置LCD写命令IO口**********************
- **********************************************************/
- void lcd_writecmminit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //通用接口配置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能PC引脚时钟
- GPIO_InitStructure.GPIO_Pin = WR|RD; //使能读写控制引脚
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PA引脚时钟
- GPIO_InitStructure.GPIO_Pin = RS|RST|GPIO_Pin_5|GPIO_Pin_4; //使能控制引脚
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- /**********************************************************
- ****************** 配置LCD写IO口**************************
- **********************************************************/
- void lcd_writeinit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //通用接口配置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PE引脚时钟
- GPIO_InitStructure.GPIO_Pin = D7|D6|D5|D4|D3|D2|D1|D0; //使能IO口
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- }
- /**********************************************************
- ****************** 液晶写数据函数**************************
- **********************************************************/
- void write_lcddat(uint16_t da) //sm命令还是数据,命令还是数据
- {
- lcd_writecmminit();
- lcd_writeinit();
- PS1_L(); //8080协议
- CSB_L(); //片选
- Delay_us(2); //延时20us
- RS_H(); //数据有效
- RD_H();
- WR_L(); //写控制命令
- Delay_us(1);
- GPIO_Write(GPIOE,(GPIOE->ODR&0x00ff)|(da<<8));
- da=0;
- Delay_us(1);
- WR_H();
- Delay_us(1);
- CSB_H();
- }
- /**********************************************************
- ****************** 液晶写命令函数**************************
- **********************************************************/
- void write_lcdcom(uint16_t cm)
- {
- lcd_writecmminit();
- lcd_writeinit();
- PS1_L(); //8080协议
- CSB_L(); //片选
- Delay_us(2);
- RS_L(); //命令有效
- RD_H();
- WR_L(); //写控制命令
- Delay_us(1);
- GPIO_Write(GPIOE,(GPIOE->ODR&0x00ff)|(cm<<8));
- cm=0;
- Delay_us(1); //_nop_();
- WR_H();
- Delay_us(1);
- CSB_H();
- }
- /**********************************************************
- ****************** LCD初始化函数**************************
- **********************************************************/
- void lcd_initial(void)
- {
-
- SysTick_Init();
- PS1_L();
- CSB_L(); //片选有效
- Delay_ms(30); //延时20us
- RST_L(); //初始化使能
- Delay_ms(30); //延时20us
- RST_H(); //初始化失能
- Delay_ms(200); //延时200ms
- write_lcdcom(0xac); //display off
- write_lcdcom(0xc4); //set LCD MAPPING CONTROL:MX=0,MY=1
- write_lcdcom(0x80); //disenable partial display
- write_lcdcom(0xa2); //set line rate:8.5Klps(line rate=frame*duty)
- write_lcdcom(0xeb); //set bias 1/11
- write_lcdcom(0xf1); //set com end
- write_lcdcom(127); //1/128 duty
- write_lcdcom(0x8a); //SET RAM ADDRESS CONTROL AC1[1]模式
- write_lcdcom(0xf9); //SET WINDOW PROGRAM ENABLE
- write_lcdcom(0xc8); //nline 倒置命令
- write_lcdcom(0x00); //SET Page_C Address 初始化为0
- write_lcdcom(0x81); //SET Vbias potentiometer
- write_lcdcom(65); //设置分辨率
- write_lcdcom(0x2f); //set pump control:internal VLCD 11b standard
- write_lcdcom(0x2a); //set PANEL LOADING
- write_lcdcom(0x27); //set temperature compensation -0.05%/c
- lcd_clear(); //清屏
- Delay_ms(20);
- write_lcdcom(0xad); //set Display Enable display on B/W MOwDE
-
- }
- /**********************************************************
- ***************** 清屏函数********************************
- **********************************************************/
- void lcd_clear(void)
- {
- uint16_t x,y;
- for(x=0;x<32;x++)
- {
- write_lcdcom(0x60); //set row address RA[3:0]
- write_lcdcom(0x70); //set row address RA[6:4]
- write_lcdcom(0x00+x); //set page_c address
- for(y=0;y<128;y++)
- {
- write_lcddat(0x00); //清屏
- }
- }
- }
- /**********************************************************
- ********************** 位置函数*****************************
- **********************************************************/
- void Disp_Location(uint8_t x,uint8_t y)
- {
- uint8_t yl,yh;
- yl=(y<<4)>>4;
- yh=y>>4;
- write_lcdcom(0x60|yl); //set row address RA[3:0]
- write_lcdcom(0x70|yh); //set row address RA[6:4]
- write_lcdcom(0x00+x); //set page_c address
- }
- /**********************************************************
- *****8*16**** 在特定位置显示单个英文字符函数***************
- **********************************************************/
- void DispChar_EN(uint8_t x,uint8_t y,unsigned char cEChar) //cEChar当前英文字符.x,y起始显示位置
- {
- uint8_t ii,jj; //定义字符个数,位个数,字符长度
- uint8_t ucRelativePostion; //定义字模相对位置函数
- uint8_t temp;
- uint8_t cytemp1,cytemp2;
- uint8_t mm,newtemp1,newtemp2;
- ucRelativePostion=cEChar-' '; //去掉空字符
- /***********************************第一列****************************************************************/
- Disp_Location(x,y);
- for(ii=0;ii<16;ii++)
- {
- newtemp1=0;
- temp=ucAscii_1608[ucRelativePostion][ii];
- cytemp1=(temp<<4)>>4; //取低四位转八位
- for(jj=0;jj<4;jj++)
- {
- if((cytemp1>>jj)&0x01)
- mm=0x03;
- else
- mm=0x00;
- newtemp1|=mm<<(2*jj);
- }
- write_lcddat(newtemp1);
- }
- /************************************第二列****************************************************************/
- Disp_Location(x+1,y);
- for(ii=0;ii<16;ii++)
- {
- newtemp2=0;
- temp=ucAscii_1608[ucRelativePostion][ii];
- cytemp2=temp>>4; //取高四位转八位
- for(jj=0;jj<4;jj++)
- {
- if((cytemp2>>jj)&0x01)
- mm=0x03;
- else
- mm=0x00;
- newtemp2|=mm<<(2*jj);
- }
- write_lcddat(newtemp2);
- }
- }
- /**********************************************************
- ***8*16*********在指定位置显示英文字符串函数**************
- **********************************************************/
- void DispString_EN(uint8_t x,uint8_t y,unsigned char *ptr)
- {
- while(*ptr!='\0')
- {
- if(x>30) //8*16字体 检测字符长度
- {
- x=0;
- y=y+16;
- }
- if(y>127) //8*16字体 检测字符宽度
- {
- x=0;
- y=0;
- }
- DispChar_EN(x,y,*ptr);
- x+=2; //8*16字体 字符串依次右移
- ptr++;
- }
- }
- /****************************************************************
- ***16*16*********在指定位置显示中文字符函数********************* //先弄个16*16的实验,参数size先不定义
- ***************************************************************/
- void DispChar_CH(uint8_t x,uint8_t y, unsigned char font[2]) //cZChar当前英文字符.x,y起始显示位置
- {
- uint8_t nn;
- uint8_t ii,jj; //nn字模字库中字个数,kk字模0xXX,aa,bb转换扩充位数个数
- uint8_t temp1,temp2,cztemp1,cztemp2,cztemp3,cztemp4;
- uint8_t mm,newtemp1,newtemp2,newtemp3,newtemp4;
- for(nn=0;nn<sizeof(Font16lib)/sizeof(Font16lib[0]);nn++) { //遍历字模库,查找汉字
- if( (font[0]==Font16lib[nn].Index[0])&&font[1]==Font16lib[nn].Index[1])
- {
- /***********************************第一列****************************************************************/
- Disp_Location(x,y); //扩展后第一列位置
- for(ii=0;ii<16;ii++)
- {
- newtemp1=0;
- temp2=Font16lib[nn].Msk[ii];
- cztemp1=(temp2<<4)>>4; //第一列低四位
- for(jj=0;jj<4;jj++)
- {
- if((cztemp1>>jj)&0x01) //从高到低取数位
- mm=0x03;
- else
- mm=0x00;
- newtemp1|=mm<<(2*jj); //第一列四位扩展到八位
- }
- write_lcddat(newtemp1);
- }
- /***********************************第二列****************************************************************/
- Disp_Location(x+1,y); //扩展后第二列位置
- for(ii=0;ii<16;ii++)
- {
- newtemp2=0;
- temp2=Font16lib[nn].Msk[ii];
- cztemp2=temp2>>4; //第一列高四位
- for(jj=0;jj<4;jj++)
- {
- if((cztemp2>>jj)&0x01) //从高到低取数位
- mm=0x03;
- else
- mm=0x00;
- newtemp2|=mm<<(2*jj); //第二列四位扩展到八位
- }
- write_lcddat(newtemp2);
- }
- /***********************************第三列****************************************************************/
- Disp_Location(x+2,y); //扩展后第三列位置
- for(ii=0;ii<16;ii++)
- {
- newtemp3=0;
- temp1=Font16lib[nn].Msk[ii+16];
- cztemp3=(temp1<<4)>>4;
- for(jj=0;jj<4;jj++)
- {
- if((cztemp3>>jj)&0x01) //从高到低取数位
- mm=0x03;
- else
- mm=0x00;
- newtemp3|=mm<<(2*jj); //第三列四位扩展到八位
- }
-
- write_lcddat(newtemp3);
- }
- /***********************************第四列****************************************************************/
- Disp_Location(x+3,y); //扩展后第四列位置
- for(ii=0;ii<16;ii++)
- {
- newtemp4=0;
- temp1=Font16lib[nn].Msk[ii+16];
- cztemp4=temp1>>4; //第二列高四位
-
- for(jj=0;jj<4;jj++)
- {
- if((cztemp4>>jj)&0x01) //从高到低取数位
- mm=0x03;
- else
- mm=0x00;
- newtemp4|=mm<<(2*jj); //第四列四位扩展到八位
- }
- write_lcddat(newtemp4);
- }
- }
- }
- }
- /**********************************************************
- ***16*16************ 显示中文英文数字字符串函数***********
- **********************************************************/
- void DispString_CH(uint8_t x,uint8_t y,unsigned char *pztr)
- {
- uint8_t hz=0;
- while(*pztr!='\0')
- {
- if(*pztr<127) //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
- {
- hz=0; //显示英文
- if(x>30) //8*16字体 检测字符长度
- {
- x=0;
- y=y+16;
- }
- if(y>127) //8*16字体 检测字符宽度
- {
- x=0;
- y=0;
- }
- DispChar_EN(x,y,*pztr);
- x+=2; //8*16字体 字符串依次右移
- pztr++;
- }
- else{
- hz=1; //汉字标识
- if(x>27) //16*16字体 检测字符长度
- {
- x=0;
- y=y+16;
- }
- if(y>127) //16*16字体 检测字符宽度
- {
- x=0;
- y=0;
- }
- DispChar_CH(x,y,pztr);
- x+=4; //16*16字体 字符串依次右移
- pztr+=2;
- }
- }
- }
- /**********************************************************
- ****************** 点亮一横线函数*************************
- **********************************************************/
- void Disp_Line(uint8_t sx,uint8_t sy,uint8_t ex,uint8_t ey) //sx起始Page_C,ex结束Page_C,sy起始行,ey结束行
- {
- uint8_t ii,jj;
- for(ii=sx;ii<(ex+1);ii++)
- {
- for(jj=sy;jj<(ey+1);jj++)
- {
- Disp_Location(ii,jj);
- write_lcddat(0xff);
- }
- }
- }
- /**********************************************************
- ****************** 点灭一横线函数*************************
- **********************************************************/
- void Disp_Linem(uint8_t sx,uint8_t sy,uint8_t ex,uint8_t ey) //sx起始Page_C,ex结束Page_C,sy起始行,ey结束行
- {
- uint8_t ii,jj;
- for(ii=sx;ii<(ex+1);ii++)
- {
- for(jj=sy;jj<(ey+1);jj++)
- {
- Disp_Location(ii,jj);
- write_lcddat(0x00);
- }
- }
- }
- /**********************************************************
- ****************** 全像素函数*****************************
- **********************************************************/
- void ALL_PixOn(void)
- {
- write_lcdcom(0xa5); //像素点全亮
- }
- /**********************************************************
- ****************** 全部点亮********************************
- **********************************************************/
- void display_all(void)
- {
-
- unsigned char kk,jj;
-
- for(kk=0;kk<com/4;kk++)
- {
- write_lcdcom(0x60); //set row address RA[3:0]
- write_lcdcom(0x70); //set row address RA[6:4]
- write_lcdcom(0x00+kk); //set page_c address
- for(jj=0;jj<128;jj++)
- {
- write_lcddat(0xff);
- }
- }
- }
- /**********************************************************
- ****************** 空指令函数*****************************
- **********************************************************/
- void _nop(void)
- {
- write_lcdcom(0xe3); //空指令
- }
- /**********************************************************
- ****************** 系统软重启函数*************************
- **********************************************************/
- void Sys_Reset(void)
- {
- write_lcdcom(0xe2);
- }
- /**********************************************************
- ****************** 光标函数*******************************
- **********************************************************/
- void Disp_Grid(uint8_t x,uint8_t y)
- {
- while(1){
- //Disp_Line(x,y,x,y+16);
- DispChar_EN(x,y,'I');
- Delay_s(1);
- DispChar_EN(x,y,' ');
- //Disp_Linem(x,y,x,y+16);
- Delay_s(1);
- }
-
- }
- /**********************************************************
- ****************** 结束行指令******************************
- **********************************************************
- void End_Com(uint8_t y)
- {
- write_lcdcom(0xf1); //32位命令
- write_lcdcom(0x00+y); //具体设置
- }
- /**********************************************************
- ****************** 软重启函数*****************************
- **********************************************************
- void Soft_Reset(void)
- {
- WR_H();
- RST_L();
- Delay_us(1);
- RST_H();
- Delay_ms(10);
- WR_L();
- }
-
- /***********************************end of file*****************************************************/
-
复制代码
|
评分
-
查看全部评分
|