#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define DATA P1 //LCD12864數(shù)據(jù)線
sbit RS=P2^2; // 數(shù)據(jù)\指令 選擇
sbit RW=P2^1; // 讀\寫 選擇
sbit EN=P2^0; // 讀\寫使能
sbit cs1=P2^4; // 片選1
sbit cs2=P2^3; // 片選2
/**********定義中文字庫************/
//字體取模時的選項設(shè)置為:點陣格式為陰碼,取模方式為列行式,取模走向為逆向,文字大小為寬x高=16x16
uchar code Hzk[]={
0x20,0x10,0x4C,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x04,0x04,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00,/*氣*/
0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,0xFA,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
0x80,0x60,0x1F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x00,/*壓*/
0x04,0x04,0x04,0x04,0xF4,0x94,0x95,0x96,0x94,0x94,0xF4,0x04,0x04,0x04,0x04,0x00,
0x00,0xFE,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x82,0xFE,0x00,0x00,/*高*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*度*/
0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*溫*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*度*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*:*/
0x00,0x00,0x00,0xF8,0xF8,0x78,0x08,0x08,0xE8,0xE8,0xAC,0x8C,0x8C,0x00,0x00,0x00,
0x60,0x70,0x3C,0x3F,0x37,0x10,0x11,0x11,0x1F,0x1F,0x13,0x16,0x16,0x10,0x10,0x00,
};
/*狀態(tài)檢查,LCD是否忙*/
void CheckState()
{
uchar dat;//狀態(tài)信息(判斷是否忙)
RS=0; // 數(shù)據(jù)\指令選擇,D/I(RS)="L" ,表示 DB7∽DB0 為顯示指令數(shù)據(jù)
RW=1; //R/W="H" ,E="H"數(shù)據(jù)被讀到DB7∽DB0
do{
DATA=0x00;
EN=1; //EN下降源
_nop_(); //一個短延時
dat=DATA;
EN=0;
dat=0x80 & dat; //僅當?shù)?位為0時才可操作(判別busy信號)
}while(!(dat==0x00));
}
/*寫命令到LCD中*/
SendCommandToLCD(uchar com)
{
CheckState();//狀態(tài)檢查,LCD是否忙
RS=0; //向LCD發(fā)送命令。RS=0寫指令,RS=1寫數(shù)據(jù)
RW=0;//R/W="L" ,E="H→L"數(shù)據(jù)被寫到 IR 或 DR
DATA=com; //com :命令
EN=1;
_nop_();
_nop_();
EN=0; //EN下降源
}
/*設(shè)置頁 0xb8是頁的首地址*/
void SetLine(uchar page)
{
page=0xb8|page; //1011 1xxx 0<=page<=7 設(shè)定頁地址--X 0-7,8行為一頁64/8=8,共8頁
SendCommandToLCD(page);
}
/*設(shè)定顯示開始行,0xc0是行的首地址*/
void SetStartLine(uchar startline)
{
startline=0xc0|startline; //1100 0000
SendCommandToLCD(startline); //設(shè)置從哪行開始:0--63,一般從0 行開始顯示
}
/*設(shè)定列地址--Y 0-63 ,0x40是列的首地址*/
void SetColumn(uchar column)
{
column=column &0x3f; //column最大值為64,越出 0=<column<=63
column= 0x40|column; //01xx xxxx
SendCommandToLCD(column);
}
/*開關(guān)顯示,0x3f是開顯示,0x3e是關(guān)顯示*/
void SetOnOff(uchar onoff)
{
onoff=0x3e|onoff; //0011 111x,onoff只能為0或者1
SendCommandToLCD(onoff);
}
/*寫顯示數(shù)據(jù) */
void WriteByte(uchar dat)
{
CheckState();//狀態(tài)檢查,LCD是否忙
RS=1; //RS=0寫指令,RS=1寫數(shù)據(jù)
RW=0;////R/W="L" ,E="H→L"數(shù)據(jù)被寫到 IR 或 DR
DATA=dat;//dat:顯示數(shù)據(jù)
EN=1;
_nop_();
_nop_();
EN=0;//EN下降源
}
/*選擇屏幕screen: 0-全屏,1-左屏,2-右屏*/
void SelectScreen(uchar screen)
{
switch(screen)
{ case 0: cs1=0;//全屏顯示
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左顯示屏
_nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右顯示屏
_nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_();
break;
}
}
/*清屏screen: 0-全屏,1-左屏,2-右*/
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<16;i++) //控制頁數(shù)0-7,共8頁
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++) //控制列數(shù)0-63,共64列
{
WriteByte(0x00); //寫點內(nèi)容,列地址自動加1
}
}
}
/*延時程序*/
void delay(uint z)
{
uint i,j;
for(i=0; i<z; i++)
for(j = 0; j < 110; j++);
}
/*初始化LCD*/
void InitLCD()
{
CheckState();
SelectScreen(0);
SetOnOff(0); //關(guān)顯示
SelectScreen(0);
SetOnOff(1); //開顯示
SelectScreen(0);
ClearScreen(0);//清屏
SetStartLine(0); //開始行:0
}
/*顯示全角漢字*/
void Display(uchar ss,uchar page,uchar column,uchar number)
{
int i;
//選屏參數(shù),pagr選頁參數(shù),column選列參數(shù),number選第幾漢字輸出
SelectScreen(ss);
column=column&0x3f;
SetLine(page); //寫上半頁
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
{
WriteByte(Hzk[i+32*number]); //i+32*number漢字的前16個數(shù)據(jù)輸出
}
SetLine(page+1); //寫下半頁
SetColumn(column); //控制列
for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出
{
WriteByte(Hzk[i+32*number+16]); //i+32*number+16漢字的后16個數(shù)據(jù)輸出
}
}
/*主函數(shù)*/
void main()
{
uint i;
InitLCD();//初始12864
ClearScreen(0);//清屏
while(1)
{
Display(1,0,0*16,0);//顯示第一個字
Display(1,0,1*16,1);//顯示第一個字
Display(2,0,0*16,2);//顯示第一個字
Display(2,0,1*16,3);//顯示第一個字
SelectScreen(0);//選擇全屏顯示
delay(50); //延時
}
}
|