|
網上這個液晶驅動基本沒有,寫了幾天,實測基本功能都能實現,供大家參考
0.png (59.85 KB, 下載次數: 82)
下載附件
2017-1-2 02:00 上傳
下載:
128128驅動.zip
(6.67 KB, 下載次數: 106)
2016-12-23 10:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
部分程序預覽:
- /************* 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*****************************************************/
-
復制代碼
|
評分
-
查看全部評分
|