#i nclude "absacc.h" #i nclude "math.h"
#i nclude "ASCII816.h" //標(biāo)準(zhǔn)ASCII庫 #i nclude "HZTable.h" //漢字點陣庫(自做) #i nclude "menu.h" //菜單庫(自做)
#define ComPort 0xB101 #define DataPort 0xB000 #define GraphAddr 0x0000 //head of graph
//以8*8字符計算,顯示屏橫向、縱向可以顯示的字符個數(shù) //以240*128為例: #define LineChar 30 //一行16個字符(8*8) #define ColumnChar 16 //總共16列
//指令,數(shù)據(jù) 讀寫狀態(tài)檢查 #define RWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x03; } while(sta!=0x03); } //數(shù)據(jù)自動讀 狀態(tài)檢查 #define AutoRCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x04; } while(sta!=0x04); } //數(shù)據(jù)自動寫 狀態(tài)檢查 #define AutoWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x08; } while(sta!=0x08); }
/*------輸入/出函數(shù),與T6963通訊------------------------------------------------*/ /*------------------------------------------------------------------------*/
// 向數(shù)據(jù)口發(fā)Data #define OutPortData(dat ) { RWCheck(); XBYTE[DataPort]=dat; }
//寫有 1 個參數(shù)命令 #define OutPortCom1(command) { RWCheck(); XBYTE[ComPort]= command; }
//寫有 2 個參數(shù)命令 #define OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }
//寫有 3 個參數(shù)命令 #define OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}
unsigned char InPortData() { RWCheck(); return(XBYTE[DataPort]); }
/*-----------------------------------------------------------------------------------*/ //顯示8*16字符 //lin:行(0-7), column: 列(0-15) //ch:字符代碼(標(biāo)準(zhǔn)ASCII碼) void ShowChar(unsigned char lin,unsigned char column,unsigned char ch) { unsigned char i; unsigned char dat; unsigned int StartAddr;
StartAddr=lin*LineChar +column; //定位起始行
for(i=0;i<16;i++) { dat=ASCII816[ ch-0x20 ]; OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address OutPortCom2( dat, 0xc4);
StartAddr=StartAddr + LineChar; } }
/*----------------------------------------------------------------------------------------------*/ //顯示一個漢字(16*16點陣) //lin:行(0-7), column: 列(0-7) //hzcode: 漢字代碼(自定義的) void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode) { unsigned char i; unsigned int StartAddr;
StartAddr=lin*LineChar + column; //定位起始行
for(i=0;i<16;i++) { OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一 OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一
StartAddr=StartAddr + LineChar; } } ///////////////////////////////////////////////////////////////////////////////////////////// //顯示一個漢字(16*16點陣) //lin:行(0-7), column: 列(0-7) //hzcode: 漢字代碼(自定義的) void ShowHZD(unsigned char lin,unsigned char column,unsigned int hzcode) { unsigned char i,j; unsigned int StartAddr;
StartAddr=lin*LineChar*16 +column; //定位起始行
for(i=0;i<35;i++) { OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //定位當(dāng)前操作位置 for(j=0;j<5;j++) OutPortCom2( HZTable[hzcode][i*5+j], 0xc0); //顯示當(dāng)前一行
StartAddr=StartAddr + LineChar; } }
//////////////////////////////////////////////////////////////////////////////////////////// /*-----------------------------------------------------------------------------------*/ //顯示一行字符串(漢字,字母混排,一行16字節(jié)) //lin:行 //lineheadaddr: 此行漢字代碼區(qū)首地址 void ShowLine(unsigned char lin,unsigned char column,unsigned char linehead[]) { unsigned char i,j; unsigned char byte; unsigned int hzcode;
for( i= column,j=0; i< column+14 ; ) { byte=linehead[j]; if(byte < 0x80) //字母 { ShowChar(lin, i , byte); i=i+1;j=j+1; } else // byte >= 0x80(漢字) { byte=byte & 0x7f; //最高位置0,即:減去0x8000 hzcode=byte*256 + linehead[j+1]; //加低8位,組合成整型數(shù)地址 ShowHZ( lin,i,hzcode); i=i+2;j=j+2; } } }
/*-----------------------------------------------------------------------------------*/ //顯示一屏漢字 //pageheadaddr:此屏漢字代碼地址區(qū)首地址 void ShowPage(unsigned char lin,unsigned char column1,unsigned char pagehead[][14]) { unsigned char i; for(i=0;i< 4 ;i++) ShowLine((lin+i*20),column1,pagehead); //1行8個漢字,16字節(jié) }
/*----------------------------------------------------------------------------------------------------*/ //反顯一個字符 //lin:行(0-7), column: 列(0-15) void ReverseShowChar(unsigned char lin,unsigned char column) { unsigned char i; unsigned char dat; unsigned int StartAddr;
StartAddr=lin*LineChar +column; //定位起始行
for(i=0;i<16;i++) { OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address OutPortCom1( 0xc5 ); //數(shù)據(jù)一次讀,地址不變 dat=InPortData(); //讀入數(shù)據(jù) dat=~dat; //取反 OutPortCom2( dat, 0xc4); //送回
StartAddr=StartAddr+ LineChar; } }
/*----------------------------------------------------------------------------------------------------*/ //反顯一個漢字 //lin:行(0-7), column: 列(0-15) void ReverseShowHZ(unsigned char lin,unsigned char column) { ReverseShowChar(lin,column); ReverseShowChar(lin,column+1); } /*----------------------------------------------------------------------------------------------------*/ //反顯一行漢字 //lin:行(0-7) void ReverseShowLine(unsigned char lin) { unsigned char column; for(column=0; column< ColumnChar; column++) ReverseShowChar(lin,column); }
////////////////////////////////////////////////////////////////////////////////////// void ShowPicture(unsigned char Startline,unsigned char Startcolumn,unsigned char LineWidth,unsigned char ColumnWidth,unsigned int address) { unsigned char i,j; unsigned int StartAddr;
StartAddr=Startline*LineChar + Startcolumn; //定位起始位置
for(i=0;i<ColumnWidth;i++) {
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address for(j=0;j<LineWidth;j++) { OutPortCom2( CBYTE[address + i*LineWidth+ j ], 0xc0); } StartAddr=StartAddr + LineChar; } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //圖形函數(shù),用于描點畫圖 //--------------------------------------------------------------------------- //在指定位置顯示一個點 //如果顯示屏超過了256*256,請修改這個函數(shù) PointX,PointY的類型 //Mode 1:顯示 0:清除該點 Pixel(unsigned char PointX,unsigned char PointY, bit Mode) { unsigned int StartAddr=0; unsigned char dat;
StartAddr=PointX*LineChar + PointY/8; dat=0xf0+7-PointY%8; if(Mode) dat=dat|0x08;
OutPortCom3( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24 ); //設(shè)置該點所在單元地址 OutPortCom1(dat); }
//------------------------------------------------------------------------------- //劃線函數(shù) void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode) { unsigned char x,y; double 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=k*x+b; Pixel(x, y, Mode); } } else { for(x=x2;x<=x1;x++) { y=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=k*y+b; Pixel( x , y,Mode ); } } else { for(y=y2;y<=y1;y++) { x=k*y+b; Pixel( x , y,Mode ); } } } }
/*---------------------------------------------------------------------------------------------------*/ void ClearScreen() {
unsigned int i; ///////// 清顯示 RAM 區(qū) 0000h--2000h (8k) OutPortCom3(0x00,0x00,0x24); //設(shè)置指針地址0000H
OutPortCom1(0xb0); //設(shè)置自動寫狀態(tài) for(i=0x00;i<0x2000;i++) OutPortData(0x00); // data=0; OutPortCom1(0xb2); // 自動寫結(jié)束 }
//初始化LCD //需要手動設(shè)置 void InitLCD() { OutPortCom3( 0x00,0x00,0x42 ); //設(shè)置圖形顯示區(qū)域首地址GraphAddr OutPortCom3( 30,0x00,0x43 ); //設(shè)置圖形顯示區(qū)域?qū)挾?: LineChar
// OutPortCom3( 0x00,0x00,0x42 ); //設(shè)置圖形顯示區(qū)域首地址GraphAddr // OutPortCom3( 0x10,0x00,0x43); //設(shè)置圖形顯示區(qū)域?qū)挾?10H
OutPortCom1(0xa7); //設(shè)置光標(biāo)形狀 cursor size 8x8 OutPortCom1(0x80); //設(shè)置顯示方式: CGROM方式 文本\圖形 "或" OutPortCom1(0x98); //設(shè)置顯示開關(guān): 1001 1100 圖形
ClearScreen(); }
|
|