久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機控制HD61202液晶顯示C語言程序

51單片機控制HD61202液晶顯示C語言程序

作者: 時間:2016-11-28 來源:網絡 收藏
//寫漢字液晶程序 液晶屏分為4行/8列漢字,全部使用模擬接口方式。
///////////////////////////////////////////////////////////////////////////////////////////////////
連線圖: /
/LCM---89C52/ /LCM---89C52/ /LCM-------89C52/ /LCM----------89C52/ /
/DB0---P1.0/ /DB4---P1.4/ /D/I-------P2.3/ /CS1----------P2.0/ /
/DB1---P1.1/ /DB5---P1.5/ /R/W-------P2.2/ /CS2----------P2.1/ /
/DB2---P1.2/ /DB6---P1.6/ /E---------P2.4/ /EL-E---------P3.4/ /
/DB3---P1.3/ /DB7---P1.7/ /RST-------VCC /EL-D---------VCC /
注:89C52的晶振頻率為12MHz /
////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include
#define Uchar unsigned char
#define _Nop() _nop_() //定義空指令//
/////////////////全局變量定義///////////////////
Uchar col,row,cbyte,keyd,t,Signal; //列y,行(頁)x,輸出數據;keyd為鍵值;t為數組下標;Signal為觸發傳感器的編號 //
Uchar buf[10]; //保存,顯示數據緩沖區//
////////////液晶顯示器接口引腳定義////////////////
sbit EL_E= P3^4; //背景光控制腳
sbit Elcm= P2^4; //
sbit CS1LCM= P2^0; //
sbit CS2LCM= P2^1; //
sbit Dilcm= P2^3; //
sbit Rwlcm= P2^2; //
sfr Datalcm= 0x90; //數據口.即P1口地址
sbit PL= P3^5; //接74HC164的PL腳,并行數據鎖入使能,低電平有效
////////////常用操作命令和參數定義////////////////
#define DISPON 0x3f //顯示on //
#define DISPOFF 0x3e //顯示off //
#define DISPFIRST 0xc0 //顯示起始行定義 //
#define SETX 0xb8 //X定位設定指令(頁) //
#define SETY 0x40 //Y定位設定指令(列) //
#define Lcdbusy 0x80 //LCM忙判斷位 //
///////////////顯示分區邊界位置//////////////////
#define MODL 0x00 //左區 //
#define MODM 0x40 //左區和右區分界 //
#define LCMLIMIT 0x80 //顯示區的右邊界 //
//////////////////函數列表///////////////////////
void InputNo(void);
void ShowPage(void);
void input(void);
void LookOver(void);
void Drawing(void);
void Save(void);
void ProcessSgl(void);
///////////////////數組列表//////////////////////
Uchar code Ezk[]; //ASCII常規字符點陣碼表 //
Uchar code Hzk[]; //自用漢字點陣碼表 //
Uchar code KJHM[]; //開機畫面點陣碼表 //
//////////////////////////////////
//定義字符串數組 //
//////////////////////////////////
Uchar code BH[]={0x80,0x81,0x23,0x25,0x25};
Uchar code JL[]={0x82,0x83,0x23,0x25,0x25,0x25,0x25,0x8b,0x8c}; //9個字節
Uchar code FW[]={0x84,0x85,0x23,0x25,0x25,0x25,0x25,0x86,0x85};
Uchar code BC[]={0x89,0x8a,0x9e,0x9f,0xa1,0x22}; //保存??//
Uchar code LX[]={0x87,0x88,0x23};
Uchar code ZD[]={0x8d,0x8e,0x93};
Uchar code HZ[]={0x8f,0x90,0x93};
Uchar code ZS[]={0x91,0x92,0x93};
Uchar code XD[]={0x94,0x95,0x96,0x97};
Uchar code YJ[]={0x98,0x99};
Uchar code SR[]={0xa0,0x9a,0x9b,0x9e,0x9f};
Uchar code CK[]={0x9a,0x9b,0x80,0x81,0x9c,0x9d,0x9e,0x9f};
//狀態標志//
bit ack; //應答標志位//
///////////////////////////液晶子程序//////////////////////////////
//公用busy等待//
void wtcom(void)
{
Dilcm = 0; //CLR DI 命令操作 //
Rwlcm = 1; //SETB RW 讀操作 //
Datalcm = 0xFF; //用作輸入時,口鎖存器必須先寫1 //
Elcm = 1;_nop_();
while(Datalcm & Lcdbusy);
Elcm = 0;
}
//////////////////////////////////////////////////////////
// 分區操作允許等待,返回時保留分區選擇狀態 //
//////////////////////////////////////////////////////////
void lcdbusyL(void)
{
CS1LCM = 1; //CLR CS1 //
CS2LCM = 0; //SETB CS2 //
wtcom(); // waitting for enable //
}
void lcdbusyR(void)
{
CS1LCM = 0; //SETB CS1 //
CS2LCM = 1; //SETB CS2 //
wtcom(); // waitting for enable //
}
//////////////////////////////////
// 命令輸出到左區控制口 //
//////////////////////////////////
void WrcmdL(Uchar X)
{
lcdbusyL(); //確定分區,返回時保留分區狀態不變//
Dilcm = 0; //命令操作 //
Rwlcm = 0; //寫輸出 //
Datalcm = X; //數據輸出到數據口 //
Elcm = 1;_nop_();Elcm = 0; //下降沿,寫入到LCM//
}
//////////////////////////////////
// 命令輸出到右區控制口 //
//////////////////////////////////
void WrcmdR(Uchar X)
{
lcdbusyR(); //確定分區,返回時保留分區狀態不變 //
Dilcm = 0; //命令操作 //
Rwlcm = 0; //寫輸出 //
Datalcm = X; //命令輸出到數據口 //
Elcm = 1;_nop_();Elcm = 0; //讀入到LCM//
}
//////////////////////////////////////////////////////////
//根據設定的坐標數據,定位LCM上的下一個操作單元位置 //
//////////////////////////////////////////////////////////
void Locatexy(void)
{
unsigned char x,y;
y = col&0x3F|SETY; // col.and.0x3f.or.setx //
x = row&0x07|SETX; // row.and.0x07.or.sety //
switch (col&0xc0) // col.and.0xC0 //
{ //條件分支執行 //
case 0: {WrcmdL(y);
WrcmdL(x);
break;} //左區 //
case 0x40:{WrcmdR(y);
WrcmdR(x);
break;} //右區 //
}
}

上一頁 1 2 下一頁

評論


技術專區

關閉