單片機STC89C52RC芯片
? ? ? ?STC89C52RC單片機是宏晶公司生產(chǎn)的像鸡,它具有高速度辫塌、低功耗漏策、超強抗干擾等特點,指令代碼完全兼容傳統(tǒng)8051單片機臼氨,12時鐘/機器周期和6時鐘/機器周期可以任意選擇掺喻。內(nèi)部集成MAX810專用復位電路。STC89C52RC單片機的封裝其封裝號是(PDIP):
LCD12864液晶及其接口的簡介
LCD12864液晶實物圖:
? ? ? ? 液晶顯示模塊具有體積小、功耗低感耙、顯示內(nèi)容豐富褂乍,操作簡單等特點。本LCD12864液晶使用ST7920控制器即硼,5V電壓驅(qū)動逃片,帶背光,內(nèi)置8192的16×16點陣只酥、128個字符(8×16點陣)及64×256點陣顯示RAM(GDRAM)褥实。與外部CPU接口采用并行或串行兩種控制方式。
LCD12864液晶接口信號說明如表1所示:
液晶顯示原理
? ? ? ?并行基本操作時序:
? ? ? ?讀狀態(tài) 輸入:RS=L,RW=H, E=H? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸出:D0-D7=狀態(tài)字裂允。
? ? ? ?讀數(shù)據(jù) 輸入:RS=H,RW=H, E=H? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸出:無损离。
? ? ? ?寫指令 輸入:RS=L,RW=L, D0-D7=指令碼,E=高脈沖? ? ? ? ? ? ? ? 輸出:D0-D7=數(shù)據(jù)绝编。
? ? ? ?寫數(shù)據(jù) 輸入:RS=H,RW=L, D0-D7=數(shù)據(jù)僻澎,? E=高脈沖? ? ? ? ? ? ? ? ?輸出:無。
? ? ? ?漢字顯示坐標(見表2)
?LCD12864液晶與單片機電路
? ? ? ?LCD12864液晶與單片機接口如圖3所示十饥。液晶1窟勃,2腳為電源端;19逗堵,20腳為背光電源拳恋,在19腳上要串聯(lián)一個10歐的電阻起到限流作用,用來保護和防止電壓過大而燒壞背光燈砸捏;液晶第3腳用來調(diào)節(jié)液晶顯示的比度,這里通過一個10千歐電位器接地來實現(xiàn)對比度的調(diào)節(jié)隙赁;液晶第4腳RS為向液晶控制器寫數(shù)據(jù)/寫命令選擇端垦藏,與單片機的P2.5引腳相連;液晶第5腳R/W為寫數(shù)據(jù)/寫命令選擇端伞访,高電平時為寫數(shù)據(jù)端掂骏、低電平時寫指令端,與單片機的P2.6相連厚掷;6腳EN連接單片機P2.7口弟灼;液晶的數(shù)據(jù)接口7腳至14腳和單片機P0口連接;液晶17腳接VCC高電平取消復位冒黑;液晶15腳引出J24端口通過接高低電平來選擇并串形式田绑。
液晶顯示程序代碼分析
/*******************************************************************/
/* ?main主函數(shù) ????????????????????????????????????????????????????????*/
/*******************************************************************/
#include
#include
#define uchar unsigned char
#define uint ?unsigned int
/************* LCD12864引腳定義 *************/
#define LCD_data ?P0 ??????//數(shù)據(jù)口
sbit LCD_RS ?= ?P2^5; ?????//寄存器選擇輸入
sbit LCD_RW ?= ?P2^6; ?????//液晶讀/寫控制
sbit LCD_EN ?= ?P2^7; ?????//液晶使能控制
/*******************************************************************/
/* ?LCD12864液晶顯示控制函數(shù) ??????????????????????????????????????*/
/*******************************************************************/
void lcd_delay_1ms(uint x) ??// ?LCD12864液晶延時函數(shù)
{
???uint i,j;
???for(j=0;j
?for(i=0;i<110;i++);
}
void lcd_wcmd(uchar cmd) /*寫指令數(shù)據(jù)到LCD ?RS=L,RW=L抡爹,E=高脈沖掩驱,D0-D7=指令碼。*/
{ ?????????????????????????
LCD_RS = 0; ????????//指令開啟
LCD_RW = 0; ???????//寫指令
????LCD_EN = 0;
????P0 = cmd;
lcd_delay_1ms(5);
LCD_EN = 1; ???????//高脈沖
lcd_delay_1ms(5);
????LCD_EN = 0; ?
} ????????????????????????????????????????????????
void lcd_wdat(uchar dat) ?/*寫顯示數(shù)據(jù)到LCD *RS=H,RW=L欧穴,E=高脈沖民逼,D0-D7=數(shù)據(jù)。*/
{ ?????????????????????????
LCD_RS = 1; ??????//數(shù)據(jù)開啟
LCD_RW = 0; ?????//寫數(shù)據(jù)
????LCD_EN = 0; ?????
????P0 = dat;
????lcd_delay_1ms(5);
LCD_EN = 1; ?????//高脈沖
????lcd_delay_1ms(5);
????LCD_EN = 0; ?????
}
void lcd_init() ??/*LCD初始化設定*/
{
lcd_wcmd(0x30); ?????//基本指令操作
????lcd_delay_1ms(1);
lcd_wcmd(0x0C); ?????//顯示開涮帘,關(guān)光標
????lcd_delay_1ms(1);
lcd_wcmd(0x01); ?????//清除LCD的顯示內(nèi)容
????lcd_delay_1ms(1);
}
void lcd_pos(uchar X,uchar Y) /*設定顯示位置拼苍,X表示行,Y表示列*/
{
???uchar ?pos;
???if (X==0)
{X=0x80;} ?????//液晶第1行
???else if (X==1)
{X=0x90;} ?????//液晶第2行
???else if (X==2)
{X=0x88;} ?????//液晶第3行
???else if (X==3)
{X=0x98;} ?????//液晶第4行
???pos = X+Y ;
lcd_wcmd(pos); ????//顯示地址
}
/*******************************************************************/
/*顯示函數(shù) ??????????????????????????????????????????????????????*/
/*******************************************************************/
????????void hzkdis(unsigned char code *s)
{
????while(*s > 0)
????{
lcd_wdat(*s); ?????//顯示字符
????????s++;
????}
}
/*******************************************************************/
/* ????????????????????????????????????????????????????????????????*/
/* ?LCD12864液晶函數(shù)聲明 ??????????????????????????????????????????*/
/* ????????????????????????????????????????????????????????????????*/
/*******************************************************************/
void lcd_pos(uchar X,uchar Y);
void lcd_wdat(uchar dat);
void lcd_init();
void hzkdis(unsigned char code *s); ?????//顯示字符串
void Test1(); ???????????????????????????//顯示子函數(shù)
void Test2(uint x); ???????????????????????//顯示子函數(shù)
void xianshi(unsigned char code *s);
/*******************************************************************/
/*系統(tǒng)字符顯示庫 ????????????????????????????????????????????????*/
/*******************************************************************/
uchar code dis2[] = {"LCD12864液晶顯示"};
uchar code dis3[] = {"007行動"};
uchar code dis4[] = {"沈淵|007-8109|踐行"};
uchar code dis5[] = {"2018年7月14日"};
/*******************************************************************/
/* ?1ms延時函數(shù) ???????????????????????????????????????????????????*/
/*******************************************************************/
void delay_1ms(uint x)
{
???uint i,j;
???for(j=0;j
?????for(i=0;i<110;i++);
}
/*******************************************************************/
void main()
{
IE = 0x81; ????????????????//允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x01; ??????????????//觸發(fā)方式為脈沖負邊沿觸發(fā)
IRIN=1; ???????????????????//I/O口初始化
delay_1ms(10); ????????????//上電调缨,等待穩(wěn)定
lcd_init(); ???????????????//初始化LCD
Test1(); ??????????????????//初始文字顯示
}