本人在使用LCD12864時,用到了JLX12864G-086-pc 也就是帶字庫的LCD12864屏,采用SPI串口方式,根據廠家提供的標準例程,進行了修改,做成了一個可被調用的獨立模塊,并可對顯示的文字進行反白顯示,并提供了相應的頭文件。
單片機源程序如下:
- //液晶屏型號:JLX12864G-086-PC-3S
- //接口:串行
- //中文字庫:帶中文字庫IC:JLX-GB2312,豎置橫排
- #include "JLX1286486PC.h"
- //延時
- void lcddelay(int n_ms)
- {
- int j,k;
- for(j=0;j<n_ms;j++)
- for(k=0;k<110;k++);
- }
- //短延時
- void lcddelay_us(int n_us)
- {
- int j,k;
- for(j=0;j<n_us;j++)
- for(k=0;k<1;k++);
- }
- //寫指令到LCD模塊
- void transfer_command_lcd(int data1)
- {
- char i;
- lcd_cs1=0;
- lcd_rs=0;
- for(i=0;i<8;i++)
- {
- lcd_sclk=0;
- lcddelay_us(10); //加少量延時
- if(data1&0x80) lcd_sid=1;
- else lcd_sid=0;
- lcd_sclk=1;
- lcddelay_us(10); //加少量延時
- data1=data1<<=1;
- }
- lcd_cs1=1;
- }
- //寫數據到LCD模塊
- void transfer_data_lcd(int data1)
- {
- char i;
- lcd_cs1=0;
- lcd_rs=1;
- for(i=0;i<8;i++)
- {
- lcd_sclk=0;
- if(data1&0x80) lcd_sid=1;
- else lcd_sid=0;
- lcd_sclk=1;
- data1=data1<<=1;
- }
- lcd_cs1=1;
- }
- //LCD模塊初始化
- void initial_lcd()
- {
- lcd_reset=0; //低電平復位
- lcddelay(100);
- lcd_reset=1; //復位完畢
- lcddelay(100);
- transfer_command_lcd(0xe2); //軟復位
- lcddelay(50);
- transfer_command_lcd(0x2c); //升壓步聚1
- lcddelay(50);
- transfer_command_lcd(0x2e); //升壓步聚2
- lcddelay(50);
- transfer_command_lcd(0x2f); //升壓步聚3
- lcddelay(50);
- transfer_command_lcd(0x23); //粗調對比度,可設置范圍0x20~0x27
- transfer_command_lcd(0x81); //微調對比度
- transfer_command_lcd(0x28); //微調對比度的值,可設置范圍0x00~0x3f
- transfer_command_lcd(0xa2); //1/9偏壓比(bias)
- transfer_command_lcd(0xc8); //行掃描順序:從上到下
- transfer_command_lcd(0xa0); //列掃描順序:從左到右
- transfer_command_lcd(0x40); //起始行:第一行開始
- transfer_command_lcd(0xaf); //開顯示
- lcddelay(50);
- }
- void lcd_address(uint page,uint column)
- {
- column=column-0x01;
- transfer_command_lcd(0xb0+page-1); //設置頁地址,每8行為一頁,全屏共64行,被分成8頁
- transfer_command_lcd(0x10+(column>>4&0x0f)); //設置列地址的高4位
- transfer_command_lcd(column&0x0f); //設置列地址的低4位
- }
- //全屏清屏
- void clear_screen()
- {
- unsigned char i,j;
-
- for(i=0;i<9;i++)
- {
- transfer_command_lcd(0xb0+i);
- transfer_command_lcd(0x10);
- transfer_command_lcd(0x00);
- for(j=0;j<132;j++)
- {
- transfer_data_lcd(0x00);
- }
- }
- }
- //顯示128x64點陣圖像
- void display_128x64(uchar *dp)
- {
- uint i,j;
-
- for(j=0;j<8;j++)
- {
- lcd_address(j+1,1);
- for (i=0;i<128;i++)
- {
- transfer_data_lcd(*dp); //寫數據到LCD,每寫完一個8位的數據后列地址自動加1
- dp++;
- }
- }
- }
- //顯示16x16點陣圖像、漢字、生僻字或16x16點陣的其他圖標
- void display_graphic_16x16(uchar page,uchar column,uchar *dp)
- {
- uint i,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<16;i++)
- {
- transfer_data_lcd(*dp); //寫數據到LCD,每寫完一個8位的數據后列地址自動加1
- dp++;
- }
- }
- }
- //顯示8x16點陣圖像、ASCII, 或8x16點陣的自造字符、其他圖標
- void display_graphic_8x16(uchar page,uchar column,uchar *dp)
- {
- uint i,j;
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for (i=0;i<8;i++)
- {
- transfer_data_lcd(*dp); //寫數據到LCD,每寫完一個8位的數據后列地址自動加1
- dp++;
- }
- }
- }
- //顯示5X8點陣圖像、ASCII, 或5x8點陣的自造字符、其他圖標
- void display_graphic_5x8(uchar page,uchar column,uchar *dp)
- {
- uint i;
- lcd_address(page,column);
- for (i=0;i<6;i++)
- {
- transfer_data_lcd(*dp);
- dp++;
- }
-
- }
- //送指令到晶聯訊字庫IC
- void send_command_to_ROM( uchar datu )
- {
- uchar i;
- for(i=0;i<8;i++ )
- {
- Rom_SCK=0;
- lcddelay_us(10);
- if(datu&0x80)Rom_IN = 1;
- else Rom_IN = 0;
- datu = datu<<1;
- lcddelay_us(10); //加一個延時
- Rom_SCK=1;
- lcddelay_us(10);
- }
- }
- //從晶聯訊字庫IC中取漢字或字符數據(1個字節)
- static uchar get_data_from_ROM( )
- {
- uchar i;
- uchar ret_data=0;
- for(i=0;i<8;i++)
- {
- Rom_OUT=1;
- Rom_SCK=0;
- lcddelay_us(10);
- ret_data=ret_data<<1;
- if( Rom_OUT )
- ret_data=ret_data+1;
- else
- ret_data=ret_data+0;
- Rom_SCK=1;
- lcddelay_us(10);
- }
- return(ret_data);
- }
- //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
- void get_and_write_16x16(ulong fontaddr,uchar page,uchar column,uchar fb)
- {
- uchar i,j,disp_data;
- Rom_CS = 0;
- send_command_to_ROM(0x03);
- send_command_to_ROM((fontaddr&0xff0000)>>16); //地址的高8位,共24位
- send_command_to_ROM((fontaddr&0xff00)>>8); //地址的中8位,共24位
- send_command_to_ROM(fontaddr&0xff); //地址的低8位,共24位
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for(i=0; i<16; i++ )
- {
- disp_data=get_data_from_ROM();
- lcddelay_us(4); //加了一個延時
- if(fb==1)
- transfer_data_lcd(~disp_data); //寫數據到LCD,每寫完1字節的數據后列地址自動加1 反白,對數據取反
- else
- transfer_data_lcd(disp_data); // 寫數據到LCD,每寫完1字節的數據后列地址自動加1
- }
- }
- Rom_CS=1;
- }
- //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
- void get_and_write_8x16(ulong fontaddr,uchar page,uchar column,uchar fb)
- {
- uchar i,j,disp_data;
- Rom_CS = 0;
- send_command_to_ROM(0x03);
- send_command_to_ROM((fontaddr&0xff0000)>>16); //地址的高8位,共24位
- send_command_to_ROM((fontaddr&0xff00)>>8); //地址的中8位,共24位
- send_command_to_ROM(fontaddr&0xff); //地址的低8位,共24位
- for(j=0;j<2;j++)
- {
- lcd_address(page+j,column);
- for(i=0; i<8; i++ )
- {
- disp_data=get_data_from_ROM();
- lcddelay_us(4); //加了一個延時
- if(fb==1)
- transfer_data_lcd(~disp_data); //寫數據到LCD,每寫完1字節的數據后列地址自動加1
- else
- transfer_data_lcd(disp_data); //寫數據到LCD,每寫完1字節的數據后列地址自動加1
- }
- }
- Rom_CS=1;
- }
- //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
- void get_and_write_5x8(ulong fontaddr,uchar page,uchar column,uchar fb)
- {
- uchar i,disp_data;
- Rom_CS = 0;
- send_command_to_ROM(0x03);
- send_command_to_ROM((fontaddr&0xff0000)>>16); //地址的高8位,共24位
- send_command_to_ROM((fontaddr&0xff00)>>8); //地址的中8位,共24位
- send_command_to_ROM(fontaddr&0xff); //地址的低8位,共24位
- lcd_address(page,column);
- for(i=0; i<5; i++ )
- {
- disp_data=get_data_from_ROM();
- lcddelay_us(4); //加了一個延時
- if(fb==1)
- transfer_data_lcd(~disp_data); //寫數據到LCD,每寫完1字節的數據后列地址自動加1
- else
- transfer_data_lcd(disp_data); //寫數據到LCD,每寫完1字節的數據后列地址自動加1
- }
- if(fb==1)
- {disp_data=0xff;
- transfer_data_lcd(disp_data); //寫數據到LCD,每寫完1字節的數據后列地址自動加1
- }
- Rom_CS=1;
- }
- //****************************************************************
- ulong fontaddr=0;
- void display_GB2312_string(uchar page,uchar column,uchar *text,uchar fb)
- {
- uchar i= 0;
- while((text[i]>0x00))
- {
- if(((text[i]>=0xb0) &&(text[i]<=0xf7))&&(text[i+1]>=0xa1))
- {
- //國標簡體(GB2312)漢字在晶聯訊字庫IC中的地址由以下公式來計算:
- //Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+ 846)*32+ BaseAdd;BaseAdd=0
- //由于擔心8位單片機有乘法溢出問題,所以分三部取地址
- fontaddr = (text[i]- 0xb0)*94;
- fontaddr += (text[i+1]-0xa1)+846;
- fontaddr = (ulong)(fontaddr*32);
- get_and_write_16x16(fontaddr,page,column,fb); //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
- i+=2;
- column+=16;
- }
- else if(((text[i]>=0xa1) &&(text[i]<=0xa3))&&(text[i+1]>=0xa1))
- {
- //國標簡體(GB2312)15x16點的字符在晶聯訊字庫IC中的地址由以下公式來計算:
- //Address = ((MSB - 0xa1) * 94 + (LSB - 0xA1))*32+ BaseAdd;BaseAdd=0
- //由于擔心8位單片機有乘法溢出問題,所以分三部取地址
- fontaddr = (text[i]- 0xa1)*94;
- fontaddr += (text[i+1]-0xa1);
- fontaddr = (ulong)(fontaddr*32);
-
- get_and_write_16x16(fontaddr,page,column,fb); //從指定地址讀出數據寫到液晶屏指定(page,column)座標中
- i+=2;
- column+=16;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
lcd12864.rar
(3.63 KB, 下載次數: 39)
2020-8-18 17:40 上傳
點擊文件名下載附件
|