#include<stdio.h> #include<intrins.h> #include <reg52.h> #include <math.h> #include <absacc.h> #include <string.h> #include "Test.h" /* 地址定義 */ #define d_c_add XBYTE[0x00] //數(shù)據(jù)口 命令口 /* 常數(shù)定義 */ #define uchar unsigned char #define uint unsigned int /* T6963C 命令定義 */ #define LCD_CUR_POS 0x21 /* 光標(biāo)位置設(shè)置(只有設(shè)置到有效顯示地址并打開顯示時(shí)才看到) */ #define LCD_CGR_POS 0x22 /* CGRAM偏置地址設(shè)置(可以增加自已的符號(hào)) */ #define LCD_ADR_POS 0x24 /* 地址指針位置(設(shè)置讀寫操作指針) */ #define LCD_TXT_STP 0x40 /* 文本區(qū)首址(從此地址開始向屏幕左上角顯示字符) */ #define LCD_TXT_WID 0x41 /* 文本區(qū)寬度(設(shè)置顯示寬度,N/6或N/8,其中N為x軸的點(diǎn)數(shù)) */ #define LCD_GRH_STP 0x42 /* 圖形區(qū)首址(從此地址開始向屏幕左上角顯示點(diǎn)) */ #define LCD_GRH_WID 0x43 /* 圖形區(qū)寬度(設(shè)置顯示寬度,N/6或N/8,其中N為x軸的點(diǎn)數(shù)) */ #define LCD_MOD_OR 0x80 /* 顯示方式:邏輯或 */ #define LCD_MOD_XOR 0x81 /* 顯示方式:邏輯異或 */ #define LCD_MOD_AND 0x82 /* 顯示方式:邏輯與 */ #define LCD_MOD_TCH 0x83 /* 顯示方式:文本特征 */ #define LCD_DIS_SW 0x90 /* 顯示開關(guān):D0=1/0,光標(biāo)閃爍啟用/禁用 */ / * D1=1/0,光標(biāo)顯示啟用/禁用 */ /* D2=1/0,文本顯示啟用/禁用(打開后再使用) */ /* D3=1/0,圖形顯示啟用/禁用(打開后再使用) */ #define LCD_CUR_SHP 0xA0 /* 光標(biāo)形狀選擇:0xA0-0xA7表示光標(biāo)占的行數(shù) */ #define LCD_AUT_WR 0xB0 /* 自動(dòng)寫設(shè)置 */ #define LCD_AUT_RD 0xB1 /* 自動(dòng)讀設(shè)置 */ #define LCD_AUT_OVR 0xB2 /* 自動(dòng)讀/寫結(jié)束 */ #define LCD_INC_WR 0xC0 /* 數(shù)據(jù)一次寫,地址加1 */ #define LCD_INC_RD 0xC1 /* 數(shù)據(jù)一次讀,地址加1 */ #define LCD_DEC_WR 0xC2 /* 數(shù)據(jù)一次寫,地址減1 */ #define LCD_DEC_RD 0xC3 /* 數(shù)據(jù)一次讀,地址減1 */ #define LCD_NOC_WR 0xC4 /* 數(shù)據(jù)一次寫,地址不變 */ #define LCD_NOC_RD 0xC5 /* 數(shù)據(jù)一次讀,地址不變 */ #define LCD_SCN_RD 0xE0 /* 屏讀 */ #define LCD_SCN_CP 0xE8 /* 屏拷貝 */ #define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定義D0-D7位,D3--1為置位,0為清除 */ /* 定義標(biāo)志位 */ sbit CD = P1^0; sbit CE = P1^1; sbit light = P1^2; extern uchar code HZTable[ ][32]; extern uchar code ASCII_DOT_LIB[][16]; /********************************************************************************************************/ /*********************************************************************** * 名稱:LCD_TestStaBit01() * 功能:判斷讀寫指令和讀寫數(shù)據(jù)是否允許。 * 入口參數(shù):無 * 出口參數(shù):返回0表示禁止,否則表示允許 ***********************************************************************/ uchar LCD_TestStaBit01(void) { uchar i; CD=1; for(i=100; i>0; i--) { if( (d_c_add&0x03)==0x03 ) break; } return(i); } /*********************************************************************** * 名稱:LCD_TestStaBit02() * 功能:查詢是否可數(shù)據(jù)自動(dòng)讀狀態(tài) * 入口參數(shù):無 * 出口參數(shù):返回0表示禁止,否則表示允許 ***********************************************************************/ uchar LCD_TestStaBit02(void) { uchar i; CD=1; for(i=100; i>0; i--) { if( (d_c_add&0x04)==0x04 ) break; } return(i); } /*********************************************************************** * 名稱:LCD_TestStaBit03() * 功能:數(shù)據(jù)自動(dòng)寫狀態(tài)是否允許。 * 入口參數(shù):無 * 出口參數(shù):返回0表示禁止,否則表示允許 ***********************************************************************/ uchar LCD_TestStaBit03(void) { uchar i; CD=1; for(i=100; i>0; i--) { if( (d_c_add&0x08)==0x08 ) break; } return(i); } /********************************************************************************************************/ /*********************************************************************** * 名稱:LCD_ReadState() * 功能:讀取狀態(tài)字子程序。 * 入口參數(shù):無 * 出口參數(shù):返回值即為讀出的狀態(tài)字 * 說明:函數(shù)會(huì)設(shè)置LCM數(shù)據(jù)總線為輸入方式 ***********************************************************************/ LCD_WriteCommand(uchar command) { CD=1; d_c_add=command; } /********************************************************************************************************/ /*********************************************************************** * 名稱:LCD_WriteData() * 功能:寫數(shù)據(jù)子程序。(發(fā)送數(shù)據(jù)前,不檢查液晶模塊的狀態(tài)) * 入口參數(shù):dat 要寫入LCM的數(shù)據(jù) * 出口參數(shù):無 * 說明:函數(shù)會(huì)設(shè)置LCM數(shù)據(jù)總線為輸出方式 ***********************************************************************/ LCD_WriteData(uchar dat) { CD=0; d_c_add=dat; } /********************************************************************************************************/ /*********************************************************************** * 名稱:LCD_ReadData() * 功能:讀取數(shù)據(jù)子程序。 * 入口參數(shù):無 * 出口參數(shù):返回值即為讀出的數(shù)據(jù) * 說明:函數(shù)會(huì)設(shè)置LCM數(shù)據(jù)總線為輸入方式 ***********************************************************************/ uchar LCD_ReadData(void) { uchar dat; CD=0; dat=d_c_add; return dat; } /**************************************LCD_WriteTCommand1******************************************************************/ /*********************************************************************** * 名稱:LCD_WriteTCommand1() * 功能:寫無參數(shù)命令子程序。會(huì)先判斷LCM狀態(tài)字。 * 入口參數(shù):command 要寫入LCM的命令字 * 出口參數(shù):操作出錯(cuò)返回0,否則返回1 ***********************************************************************/ uchar LCD_WriteTCommand1(uchar command) { if( LCD_TestStaBit01()==0 )return(0); LCD_WriteCommand(command); // 發(fā)送命令字 return(1); } /********************************LCD_WriteTCommand2************************************************************************/ /*********************************************************************** * 名稱:LCD_WriteTCommand2() * 功能:寫單參數(shù)命令子程序。會(huì)先判斷LCM狀態(tài)字。 * 入口參數(shù):command 要寫入LCM的命令字 * dat1 參數(shù)1 * 出口參數(shù):操作出錯(cuò)返回0,否則返回1 * 說明:先發(fā)送參數(shù)據(jù)數(shù)據(jù),再發(fā)送命令字 ***********************************************************************/ uchar LCD_WriteTCommand2(uchar command, uchar dat1) { if( LCD_TestStaBit01()==0 ) return(0); LCD_WriteData(dat1); // 發(fā)送數(shù)據(jù)1 if( LCD_TestStaBit01()==0 ) return(0); LCD_WriteCommand(command); // 發(fā)送命令字 return(1); } /********************************LCD_WriteTCommand3************************************************************************/ /*********************************************************************** * 名稱:LCD_WriteTCommand3() * 功能:寫雙參數(shù)命令子程序。會(huì)先判斷LCM狀態(tài)字。 * 入口參數(shù):command 要寫入LCM的命令字 * dat1 參數(shù)1 * dat2 參數(shù)2 * 出口參數(shù):操作出錯(cuò)返回0,否則返回1 * 說明:先發(fā)送兩字節(jié)參數(shù)據(jù)數(shù)據(jù),再發(fā)送命令字 ***********************************************************************/ uchar LCD_WriteTCommand3(uchar command, uchar dat1, uchar dat2) { if( LCD_TestStaBit01()==0 ) return(0); LCD_WriteData(dat1); // 發(fā)送數(shù)據(jù)1 if( LCD_TestStaBit01()==0 ) return(0); LCD_WriteData(dat2); // 發(fā)送數(shù)據(jù)2 if( LCD_TestStaBit01()==0 ) return(0); LCD_WriteCommand(command); // 發(fā)送命令字 return(1); } /******************************LCD_WriteTData1**************************************************************************/ /*********************************************************************** * 名稱:LCD_WriteTData1() * 功能:寫1字節(jié)數(shù)據(jù)子程序。會(huì)先判斷狀態(tài)字。 * 入口參數(shù):dat 要寫入LCM的數(shù)據(jù) * 出口參數(shù):操作出錯(cuò)返回0,否則返回1 ***********************************************************************/ uchar LCD_WriteTData1(uchar dat) { if( LCD_TestStaBit03()==0 ) {return(0);} LCD_WriteData(dat); // 發(fā)送命令字 return(1); } /*******************************LCD_Initialize*************************************************************************/ void LCD_Initialize(void) { LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 設(shè)置文本方式RAM起始地址 LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00); // 設(shè)置文本模式的寬度,寬度為N/6或N/8,N為寬度點(diǎn)數(shù),如240 LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 設(shè)置圖形方式RAM起始地址 LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00); // 設(shè)置圖形模式的寬度,寬度為N/6或N/8,N為寬度點(diǎn)數(shù),如240 LCD_WriteTCommand1(LCD_MOD_OR); // 設(shè)置顯示方式為"或" LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 設(shè)置純圖形顯示模式 LCD_WriteTCommand1(LCD_CUR_SHP|0x07); // 光標(biāo)形狀 } /*********************************LCD_FillAll**********************************************************************/ void LCD_FillAll(uchar dat) { uint i; LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指針 LCD_WriteTCommand1(LCD_AUT_WR); // 自動(dòng)寫 for(i=0;i<128*30;i++) { LCD_WriteTData1(dat); // 寫數(shù)據(jù) } LCD_WriteTCommand1(LCD_AUT_OVR); // 自動(dòng)寫結(jié)束 LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指針 } /********************************************************************************************************/ void Write_Hz(uchar x,uchar y,uchar datah) { uchar i; uint StartAddr; StartAddr=x*480+y; for(i=0;i<16;i++) { LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,((StartAddr)/256)); LCD_WriteTCommand2(LCD_INC_WR,HZTable[datah][i*2] ); LCD_WriteTCommand2(LCD_NOC_WR,HZTable[datah][i*2+1]); StartAddr=StartAddr + 30; } } /********************************************************************************************************/ //顯示數(shù)字 void Write_No(uchar x,uchar y,uchar ch) { uchar i, dat; uint StartAddr; StartAddr=x*480+y; for(i=0;i<16;i++) { dat=ASCII_DOT_LIB[ch][i]; LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8); LCD_WriteTCommand2(LCD_NOC_WR,dat); StartAddr=StartAddr + 30; } } /********************************************************************************************************/ //顯示字母,縱向?qū)懽,取模方式:縱向取模,字節(jié)正序 void Write_Char(uchar x,uchar y,uchar ch) { uchar i, dat; uint StartAddr,StartAddr1; StartAddr=x*240+y; StartAddr1=x*240+y+1; for(i=0;i<8;i++) { dat=ASCII_DOT_LIB[ch][i]; LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8); LCD_WriteTCommand2(LCD_NOC_WR,dat); StartAddr=StartAddr+30; } for(i=0;i<8;i++) { dat=ASCII_DOT_LIB[ch][i+8]; LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8); LCD_WriteTCommand2(LCD_NOC_WR,dat); StartAddr1=StartAddr1+30; } } /********************************************************************************************************/ void Charline(uchar x,uchar y ,uchar n,uchar m) { uchar i; for(i=0;i<m;i++) Write_Char(x,y+i,n+i); } /********************************************************************************************************/ void ReverseShowChar(uchar x,uchar y,uchar ch)//CGTAB { uchar i, dat; uint StartAddr,StartAddr1; StartAddr=x*240+y; StartAddr1=x*240+y+1; for(i=0;i<8;i++) { LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8); //LCD_WriteTCommand1(0xc5); //數(shù)據(jù)一次讀,地址不變 //dat=LCD_ReadData(); //讀入數(shù)據(jù) dat=ASCII_DOT_LIB[ch][i]; dat=(0xff-dat); //取反 //LCD_WriteTCommand2( dat, 0xc4); //送回 LCD_WriteTCommand2(LCD_NOC_WR,dat); StartAddr=StartAddr+30; } for(i=0;i<8;i++) { LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8); //LCD_WriteTCommand1(0xc5); //數(shù)據(jù)一次讀,地址不變 // dat=LCD_ReadData(); //讀入數(shù)據(jù) dat=ASCII_DOT_LIB[ch][i+8]; dat=(0xff-dat); //取反 // LCD_WriteTCommand2(dat, 0xc4); //送回 LCD_WriteTCommand2(LCD_NOC_WR,dat); StartAddr1=StartAddr1+30; } } /********************************** //= 函數(shù)原型: Pixel(unsigned char PointX,unsigned char PointY, bit Mode) //= 功 能: 在指定坐標(biāo)位置顯示一個(gè)點(diǎn) //= 參 數(shù): 坐標(biāo),顯示點(diǎn)或清除點(diǎn) //= 返 回 值: //= 函數(shù)性質(zhì):私有函數(shù) //= 如果顯示屏超過了256*256,請(qǐng)修改這個(gè)函數(shù) PointX,PointY的類型 //= Mode 1:顯示 0:清除該點(diǎn) **********************************/ Pixel(unsigned char PointX,unsigned char PointY, bit Mode) { unsigned int StartAddr; uchar StartAddrL,StartAddrH; unsigned char dat; StartAddr=(uint)((uint)PointX*30 + PointY/8 );//grhome StartAddrL=StartAddr&0xFF; StartAddrH=StartAddr>>8; dat=LCD_BIT_OP+7-PointY%8; //生產(chǎn)位操作命令畫點(diǎn)的數(shù)據(jù) if(Mode) dat=dat|0x08; LCD_WriteTCommand3(LCD_ADR_POS,StartAddrL,StartAddrH);//設(shè)置該點(diǎn)所在單元地址 LCD_WriteTCommand1(dat); // 利用位操作命令畫點(diǎn) } /********************************** //= 函數(shù)原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode) //= 功 能: 劃線函數(shù) //= 參 數(shù): 坐標(biāo)1,坐標(biāo)2,顯示點(diǎn)或清除點(diǎn) //= 返 回 值: //= 函數(shù)性質(zhì):私有函數(shù) //= 其它:顯示點(diǎn)陣不超過255*255 /**********************************/ void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2, bit Mode) { unsigned char x,y; float k,b; if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1 { k=((float)y2-y1) / ((float)x2-x1) ; b=y1-k*x1; if( x1 <= x2 ) { for(x=x1;x<=x2;x++) { y=(uchar)(k*x+b); Pixel(x, y, Mode); } } else { for(x=x2;x<=x1;x++) { y=(uchar)(k*x+b); Pixel(x, y, Mode); } } } else // abs(y1-y2) > abs(x1-x2) |K|>1 { k=((float)x2-x1) / ((float)y2-y1) ; b=x1-k*y1; if( y1 <= y2 ) { for(y=y1;y<=y2;y++) { x=(uchar)(k*y+b); Pixel( x , y,Mode ); } } else { for(y=y2;y<=y1;y++) { x=(uchar)(k*y+b); Pixel( x , y,Mode ); } } } } /********************************************************************************************************/ uchar code HZTable[ ][32]={ {0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52, 0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04},/*"測(cè)",0*/ {0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0, 0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00},/*"試",1*/ {0x0D,0xF8,0x71,0x08,0x11,0x08,0x11,0x08,0xFD,0x08,0x11,0xF8,0x30,0x00,0x3B,0xFC, 0x54,0x40,0x50,0x40,0x93,0xFC,0x10,0x40,0x10,0x40,0x10,0x40,0x17,0xFE,0x10,0x00},/*"程",2*/ {0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x00,0x27,0xF8,0x21,0x10,0x20,0xA0,0x20,0x40, 0x2F,0xFE,0x20,0x44,0x20,0x40,0x20,0x40,0x20,0x40,0x40,0x40,0x41,0x40,0x80,0x80},/*"序",0*/ {0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48, 0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02},/*"我",1*/ }; unsigned char code ASCII_DOT_LIB[][16]= { //正確的,縱向取模,字節(jié)正序 0x00,0x10,0x18,0x14,0x03,0x11,0x1F,0x10,0x00,0x04,0x1C,0x64,0x80,0x04,0xFC,0x04, 0x00,0x08,0x10,0x17,0x11,0x11,0x1F,0x10,0x00,0x18,0x04,0xC4,0x04,0x04,0xFC,0x04, 0x00,0x10,0x1C,0x13,0x00,0x13,0x1C,0x10,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00, 0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00, // -0- 0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00, // -1- 0x00,0x0E,0x11,0x10,0x10,0x10,0x0E,0x00,0x00,0x0C,0x84,0x44,0x24,0x14,0x0C,0x00, // -2- 0x00,0x0C,0x12,0x11,0x11,0x10,0x0C,0x00,0x00,0x70,0x88,0x04,0x04,0x04,0x18,0x00, // -3- 0x00,0x00,0x1F,0x08,0x04,0x03,0x00,0x00,0x00,0x24,0xFC,0x24,0x24,0x20,0xE0,0x00, // -4- 0x00,0x10,0x10,0x11,0x11,0x10,0x1F,0x00,0x00,0x70,0x88,0x04,0x04,0x84,0x98,0x00, // -5- 0x00,0x00,0x18,0x11,0x11,0x08,0x07,0x00,0x00,0x70,0x88,0x04,0x04,0x88,0xF0,0x00, // -6- };