?? lcd320240.c
字號:
//由FLASHMAN編寫,近日在搞觸摸屏,歡迎交流,QQ28479691
//2005-11-09
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char // 0~255
#define uint unsigned int // 0~65535
#define LCDBUS P1
sbit BUSY = P3^0; //忙位檢測,進入寫入操作時必須檢測此位,有效電平可設置
sbit _RES = P3^5;
sbit RS = P3^1;
sbit _WR = P3^7;
sbit _RD = P3^6;
sbit _CS = P3^4;
uchar code TextLogo[]={ //將寫入的字
"acbdefghijklmnopqrstuvwxyzabcdefghijklmn"
"ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN"
"1234567890123456789012345678901234567890"
};
void delayms(uint m) // 11.0592MHz
{
uchar j;
uint i;
for(i=0; i<m; i++)
for(j=0; j<109; j++)
_nop_();
}
void SdCmd(uchar Command) //發送命令
{
while(BUSY);
RS = 0; //寫入命令寄存器
LCDBUS = Command;
_CS = 0; //片選
_nop_();
_WR = 0; //寫入
_nop_();
_WR = 1;
_nop_();
_CS = 1;
}
void SdData(uchar DData) //發送數據
{
while(BUSY);
RS = 1; //寫入數據寄存器
LCDBUS = DData;
_CS = 0; //片選有效
_nop_();
_WR = 0; //寫入
_nop_();
_WR = 1;
_nop_();
_CS = 1;
}
void WriteTextScreen(uchar *TxtData,uchar line)
{
//字符顯示,可顯示40列*30行=1200個字,共顯示line行
uchar TempData;
uchar i,j;
SdCmd(0x20);SdCmd(0x27); //工作視窗右邊位置X=320/8-1=39=0x27
SdCmd(0x30);SdCmd(0x30); //工作視窗低邊位置Y=240-1=239=0xEF
SdCmd(0x40);SdCmd(0x00); //工作視窗左邊位置SS=0
SdCmd(0x50);SdCmd(0x00); //工作視窗頂邊位置SC=0 (SS,SC)可以看作原點,(X,Y)可以看作顯示區的另外一邊
SdCmd(0x60); SdCmd(0x00); // 光標的X地址(范圍:0到64 ,默認為0)
SdCmd(0x70); SdCmd(0x00); // 光標的Y地址(范圍:0到255,默認為0),光標即當前位置
SdCmd(0x00); SdCmd(0xCD); // 令第三位CG=1,接受字符顯示,此位為顯示字符的關建位
for (j=0; j<line; j++) //line行數
{
for(i=0; i<40; i++)
{
TempData=(*(TxtData++));
SdData(TempData); //寫入一位數據光標就自動向下移動,估計到了工作視窗右邊就自動向下移動一行
}
}
}
void ClrLCD()
{
uchar i,j;
SdCmd(0x20);SdCmd(0x27); //工作視窗右邊位置X=320/8-1=39=0x27
SdCmd(0x30);SdCmd(0xef); //工作視窗低邊位置Y=240-1=239=0xEF
SdCmd(0x40);SdCmd(0x00); //工作視窗左邊位置SS=0
SdCmd(0x50);SdCmd(0x00); //工作視窗頂邊位置SC=0 (SS,SC)可以看作原點,(X,Y)可以看作顯示區的另外一邊
SdCmd(0x60); SdCmd(0x00); // 光標的X地址(范圍:0到64 ,默認為0)
SdCmd(0x70); SdCmd(0x00); // 光標的Y地址(范圍:0到255,默認為0),光標即當前位置
SdCmd(0x00); SdCmd(0xCD); // 令第三位CG=1,接受字符顯示,此位為顯示字符的關建位
for(j=0;j<15;j++)
for(i=0;i<40;i++)SdData(' ');
}
void initLCDM(void)
{
_RES = 0;
delayms(1); //硬件復位
_RES = 1;
SdCmd(0x00);SdCmd(0xCD); // 電源設置(關鍵)
SdCmd(0x08);SdCmd(0x73); // 視窗設置時鐘頻率設置(關鍵)
SdCmd(0x10);SdCmd(0xE9); // 光標設置
SdCmd(0x18);SdCmd(0x10); //光標高度CR和行距DY設定
SdCmd(0x20);SdCmd(0x27); //工作視窗右邊位置X=320/8-1=39=0x27
SdCmd(0x30);SdCmd(0xef); //工作視窗低邊位置Y=240-1=239=0xEF
SdCmd(0x40);SdCmd(0x00); //工作視窗左邊位置SS=0
SdCmd(0x50);SdCmd(0x00); //工作視窗頂邊位置SC=0 (SS,SC)可以看作原點,(X,Y)可以看作顯示區的另外一邊
SdCmd(0x28);SdCmd(0x27); //顯示視窗右邊位置A==320/8-1=39=0x27
SdCmd(0x38);SdCmd(0xEF); //顯示視窗底邊位置B=240-1=239=0xEF
SdCmd(0x48);SdCmd(0x00); //顯示視窗左邊位置C=0
SdCmd(0x58);SdCmd(0x00); //顯示視窗頂邊位置D=0 可以看出顯示視窗和工作視窗是重合的
//顯示視窗與工作視窗的區別:顯示視窗由LCD的點陣決定,工作視窗是用戶自定義的活動窗口,等于或大于顯示視窗
//工作視窗可以控制顯示區域換行,左\右\底三邊,但對于頂邊是控制不了
//工作視窗在顯示視窗內,這樣就可以畫定一塊區域來進行操作,而不影響其他顯示
//RA8802有9.6k字節的顯示內存,320*240共需9600個字節,即9.375K,剛好夠用
SdCmd(0x60); SdCmd(0x00); // 光標的X地址(范圍:0到64 ,默認為0)
SdCmd(0x70); SdCmd(0x00); // 光標的Y地址(范圍:0到255,默認為0) 光標的坐標(X,Y)要落在工作區里
SdCmd(0x80);SdCmd(0x33); //光標閃爍時間BT=設定值/幀頻
SdCmd(0x90);SdCmd(0x0C); //液晶工作時鐘周期CK=系統頻率*4/(列數*行數*幀頻)
SdCmd(0xB0);SdCmd(0x27); //設定行中斷地址,當光標位置CPXR=INTX中斷發生
SdCmd(0xB8);SdCmd(0xEF); //設定列中斷地址,當光標位置CPXR=INTY中斷發生
SdCmd(0xA0);SdCmd(0x08); //BSY,INA,INX,INY,MSZ,MSA,MSX,MSY 命令字設置(關鍵)
SdCmd(0xC0);SdCmd(0xF0); //AZEN,AZOE,ADET,AS 觸摸功能設置
SdCmd(0xD0);SdCmd(0x2f); //液晶顯示對比度設置(關鍵)
SdCmd(0xE0);SdCmd(0x00); //設置寫入顯示內存的數據(關鍵)
SdCmd(0xF0);SdCmd(0xA0); //字庫語言選擇,內部簡體字庫(關鍵)
delayms(30); //要根據所用晶振的不同來調節,否則可難導致無法正常顯示
ClrLCD(); //清屏
}
void main()
{
SP=0x60;
initLCDM();
WriteTextScreen(TextLogo,3);
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -