51單片機驅動的不帶字庫的lcd12864液晶屏顯示及其proteus仿真圖如下:
單片機驅動12864液晶的頭文件LCD12864.H源程序如下(附件里面有調用方法 很簡單):
- //===========LCD12864.H===============
- #ifndef _LCD12864_H__
- #define _LCD12864_H__
- /*********************************************************************************************/
- #include <reg52.h> // 包含頭文件
- #include <string.h> //用于指針
- typedef unsigned char uchar ;
- typedef unsigned int uint ;
- /*********************************************************************************************
- //接口定義
- //
- /*********************************************************************************************/
- #define LCD12864_DATABUS P1 // 定義LCD12864的數據總線
- sbit LCD12864_RS = P2^6; // 定義LCD12864的RS控制線
- sbit LCD12864_RW = P2^7; // 定義LCD12864的RW控制線
- sbit LCD12864_E = P3^0; // 定義LCD12864的E控制線
- sbit LCD12864_CS1 = P3^1; // 定義LCD12864的CS1控制線
- sbit LCD12864_CS2 = P3^2; // 定義LCD12864的CS2控制線
- //sbit LCD12864_RESET = P2 ^ 5; // 定義LCD12864的RESET控制線
- //sbit LCD12864_LEDK = P2 ^ 0; // 定義LCD12864的LEDK(BLK)控制線
- /*********************************************************************************************
- //數據定義
- //定義LCD12864的命令字
- /*********************************************************************************************/
- #define LCD12864_DISP_ON 0x3F // 打開LCD12864顯示
- #define LCD12864_DISP_OFF 0x3E // 關閉LCD12864顯示
- #define LCD12864_START_ROW 0xC0 // 顯示起始行,可以用LCD12864_START_ROW+x設置起始行。(x<64)
- #define LCD12864_PAGE_ADDR 0xB8 // 頁起始地址,可以用LCD12864_PAGE_ADDR+x設置當前頁。(x<8)
- #define LCD12864_COL_ADDR 0x40 // 列起始地址,可以用LCD12864_COL_ADDR+x設置當前列。(x<64)
- //在BUSY和REST狀態時,除讀狀態指令外,其他指令均不對LCD12864產生作用。
- //在對LCD12864操作之前要查詢BUSY狀態,以確定是否可以對LCD12864進行操作。
- #define LCD12864_STATUS_BUSY 0x80 // LCD12864忙狀態屏蔽碼
- #define LCD12864_STATUS_DISP_OFF 0x20 // LCD12864顯示關閉狀態屏蔽碼
- #define LCD12864_STATUS_REST 0x10 // LCD12864復位狀態屏蔽碼
- void LCD12864_WriteCMD(uchar LCD_com);
- void LCD12864_WriteData(unsigned char LCD12864_data);
- void Delay(unsigned int count);
- /*********************************************************************************************
- //字符/圖像定義庫
- /*********************************************************************************************/
- /*-- 文字: 歡 --*/
- /*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
- //0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0x55,0xaa,0xaa,0x55,0x55,0xaa,0xaa,
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
- //0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x1F,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,
- //0x00,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
- /* 縱向取模,字節倒序 */
- unsigned char code zheng[]={
- 0x00,0x80,0xA0,0xA4,0xA8,0xF0,0x54,0x52,0x00,0xF0,0x08,0x68,0x98,0x08,0x00,0x00,
- 0x00,0x00,0x10,0x08,0x06,0x01,0x02,0x04,0x00,0x7F,0x00,0x02,0x04,0x07,0x00,0x00,
- };
- unsigned char code zhou[]={
- 0x00,0x00,0xE0,0x00,0xFC,0x00,0xE0,0x00,0xFC,0x20,0xC0,0x00,0xFE,0x00,0x00,0x00,
- 0x00,0x21,0x10,0x0C,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,
- };
- unsigned char code jin[]={
- 0x00,0x80,0x40,0x20,0x90,0x8C,0xC3,0x44,0x48,0x10,0x20,0x60,0x40,0x40,0x40,0x00,
- 0x01,0x00,0x20,0x24,0x2A,0x22,0x3F,0x11,0x19,0x15,0x10,0x10,0x00,0x00,0x00,0x00,
- };
- unsigned char code te[]={
- 0x80,0x60,0x58,0x20,0xFE,0xA0,0x40,0x50,0x50,0x7F,0xE8,0xA8,0xA0,0xA0,0x20,0x00,
- 0x04,0x04,0x02,0x01,0x3F,0x00,0x01,0x05,0x09,0x21,0x7F,0x00,0x00,0x00,0x00,0x00,
- };
- unsigned char code lai[]={
- 0x00,0x08,0x08,0x48,0xAE,0x24,0xF4,0x14,0x9C,0x57,0x04,0x04,0x04,0x00,0x00,0x00,
- 0x00,0x20,0x22,0x12,0x0A,0x05,0x7F,0x03,0x05,0x09,0x19,0x11,0x10,0x10,0x00,0x00,
- };
- unsigned char code dian[]={
- 0x00,0x00,0xF0,0x10,0x90,0x90,0xFF,0x48,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x03,0x02,0x02,0x1F,0x21,0x21,0x21,0x20,0x20,0x20,0x1C,0x00,0x00,
- };
- unsigned char code zi[]={
- 0x00,0x40,0x40,0x40,0x44,0x44,0x44,0x72,0xCA,0x26,0x22,0x20,0x20,0x20,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- unsigned char code you[]={
- 0x00,0x08,0x08,0x88,0x48,0xF8,0x4C,0x4B,0x28,0x24,0xE4,0x04,0x04,0x04,0x00,0x00,
- 0x04,0x02,0x01,0x00,0x00,0x7F,0x05,0x05,0x25,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
- };
- unsigned char code xian[]={
- 0x00,0xF8,0x04,0xB4,0xCC,0x00,0xFC,0xD4,0x54,0x42,0x3E,0x80,0x00,0x00,0x00,0x00,
- 0x00,0x3F,0x00,0x00,0x00,0x00,0x3F,0x10,0x09,0x02,0x05,0x0C,0x08,0x08,0x08,0x00,
- };
- unsigned char code gong[]={
- 0x00,0x00,0x80,0x60,0x18,0x00,0x82,0x02,0x0C,0x10,0x20,0x40,0xC0,0x80,0x80,0x00,
- 0x02,0x01,0x00,0x18,0x14,0x12,0x11,0x08,0x0A,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,
- };
- unsigned char code si[]={
- 0x00,0x00,0x80,0xA0,0xA4,0x94,0x54,0xD2,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x03,0x04,0x04,0x04,0x02,0x03,0x00,0x10,0x20,0x1F,0x00,0x00,0x00,0x00,
- };
- /********************************************************************************************
- //軟件延時 Delay()
- *********************************************************************************************/
- void Delay(unsigned int count)
- {
- unsigned char i;
- while(--count != 0)
- {
- for(i = 0; i < 125; i++); // ";" 表示空語句,CPU空轉。
- } // i 從0加到125,在12M晶體下CPU大概耗時1毫秒
- }
- /*********************************************************************************************
- //LCD12864測忙函數 LCD12864_TestBusy()
- **********************************************************************************************/
- //void LCD12864_TestBusy(void)
- //{
- // LCD12864_RW = 1;
- // LCD12864_RS = 0;
- // LCD12864_E = 0; //???????????????
- // //Delay(1);
- // LCD12864_E = 1;
- // while(LCD12864_DATABUS & LCD12864_STATUS_BUSY);
- //}
- /*********************************************************************************************
- //寫指令到LCD12864 LCD12864_WriteCMD()
- **********************************************************************************************/
- void LCD12864_WriteCMD(uchar LCD_com)
- {
- //LCD12864_TestBusy();
- LCD12864_RW = 0;
- LCD12864_RS = 0;
- LCD12864_DATABUS = LCD_com;
- LCD12864_E = 0;
- LCD12864_E = 1;
- //Delay(1);
- LCD12864_E = 0;
- //LCD12864_TestBusy();
- }
- /*********************************************************************************************
- //寫數據到LCD12864 LCD12864_WriteData()
- **********************************************************************************************/
- void LCD12864_WriteData(unsigned char LCD12864_data)
- {
- LCD12864_RW = 0;
- LCD12864_RS = 1;
- LCD12864_DATABUS = LCD12864_data;
- LCD12864_E = 0;
- LCD12864_E = 1;
- //Delay(1);
- LCD12864_E = 0;
- //LCD12864_TestBusy();
- }
- /********************************************************************************************
- //從LCD12864讀數據 LCD12864_ReadData()
- *********************************************************************************************/
- //unsigned char LCD12864_ReadData(void)
- //{
- // unsigned char LCD12864_data;
- // LCD12864_E = 0;
- // LCD12864_RW = 1; LCD12864_RS = 1;
- // LCD12864_E = 1;
- // LCD12864_data = LCD12864_DATABUS; //送入8位數據
- // LCD12864_TestBusy(); //讀LCM忙
- // return LCD12864_data;
- //}
- /********************************************************************************************
- //向LCD12864指定點寫一字節數據 LCD12864_Write1Byte_X_Y()
- //x(0-127) y(0-63)為坐標值 LCD12864_data 為所要寫的數據
- /********************************************************************************************/
- //void LCD12864_Write1Byte_X_Y( uchar x,uchar y,uchar LCD12864_data)
- //{
- // x = x&0x7f;
- // y = y&0x3f; //參數過濾
- // LCD12864_CS1 = 1;
- // LCD12864_CS2 = 1; //不選中左半屏及右半屏
- // if(x<64)
- // {
- // LCD12864_CS1 = 0; // 選中左半屏
- // }
- // else
- // {
- // LCD12864_CS2 = 0; // 選中右半屏
- // x = x-64;
- // }
- // LCD12864_WriteCMD(LCD12864_COL_ADDR+x); // 設置當前列地址,即x坐標
- // LCD12864_WriteCMD(LCD12864_PAGE_ADDR+y); // 設置當前頁地址,即y坐標
- // LCD12864_WriteData(LCD12864_data); // 向LCD12864寫數據
- //}
- /********************************************************************************************
- //從LCD12864指定點讀取一字數據 LCD12864_Read1Byte_X_Y()
- /********************************************************************************************/
- //unsigned char LCD12864_Read1Byte_X_Y( uchar x,uchar y)
- //{
- // uchar LCD12864_data;
- // x = x&0x7f;
- // y = y&0x3f; //參數過濾
- // LCD12864_CS1 = 1; LCD12864_CS2 = 1; //不選中左半屏及右半屏
- // if(x<64)
- // { // 判斷選擇左、右半屏
- // LCD12864_CS1 = 0; // 選中左半屏
- // }
- // else
- // {
- // LCD12864_CS2 = 0; // 選中右半屏
- // x = x-64;
- // }
- // LCD12864_WriteCMD(LCD12864_COL_ADDR+x); // 設置當前列地址,即x坐標
- // LCD12864_WriteCMD(LCD12864_PAGE_ADDR+y); // 設置當前頁地址,即y坐標
- // LCD12864_data = LCD12864_ReadData(); // 向LCD12864寫數據
- // return LCD12864_data;
- //}
- /********************************************************************************************
- //向LCD12864填充數據 LCD12864_Fill_Screen()
- //設置涮屏速度(為1不涮屏,默認為60) //欲寫入的數據
- *********************************************************************************************/
- void LCD12864_Fill_Screen( uchar refresh_rate,uchar LCD_Data)
- {
- unsigned char x,y;
- LCD12864_CS1 = 0; // 選中左半屏
- LCD12864_CS2 = 0; // 選中右半屏
- LCD12864_WriteCMD(LCD12864_START_ROW+0); // 顯示起始行設置為0
- for(x=0;x<8;x++)
- {
- Delay(refresh_rate); // 刷屏速度延時
- LCD12864_WriteCMD(LCD12864_PAGE_ADDR+x); // 設置頁地址
- LCD12864_WriteCMD(LCD12864_COL_ADDR); // 設置列地址
- for(y=0;y<128;y++) //64
- {LCD12864_WriteData( LCD_Data );}
- }
- LCD12864_CS1 = 1; // 不選中左半屏
- LCD12864_CS2 = 1; // 不選中右半屏
- }
- /********************************************************************************************
- //LCD12864清屏 LCD12864_Clear_Screen()
- *********************************************************************************************/
- void LCD12864_Clear_Screen(void)
- {
- LCD12864_Fill_Screen(20,0x00); //寫入0到每個顯示區
- }
- /********************************************************************************************
- //LCD12864黑屏 LCD12864_Clear_black()
- *********************************************************************************************/
- //void LCD12864_Clear_black(void)
- //{
- // LCD12864_Fill_Screen(60,0xff); //可寫入其它數值以填滿LCD屏
- //}
- /********************************************************************************************
- //顯示128*64圖片 LCD12864_Disp_Bitmap_12864()
- *********************************************************************************************/
- //void LCD12864_Disp_Bitmap_12864( uchar t,uchar code *bitmap_12864)
- //{ //128*64點陣圖像所在數組表
- //unsigned char j,k;
- //for(k=0;k<8;k++)
- // { //設置8頁的顯示
- // Delay(t);
- // LCD12864_CS1 = 0;
- // LCD12864_CS2 = 1; //半屏選中
- // LCD12864_WriteCMD(LCD12864_PAGE_ADDR+k); //選中頁
- // LCD12864_WriteCMD(LCD12864_COL_ADDR+0); //選中列
- // for(j=0;j<64;j++) //64
- // {
- // LCD12864_WriteData(bitmap_12864[k*128+j]); //開始寫入數據
- // }
- // LCD12864_CS1 = 0;
- // LCD12864_CS2 = 0;
- // LCD12864_WriteCMD(LCD12864_PAGE_ADDR+k);
- // LCD12864_WriteCMD(LCD12864_COL_ADDR+0);
- // for(j=64;j<128;j++)
- // {
- // LCD12864_WriteData(bitmap_12864[k*128+j]);
- // }
- // }
- //}
- /********************************************************************************************
- //在LCD12864的指定點顯示16*16點陣漢字 LCD12864_Disp_Chinese_16_16()
- //設置書寫速度(為1直接顯示,默認為12)//輸入8:8*16字符,16:16*16字符
- //LCD12864的頁地址(0~7)//LCD12864的列地址(0~128)注意:右半屏起始是64 huan
- *********************************************************************************************/
- void LCD12864_Disp16(uchar b,uchar LCD12864_page,uchar LCD12864_col,uchar code *Chardata)
- { //16*16點陣漢字字模(縱向取模,字節倒序)
- unsigned char j=0,i=0;
- if(LCD12864_col < 64 )
- {
- LCD12864_CS1 = 0;
- LCD12864_CS2 = 1; //判斷屏幕使能
- }
- else
- {
- LCD12864_CS1 = 1;
- LCD12864_CS2 = 0;
- LCD12864_col = LCD12864_col - 64;
- }
- for(j=0;j<2;j++)
- {
- LCD12864_WriteCMD(LCD12864_PAGE_ADDR+LCD12864_page+j);
- LCD12864_WriteCMD(LCD12864_COL_ADDR+LCD12864_col);
- for(i=0;i<b;i++)
- {
- LCD12864_WriteData(Chardata[b*j+i]);
- Delay(10);
- }
- }
- }
- /********************************************************************************************
- //LCD12864初始化 LCD12864_Init()
- //
- *********************************************************************************************/
- void LCD12864_Init(void)
- {
- //LCD12864_RESET = 0; //復位
- //Delay(300);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
LCD12864源碼及proteus仿真.rar
(88.01 KB, 下載次數: 134)
2018-4-12 10:23 上傳
點擊文件名下載附件
|