?? hd61202.c
字號(hào):
/*寫漢字液晶程序 液晶屏分為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<reg52.h>
#include<intrins.h>
#define Uchar unsigned char
#define _Nop() _nop_() /*定義空指令*/
/****************全局變量定義******************/
Uchar col,row,cbyte,keyd,t,Signal; /*列y,行(頁)x,輸出數(shù)據(jù);keyd為鍵值;t為數(shù)組下標(biāo);Signal為觸發(fā)傳感器的編號(hào) */
Uchar buf[10]; /*保存,顯示數(shù)據(jù)緩沖區(qū)*/
/***********液晶顯示器接口引腳定義***************/
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; //數(shù)據(jù)口.即P1口地址
sbit PL= P3^5; //接74HC164的PL腳,并行數(shù)據(jù)鎖入使能,低電平有效
/***********常用操作命令和參數(shù)定義***************/
#define DISPON 0x3f /*顯示on */
#define DISPOFF 0x3e /*顯示off */
#define DISPFIRST 0xc0 /*顯示起始行定義 */
#define SETX 0xb8 /*X定位設(shè)定指令(頁) */
#define SETY 0x40 /*Y定位設(shè)定指令(列) */
#define Lcdbusy 0x80 /*LCM忙判斷位 */
/**************顯示分區(qū)邊界位置*****************/
#define MODL 0x00 /*左區(qū) */
#define MODM 0x40 /*左區(qū)和右區(qū)分界 */
#define LCMLIMIT 0x80 /*顯示區(qū)的右邊界 */
/*****************函數(shù)列表**********************/
void InputNo(void);
void ShowPage(void);
void input(void);
void LookOver(void);
void Drawing(void);
void Save(void);
void ProcessSgl(void);
/******************數(shù)組列表*********************/
Uchar code Ezk[]; /*ASCII常規(guī)字符點(diǎn)陣碼表 */
Uchar code Hzk[]; /*自用漢字點(diǎn)陣碼表 */
Uchar code KJHM[]; /*開機(jī)畫面點(diǎn)陣碼表 */
/********************************/
//定義字符串?dāng)?shù)組 */
/********************************/
Uchar code BH[]={0x80,0x81,0x23,0x25,0x25};
Uchar code JL[]={0x82,0x83,0x23,0x25,0x25,0x25,0x25,0x8b,0x8c}; //9個(gè)字節(jié)
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};
/*狀態(tài)標(biāo)志*/
bit ack; /*應(yīng)答標(biāo)志位*/
/**************************液晶子程序*****************************/
/*公用busy等待*/
void wtcom(void)
{
Dilcm = 0; /*CLR DI 命令操作 */
Rwlcm = 1; /*SETB RW 讀操作 */
Datalcm = 0xFF; /*用作輸入時(shí),口鎖存器必須先寫1 */
Elcm = 1;_nop_();
while(Datalcm & Lcdbusy);
Elcm = 0;
}
/********************************************************/
/* 分區(qū)操作允許等待,返回時(shí)保留分區(qū)選擇狀態(tài) */
/********************************************************/
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 */
}
/********************************/
/* 命令輸出到左區(qū)控制口 */
/********************************/
void WrcmdL(Uchar X)
{
lcdbusyL(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*寫輸出 */
Datalcm = X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
Elcm = 1;_nop_();Elcm = 0; /*下降沿,寫入到LCM*/
}
/********************************/
/* 命令輸出到右區(qū)控制口 */
/********************************/
void WrcmdR(Uchar X)
{
lcdbusyR(); /*確定分區(qū),返回時(shí)保留分區(qū)狀態(tài)不變 */
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*寫輸出 */
Datalcm = X; /*命令輸出到數(shù)據(jù)口 */
Elcm = 1;_nop_();Elcm = 0; /*讀入到LCM*/
}
/********************************************************/
/*根據(jù)設(shè)定的坐標(biāo)數(shù)據(jù),定位LCM上的下一個(gè)操作單元位置 */
/********************************************************/
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 */
{ /*條件分支執(zhí)行 */
case 0: {WrcmdL(y);
WrcmdL(x);
break;} /*左區(qū) */
case 0x40:{WrcmdR(y);
WrcmdR(x);
break;} /*右區(qū) */
}
}
/********************************************/
/* 從液晶片上讀數(shù)據(jù),保留在全局變量cbyte中 */
/********************************************/
void Rddata(void)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
Datalcm=0xFF;
wtcom(); /* waitting for enable */
Dilcm = 1; /*數(shù)據(jù)*/
Rwlcm = 1; /*讀數(shù)據(jù)*/
Elcm = 1; /*讀入到LCM*/
_nop_();
cbyte = Datalcm; /*虛讀一次 */
Elcm = 0;
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
Datalcm=0xFF;
wtcom(); /* waitting for enable */
Dilcm = 1; /*數(shù)據(jù)*/
Rwlcm = 1; /*讀數(shù)據(jù)*/
Elcm = 1; /*讀入到LCM*/
_nop_();
cbyte = Datalcm; /*從數(shù)據(jù)口讀數(shù)據(jù),真讀 */
Elcm = 0;
}
/****************************************/
/* 數(shù)據(jù)寫入 */
/****************************************/
void Wrdata(Uchar X)
{
Locatexy(); /*坐標(biāo)定位,返回時(shí)保留分區(qū)狀態(tài)不變 */
wtcom();
Dilcm = 1; /*數(shù)據(jù)輸出*/
Rwlcm = 0; /*寫輸出 */
Datalcm = X; /*數(shù)據(jù)輸出到數(shù)據(jù)口 */
Elcm = 1; /*讀入到LCM*/
_nop_();
Elcm = 0;
}
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{
cbyte = DISPOFF; /*關(guān)閉顯示屏 */
WrcmdL(cbyte);
WrcmdR(cbyte);
cbyte = DISPON; /*打開顯示屏 */
WrcmdL(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST; /*定義顯示起始行為零 */
WrcmdL(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0; /*清屏 */
row=0;
Locatexy();
}
/********************************/
/* 延時(shí) */
/********************************/
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/*******************************************************/
/* 半角字符(西文字符庫)點(diǎn)陣碼數(shù)據(jù)輸出16*16 */
/*******************************************************/
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定義4個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為UCHAR */
bakerx = row; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = col;
x=Order * 0x10; /*半角字符,每個(gè)字符16字節(jié) */
/*上半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼,rom數(shù)組 */
Wrdata(cbyte); /*寫輸出一字節(jié) */
x++;
col++;
} /*上半個(gè)字符輸出結(jié)束 */
col = bakery; /*列對(duì)齊 */
row = bakerx+1; /*指向下半個(gè)字符行 */
/*下半個(gè)字符輸出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取點(diǎn)陣碼 */
Wrdata(cbyte); /*寫輸出一字節(jié) */
x++;
col++;
} /*下半個(gè)字符輸出結(jié)束 */
row=bakerx;
} /*整個(gè)字符輸出結(jié)束 */
/**************************************************/
/* 全角字符(漢字庫)點(diǎn)陣碼數(shù)據(jù)輸出16*32 */
/**************************************************/
void Putcdot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定義3個(gè)局部變量 */
int x; /*偏移量,字符量少的可以定義為UCHAR */
bakerx = row; /*暫存x,y坐標(biāo),已備下半個(gè)字符使用 */
bakery = col;
x=Order * 0x20; /*每個(gè)字符32字節(jié) */
/*上半個(gè)字符輸出,16列 */
for(i=0;i<16;i++)
{
Wrdata(Hzk[x]); /*寫輸出一字節(jié) */
x++;
col++;
} /*上半個(gè)字符輸出結(jié)束 */
/*下半個(gè)字符輸出,16列 */
col = bakery;
row = bakerx+1;
for(i=0;i<16;i++) /*下半部分*/
{
Wrdata(Hzk[x]);
x++;
col++;
} /*下半個(gè)字符輸出結(jié)束 */
row = bakerx;
} /*整個(gè)字符輸出結(jié)束 */
/**************************************************************************/
/* 一個(gè)字串的輸出.第一個(gè)參數(shù)為一個(gè)字符串,第二個(gè)參數(shù)為此字符串的字節(jié)數(shù) */
/**************************************************************************/
void Putstr(Uchar *puts,Uchar i)
{
Uchar j,X;
for (j=0;j<i;j++)
{
X = puts[j];
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位*/
}
else Putedot(X-0x20); /*ascii碼表從0x20開始*/
if (col==LCMLIMIT){col=0;row+=2;}; /*下一列,如果列越界換行*/
if (row>6) row=0; /*如果行越界,返回首行 */
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -