?? lcd12864s.c
字號:
/*************************************************
名 稱:LCD12864_ST7920串行測試程序
試驗功能:測試基于ST7920控制芯片的LCD12864的顯示
串行方式連接;晶振11.0592M
編 寫:JiangX.net
*************************************************/
#include <reg52.h>
#include <ziku.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int //宏定義
/*****LCD接口定義*****/
sbit CS = P2^4; //片選信號
sbit SID = P2^5; //串行數據
sbit SCLK = P2^6; //串行同步時鐘
sbit PSB = P2^1; //串并口選擇 1:并口模式; 0:串口模式;
/*****LCD功能初始化指令*****/
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值為00H
#define AC_INIT 0x02 //將AC設置為00H。且游標移到原點位置,位置歸位
#define CURSE_ADD 0x06 //設定游標移到方向及圖像整體移動方向(默認游標右移,圖像整體不動)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //顯示開,顯示游標,且游標位置反白
#define DISPLAY_OFF 0x08 //顯示關
#define CURSE_DIR 0x14 //游標向右移動:AC=AC+1
#define SET_CG_AC 0x40 //設置AC,范圍為:00H~3FH
#define SET_DD_AC 0x80
/*****漢字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行漢字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行漢字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行漢字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行漢字位置
};
/*****n(ms)延時子程序**** */
void delayms(uint t) //約延時n(ms)
{
uint i;
while(t--)
{
for(i=120;i>0;i--);
}
}
/*****串行發送一個字節*****/
void SendByte(uchar Dbyte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK = 0;
Dbyte=Dbyte<<1; //左移一位
SID = CY; //移出的位給SID
SCLK = 1;
SCLK = 0;
}
}
/*****串行接收一個字節*****/
uchar ReceiveByte(void)
{
uchar i,temp1,temp2;
temp1 = 0;
temp2 = 0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
SCLK = 0;
SCLK = 1;
SCLK = 0;
if(SID) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
SCLK = 0;
SCLK = 1;
SCLK = 0;
if(SID) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/*****檢測LCD忙狀態*****/
void CheckBusy( void )
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&ReceiveByte()); //BF(.7)=1 Busy
}
/*****寫指令*****/
void Lcd_WriteCmd(uchar Cbyte )
{
CS = 1;
CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte); //高四位
SendByte(0xf0&Cbyte<<4); //低四位(先執行<<)
CS = 0;
}
/*****寫數據*****/
void Lcd_WriteData(uchar Dbyte )
{
CS = 1;
CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte); //高四位
SendByte(0xf0&Dbyte<<4); //低四位(先執行<<)
CS = 0;
}
/*****初始化LCD*****/ //里面有清除顯示的命令
void Lcd_Init(void)
{
PSB = 0;
delayms(50);
Lcd_WriteCmd(0x30); //選擇基本指令集
delayms(1);
Lcd_WriteCmd(0x30); //選擇8bit數據流
delayms(1);
Lcd_WriteCmd(0x0c); //開顯示(無游標、不反白)
delayms(1);
Lcd_WriteCmd(0x01); //清除顯示,并且設定地址指針為00H
delayms(20);
}
/*****顯示漢字*****/
void hanzi_Disp(uchar x,uchar y,uchar code *s)//只能在同一行中顯示,不能實現自動換行
{
Lcd_WriteCmd(addr_tab[8*x+y]); //寫地址
while(*s>0)
{
Lcd_WriteData(*s); //寫數據
s++;
}
}
/*****顯示圖片(顯示Gdram內容)*****/
/*繪圖顯示的步驟
1 關閉繪圖顯示功能
2 先將垂直的坐標(Y)寫入繪圖RAM地址
3 再將水平的位元組坐標(X)寫入繪圖RAM地址
4 將D15-D8寫入RAM中
5 將D7-D0寫入到RAM中
6 打開繪圖顯示功能*/
//圖片取模方式:橫向取模,字節正序
void pic_Disp(uchar *pic) //顯示Gdram內容(顯示圖片)
{
uchar x,y,i;
for(i=0;i<9;i=i+8)
for(y=0;y<32;y++)
{
for(x=0;x<8;x++)
{
Lcd_WriteCmd(0x36); //擴充指令,開繪圖顯示
Lcd_WriteCmd(0x80+y); //行地址
Lcd_WriteCmd(0x80+x+i); //列地址
Lcd_WriteData(*pic++); //寫數據 D15-D8
Lcd_WriteData(*pic++); //寫數據 D7-D0
Lcd_WriteCmd(0x30); //擴充指令,關繪圖顯示
}
}
}
/*****整屏顯示豎條*****/
//當i=0時顯示上面128×32,當i=8時顯示下面128×32
//當i=0時顯示上面128×32,當i=8時顯示下面128×32
void LcdFill_Vertical()
{
uchar x,y,i;
for(i=0;i<9;i=i+8)
for(y=0;y<0x20;y++)
{
for(x=0;x<8;x++)
{
Lcd_WriteCmd(0x36); //擴充指令 繪圖顯示
Lcd_WriteCmd(y+0x80); //行地址
Lcd_WriteCmd(x+0x80+i); //列地址
Lcd_WriteData(0x55); //寫數據 D15-D8
Lcd_WriteData(0x55); //寫數據 D7-D0
Lcd_WriteCmd(0x30);
}
}
}
/*****整屏顯示橫條*****/
void LcdFill_Level()
{
uchar x,y,i;
uchar k;
for(i=0;i<9;i+=8)
for(y=0;y<0x20;y++)
{
if((y%2)==1) k=0xff;
else k=0;
for(x=0;x<8;x++)
{
Lcd_WriteCmd(0x36); //擴充指令 繪圖顯示
Lcd_WriteCmd(y+0x80); //行地址
Lcd_WriteCmd(x+0x80+i); //列地址
Lcd_WriteData(k);
Lcd_WriteData(k);
Lcd_WriteCmd(0x30);
}
}
}
/*****整屏充滿亮點或暗點*****/
//當i=0時顯示上面128×32,當i=8時顯示下面128×32
//當i=0時顯示上面128×32,當i=8時顯示下面128×32
void Lcd_Fill(uchar test)
{
uchar x,y,i;
for(i=0;i<9;i=i+8)
for(y=0;y<0x20;y++)
{
for(x=0;x<8;x++)
{
Lcd_WriteCmd(0x36); //擴充指令 繪圖顯示
Lcd_WriteCmd(y+0x80); //行地址
Lcd_WriteCmd(x+0x80+i); //列地址
Lcd_WriteData(test); //寫數據 D15-D8
Lcd_WriteData(test); //寫數據 D7-D0
Lcd_WriteCmd(0x30);
}
}
}
/*****主函數*****/
void main(void)
{
Lcd_Init();
while(1)
{
Lcd_Init();
hanzi_Disp(0,0,"光伏項目組:");
hanzi_Disp(1,1,"LCD測試程序");
hanzi_Disp(2,0,"越做越好");
hanzi_Disp(3,3,"");
delayms(2000);
Lcd_Init();
//Lcd_Fill(0xff);
hanzi_Disp(1,2,"壞點檢測");
delayms(500);
Lcd_Init();
Lcd_Fill(0xff);
delayms(1500);
Lcd_Init();
LcdFill_Vertical();
delayms(750);
Lcd_Init();
LcdFill_Level();
delayms(750);
Lcd_Init();
hanzi_Disp(1,2,"唐詩演示");
delayms(500);
Lcd_Init();
hanzi_Disp(0,0,tangshi);
delayms(1500);
Lcd_Init();
hanzi_Disp(1,2,"顯示圖片");
delayms(500);
/* Lcd_Init();
pic_Disp(LCDsheji);
delayms(1000);
Lcd_Init();
pic_Disp(rmb);
delayms(1000);
Lcd_Init();
pic_Disp(qiche);
delayms(1000);
Lcd_Init();
pic_Disp(gongji);
delayms(1000);
Lcd_Fill(0x00); //清顯示RAM
delayms(500); */
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -