?? uop.c
字號:
void AutoWriteData( uchar dat) ;
void ClearScreen(unsigned int ram) ;
void draw_dot(uchar x,uchar y,uchar mode);
void WriteCmd1(unsigned char cmd);
void WriteCmd2(unsigned char dat,unsigned char cmd);
void WriteCmd3(unsigned char dat1,unsigned char dat2,unsigned char cmd);
void CursorPosSet(unsigned char x,unsigned char y) ;
unsigned char Cursor_X,Cursor_Y; //光標的坐標
/************************************************************
指令代碼定義
************************************************************/
#define CursorPointer 0x21 // 光標地址設置
#define OffsetReg 0x22 // CGRAM偏移地址設置
#define AddrSet 0x24 // 顯示地址設置
#define TextHomeAddr 0x40 // 文本首地址
#define TextArea 0x41 // 文本寬度設置
#define GraHomeAddr 0x42 // 圖形首地址設置
#define GraArea 0x43 // 圖形寬度設置
#define OrMode 0x80 // 或模式顯示
#define ExorMode 0x81 // 異或模式顯示
#define AndMode 0x83 // 與模式顯示
#define TextAttMode 0x84 // 文本屬性模式
#define InterCGROM 0 // 內部CGROM
#define ExCGRAM 0x08 // 外部CGRAM
#define DisplayOff 0x90 // 顯示關閉
#define CursorOn 0x92 // 光標顯示,但不閃爍
#define CursorBlink 0x93 // 光標閃爍
#define TextOn 0x94 // 文本模式打開
#define GraOn 0x98 // 圖形模式打開
#define TGAllOn 0x9c // 文本圖形模式都打開
#define DataAutoWrite 0xb0 // 數據自動寫
#define DataAutoRead 0xb1 // 數據自動讀
#define ExitAutoRW 0xb2 // 退出數據自動讀寫模式
#define DataWAddrI 0xc0 // 數據寫,地址加1
#define DataWAddrD 0xc2 // 數據寫,地址減1
#define DataWAddrNV 0xc4 // 數據寫,地址不變
#define DataRAddrI 0xc1 // 數據讀,地址加1
#define DataRAddrD 0xc3 // 數據讀,地址減1
#define DataRAddrNV 0xc5 // 數據讀,地址不變
#define ScreenPeek 0xe0 // 屏讀
#define ScreenCopy 0xe1 // 屏拷貝
#define LineChar 32 // 設置寬度
/********************************************************************************
函數名: ReadSdate(void)
函數功能: IOPORT輸出數據并檢查LCD忙數據。
返回數據:checkbusy
/********************************************************************************/
ReadSdate()
{
uchar checkbusy;
LCD_BUS = 0xff;
CD1=1;
RD1=0;
checkbusy=LCD_BUS;
RD1=1;
return ( checkbusy );
}
/********************************************************************************
函數名: Void RWcheck()
函數功能: 判斷狀態位STA1,STA0子程序(讀寫指令和讀寫數據狀態),在寫指令的讀,
寫數據之前這兩個標志位必須同時為1
/********************************************************************************/
void RWcheck(void)
{
uchar databusy;
do{ databusy=ReadSdate();}
while( !(databusy&0x03) );
}
/********************************************************************************
函數名: Void AutoRcheck()
函數功能: 判斷狀態位STA2的子程序(數據自動讀狀態),該位在數據自動讀操作過程中
取代STA0和STA1有效。在連續讀過程中每讀一次之前都要確認STA2=1
********************************************************************************/
void AutoRcheck(void)
{
uchar databusy;
do{databusy=ReadSdate(); }
while( !(databusy&0x04) );
}
/********************************************************************************
函數名: Void AutoWcheck()
函數功能: 判斷狀態位STA3子程序(數據自動寫狀態)
********************************************************************************/
void AutoWcheck(void)
{
uchar databusy;
do{databusy=ReadSdate(); }
while( !(databusy&0x08) );
}
/********************************************************************************
函數名: Void WriteCmd1(uchar cmd)
Void WriteCmd2(uchar dat1,uchar cmd)
Void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
Void WriteData(uchar dat)
函數功能: 寫指令和寫數據子程序
********************************************************************************/
void WriteData(uchar dat)
{
RWcheck();
CD1=0;
LCD_BUS=dat;
WR1=0;
WR1=1;
}
void WriteCmd1(unsigned char cmd)
{
RWcheck();
CD1=1;
LCD_BUS=cmd;
WR1=0;
WR1=1;
}
void WriteCmd2(uchar dat,uchar cmd)
{
WriteData(dat);
WriteCmd1(cmd);
}
void WriteCmd3(uchar dat1,uchar dat2,uchar cmd)
{
WriteData(dat1);
WriteData(dat2);
WriteCmd1(cmd);
}
void AutoWriteData( uchar dat)
{
AutoWcheck();
CD1 = 0;
LCD_BUS= dat;
WR1=0;
WR1=1;
}
/********************************************************************************
函數名: void lcd_init (void)
函數功能:LCD初始化設置
********************************************************************************/
void lcd_init (void)
{
WriteCmd3(0x00,0x00,0x40); //文本首地址
WriteCmd3(0x20,0x00,0x41); //文本寬度設置
WriteCmd3(0x00,0x00,0x42); // 圖形首地址
WriteCmd3(0x20,0x00,0x43); //設置圖形寬度
//即一行顯示所占字節數
WriteCmd1(0xa1); //光標設置
WriteCmd1(0x81); //顯示方式設置 邏輯“或”合成
WriteCmd1(0x9f); //顯示開關
Cursor_X=0x08;
Cursor_Y=0x4f;
CursorPosSet(Cursor_X,Cursor_Y);
ClearScreen(0x2000);
}
/********************************************************************************
函數名: Void ClearScreen(unsigned int ram)
函數功能: 清除整個屏幕
ram : 需要清零的單元數
********************************************************************************/
void ClearScreen(uint ram)
{
unsigned int i;
// 清顯示 RAM 區 0000h--2000h (8k)
WriteCmd3(0x00,0x00,0x24); // 設置指針地址0000H
WriteCmd1(0xb0); // 設置自動寫狀態
for(i=0x00;i<ram;i++) AutoWriteData(0x00); // data=0;
WriteCmd1(0xb2); // 自動寫結束
}
/********************************************************************************
函數原型: void draw_dot(x,y)
功 能; T6963屏上打點
入口參數: 橫坐標(x),樅坐標(y)
出口參數:
********************************************************************************/
void draw_dot(uchar x,uchar y,uchar mode)
{ uchar dat11,dat22;
uchar n,t;
dat11=(y*32)%256 +x/8;
dat22=(y*32)/256;
delay(20);
WriteCmd3(dat11,dat22,0x24);
if(mode) n=0xf8;
else n=0xf0;
t=n|((~(x%8))&0x07);
WriteCmd1(t);
}
/********************************************************************************
函數名: Void CursorPosSet(uchar X,uchar Y)
函數功能: 光標位置設置
********************************************************************************/
void CursorPosSet(unsigned char x,unsigned char y)
{
WriteCmd3(x,y,CursorPointer); //X的取值范圍0-20;Y的取值范圍0-15;
}
/********************************************************************************
函數名: Void CursorUp()
函數功能: 光標向上移動一格
********************************************************************************/
void CursorUp()
{
if(Cursor_Y>0)Cursor_Y-=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函數名: Void CursorDown()
函數功能: 光標向下移動一格
********************************************************************************/
void CursorDown()
{
if(Cursor_Y<8)Cursor_Y+=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函數名: Void CursorRight()
函數功能: 光標向右移動一格
********************************************************************************/
void CursorRight()
{
if(Cursor_X<20)Cursor_X+=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函數名: Void CursorLeft()
函數功能: 光標向左移動一格
********************************************************************************/
void CursorLeft()
{
if(Cursor_X>0)Cursor_X-=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函數名: Void CursorEnter()
函數功能: 光標換行
********************************************************************************/
void CursorEnter()
{
Cursor_X=0;
Cursor_Y+=1;
WriteCmd3(Cursor_X,Cursor_Y,CursorPointer);
}
/********************************************************************************
函數原型: void delay(uchar t)
功 能; (1)延時 T*10 (2) 1MS*k
入口參數: (1) uchar t (2)uint k
出口參數:
********************************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++) { for(j=0;j<10;j++); }
}
void delay1(uint k)
{
uchar j;
while ((k--)!=0) { for (j=0;j<125;j++);}
}
/********************************************************************************
函數名:Void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode)
函數功能:顯示一個漢字(16*16點陣)
column:漢字起始列(0-30) (240/8=30)
lin: 漢字起始行(0-7) (128/16=8)
hzcode: 漢字代碼(自定義的)
注:超出范圍的將直接寫到RAM中,可以實現卷屏效果
********************************************************************************/
void ShowHZ16x16(unsigned char column,unsigned char lin,unsigned int hzcode)
{
unsigned char temp1,temp2;
unsigned int StartAddr;
unsigned char i=0;
unsigned int * temp;
temp=&HZK16x16[hzcode][0];
StartAddr=16*lin*LineChar+ column; //定位起始行
for(i=0;i<16;i++)
{
WriteCmd3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), AddrSet);
temp1=HZK16x16[hzcode][i*2+*temp];
WriteCmd2(temp1, DataWAddrI); // 左半部 地址加一
temp2=HZK16x16[hzcode][i*2+1+*temp];
WriteCmd2(temp2, DataWAddrNV); // 右半部 顯示地址不變
StartAddr=StartAddr + LineChar; // 換到下一行
}
}
//***********************************************************
// 主函數
//***********************************************************
main()
{ /*
uchar x;
uchar m;
for(x=0;x<240;x++)
{
draw_dot(2*x,94,1);
draw_dot(2*x,47,1);
draw_dot(2*x,0,1);
}
for(m=0;m<128;m++)
{
draw_dot(0,m*2,1);
draw_dot(239,m*2,1);
draw_dot(120,m*2,1);
}*/
lcd_init();
CursorPosSet(15,2);
ShowHZ16x16(12,1, 2);
ShowHZ16x16(12,2, 0);
// ShowHZ16x16(10,7, 0x03);
// ShowHZ16x16(12,7, 0x04);
// ShowHZ16x16(15,6, 0x05);
// ShowHZ16x16(17,6, 0x16);-
// ShowHZ16x16(15,7, 0x17);
// ShowHZ16x16(17,7, 0x18);
while(1);
}
// TGLCMLIMIT64A接口程序(模擬方式)
/***************************************************************************
;連線圖:
;*LCM---89C52* *LCM---89C52* *LCM-------89C52* *LCM----------89C52* *
;*DB0---P0.0* *DB4---P0.4* *D/I-------P2.6* *CS1----------P2.4* *
;*DB1---P0.1* *DB5---P0.5* *R/W-------P2.7* *CS2----------P2.5* *
;*DB2---P0.2* *DB6---P0.6* *RST--------VCC* *CS3----------P3.2* *
;*DB3---P0.3* *DB7---P0.7* *E---------P2.3* *
;注:89C52的晶振頻率為12MHz *
***************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -