?? lcd.c
字號:
//帶字庫12864液晶LCD驅動(JDL12864,FM12864等)
#include <reg52.h>
#define lcd_Bus P1
#define Key_Bus P2
/******************************************************
//sbit FSB=P1^3;
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^7;
*************************************************************/
//sfr Key_Num;
sbit RS=P3^5;
//sbit RW=P1^5;
sbit EN=P3^7;
static int Num;//靜態變量,鍵盤數值
static int Cur=0x89;//光標數值
//////////////////////////////////
void Dis_line(unsigned char *px,unsigned char line);
void Dis_Num(unsigned char Number,unsigned char ddram);
unsigned char code x1_1[13]={12,0xc7,0xeb,0xca,0xe4,0xc8,0xeb,0xc3,0xdc,0xc2,0xeb,0xa3,0xba};//請輸入密碼:
unsigned char code x1_0[17]={16,0xd6,0xc7,0xc4,0xdc,0xbc,0xd2,0xbe,0xd3,0xbf,0xd8,0xd6,0xc6,0xcf,0xb5,0xcd,0xb3};//智能家居控制系統
unsigned char code x1_4[13]={12,0xa1,0xe1,0xa1,0xfc,0xa1,0xfd,0xa3,0xab,0xa3,0xad,0xa1,0xcc};//返回,上,下,+,—,確認(都是符號)
unsigned char code x2_1[13]={12,0xbf,0xcd,0xcc,0xfc,0x20,0x20,0x20,0x20,0x20,0x20,0xa1,0xe6};//客廳____C
unsigned char code x2_2[13]={12,0xb3,0xf8,0xb7,0xbf,0x20,0x20,0x20,0x20,0x20,0x20,0xa1,0xe6};//廚房____C
unsigned char code x2_3[13]={12,0xce,0xd4,0xca,0xd2,0x20,0x20,0x20,0x20,0x20,0x20,0xa1,0xe6};//臥室____C
unsigned char code x2_4[13]={12,0xc9,0xe8,0xd6,0xc3,0xbf,0xaa,0xc6,0xf4,0xca,0xb1,0xbc,0xe4};//設置開啟時間
//send_to_lcd_data_port=display_data;//寫數據到端口 sfr send_to_lcd_data_port = 0x80;//P0
//sfr lcd_Bus=P2;
//延時子程序
void delay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
//寫命令到LCD
void write_com(unsigned char cmd)
{ RS=0;
//RW=0;
EN=1;
// FSB=1;
lcd_Bus=cmd;
EN=0;
delay(5);
}
//寫數據到LCD
void write_data(unsigned char Dispdata)
{ RS=1;
//RW=0;
EN=1;
lcd_Bus=Dispdata;
EN=0;
delay(5);
}
//初始化LCD屏
void lcdinit()
{ delay(200);
write_com(0x30); //選擇基本指令集
delay(10);
write_com(0x30); //選擇8bit數據流
delay(5);
write_com(0x0c); //開顯示(無游標,不反白)
delay(10);
write_com(0x01); //清顯示并設地址指針為00H
delay(200);
write_com(0x06); //指定在資料的讀取及寫入時設定游標的
//移動方向及指定顯示的位移
}
//--------------------------------------------------
//函數名稱:Dis_line
//功能:提供顯示整行漢字
//入口參數:*px -要顯示的字符編碼數組,此數組有特殊的要求,看x數組系列
// line - 起始行地址,因為函數的特殊,故只能是1,2,3,4這四個,表示從第一行~~第四行。
void Dis_line(unsigned char *px,unsigned char line)
{
unsigned char i,n;
// if(line==1) line=0x80; //第1行
// else if(line==2) line=0x90; //第2行
// else if(line==3) line=0x88; //第3行
// else if(line==4) line=0x98; //第4行
n=px[0];
for(i=1;i<n;i++)
{
write_com(line); //定位顯示起始位址
write_data(px[i]); //在字庫中的漢字編碼是16位,故要分兩次寫入,先寫高8位,
i++;
write_data(px[i]); //再寫低8位
line++; //地址加1,寫下一個漢字
}
}
//---------------------------------------------------
//函數名稱:Dis_Num
//功能:在某個指定的位址顯示一個數字(16*16)
//入口參數:Number為要顯示的10進制數字(0~9) ddram -要顯示的字符的位址(0x80~~0x9f)詳細的ddram與顯示的屏幕位址參照ST7920
void Dis_Num(unsigned char Number,unsigned char ddram)
{
write_com(ddram); //定位顯示的漢字的位址
write_data(0xa3);
if(Number==0) Number=0xb0; //0
else if(Number==1) Number=0xb1; //1
else if(Number==2) Number=0xb2; //2
else if(Number==3) Number=0xb3; //3
else if(Number==4) Number=0xb4; //4
else if(Number==5) Number=0xb5; //5
else if(Number==6) Number=0xb6; //6
else if(Number==7) Number=0xb7; //7
else if(Number==8) Number=0xb8; //8
else if(Number==9) Number=0xb9; //9
//else Number=0xb9;
write_data(Number);
Num=Number;
}
///////////////////////////////////////////////////////
void Key_in(void)
{ unsigned int i,Number,Key_Num;
Key_Num=Key_Bus;
Key_Num=(Key_Num&0x3f);
i=Key_Num;
delay(50); //消抖動
Key_Num=Key_Bus;
Key_Num=(Key_Num&0x3f); //如果還相等則有鍵盤輸入
if(Key_Num=i) //有鍵盤輸入
{
if(!(Key_Num&0x01)) Number=1; //1
else if(!(Key_Num&0x02)) Number=2; //2
else if(!(Key_Num&0x04)) Number=3; //3
else if(!(Key_Num&0x08)) Number=4; //4
else if(!(Key_Num&0x10)) Number=5; //5
else if(!(Key_Num&0x20)) Number=6; //6
/*
switch(Key_Num)
{
case 0x80:Number=1;break;
case 0xc0:Number=2;break;
case 0xe0:Number=3;break;
case 0xf0:Number=4;break;
case 0xf8:Number=5;break;
case 0xfc:Number=6;break;
}
*/
Dis_Num(Number,Cur);
if(Cur<0x8f)Cur++;
else Cur=0x88;
}
}
void Key(void)
{
if(Key_Bus!=0xff)
Key_in();
while(Key_Bus!=0xff)
;
}
/**************************************************顯示圖片
//顯示字符串
void hzkdis(unsigned char code *s)
{ while(*s>0)
{ wrire_data(*s);
s++;
delay(50);
}
}
//顯示文本
void ceshi()
{ write_com(0x01);
delay(5);
write_com(0x82);
hzkdis("TOPWAY");
write_com(0x88);
hzkdis("LM3033 測試程序");
}
void Disp_Img(unsigned char code *img)
{ unsigned int j=0;
unsigned char x,y,i;
for(i=0;i<9;i+=8)
for(y=0;y<32;y++)
for(x=0;x<8;x++)
{ write_com(0x36);
write_com(y+0x80);
write_com(x+0x80+i);
write_com(0x30);
write_data(img[j++]);
write_data(img[j++]);
}
}
********************************************************/
//unsigned char code BMP[]={0x00,0x00,......}
void main()
{ lcdinit(); //初始化LCD屏
delay(10);
//////////////////////////////////////////第一頁菜單
while(1)
{
//ceshi(); //顯示文本
//delay(5000);
//write_com(0x01); //清屏:去掉清屏后液晶界面顯示變得穩定
//delay(10);
Dis_line(x1_0,0x80);
//delay(1000);
Dis_line(x1_1,0x91);
//Disp_Img(BMP); //顯示圖畫
//delay(1000);
//write_com(0x01); //清屏
//delay(1000);
Dis_line(x1_4,0x99);
//delay(1000);
//if(Key_Bus!=0xff)
//{Key_in();
Key();
write_com(Cur);// 光標閃爍定位
write_com(0x0f); //
//delay(1000);
// write_data(Num);
delay(5000);
}
////////////////////////////////////////第二頁菜單
/*
while(1)
{
//write_com(0x01); //清屏:去掉清屏后液晶界面顯示變得穩定
Dis_line(x2_1,0x80);//客廳____C
Dis_line(x2_2,0x90);//廚房____C
Dis_line(x2_3,0x88);//臥室____C
Dis_line(x2_4,0x98);//設置開啟時間
Key();
write_data(Num);
write_com(0x9f );// 光標閃爍定位
write_com(0x0f);//
delay(5000);
}
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -