一、LCD12864液晶的工作原理
液晶顯示屏中的業態光電顯示材料,利用液晶的電光效應把電信號轉換成數字符、圖像等可見信號。
如圖1-1,液晶正常情況下,其分子排列很有秩序,顯得清澈透明,一旦加上直流電場后,分子的排列被打亂,一部分液晶變的不透明,顏色加深因而能顯示數字和圖像。管腳一共1個CS1左半屏片選端,CS2右半屏片選端;V0液晶顯示驅動電壓,通過一個電位器接到VCC;RS數據指令選擇信號,H為數據,L為指令,也叫D/I;R/W讀寫選擇信號,H為讀,L為寫,。E為LCD使能端,R/W為L時,E信號下降沿鎖存 DB7-DB0;R/W為H時,E為H,DDRAM數據讀到DB7-DB0。DB0-DB7數據傳輸端口。RST復位信號。-VOUT 和V0為液晶顯示驅動電壓。 12864是一種圖形點陣液晶顯示器,它主要由行驅動器/列驅動器及128×64 全點陣液晶顯示器組成。可完成圖形顯示,也可以顯示8×4個(16×16點陣)漢字。?
圖1-1 12864LCD液晶顯示屏
二、方案設計
2.1 實物硬件設計
單片機控制液晶顯示屏系統總共可分為六個環節,分別是單片機控制系統、12864字符顯示模塊、控制開關模塊、晶振控制模塊、復位電路模塊和DS1302時鐘控制模塊。通過這六個模塊的協調工作就可以完成相應的液晶屏控制和顯示功能。這六個模塊的相互連接如圖2-1:
圖2-1 硬件組成框圖
2.2 系統硬件設計
本硬件電路主要由四大模塊組成:主芯片模塊;晶振和復位電路模塊;控制接鈕模塊;顯示電路
模塊。
2.2.1 主芯片模塊
主芯片模塊即單片機模塊,XTAL1:接外部晶振和微調電容的一端。在片內,它是振蕩電路反相放大器的輸入端。XTAL2:接外部晶振和微調是容的一端。RST:AT89C51的復位信號輸入引腳,高電平有效。當此輸入端保持兩個機器周期的高電平時,就可以完成復位操作。ALE:允許地址鎖存信號端。EA:該引腳為低電平時,則讀取外部的程序代碼來執行程序。P0、P1、P2、P3:8位并行輸入輸出口。每個端口都是8位準雙向口,共占32只引腳。每一條都能獨立地用作輸入或輸出。每個端口都包括一個鎖存器、一個輸出驅器和輸入緩沖器。作輸出時,數據可以鎖存;作輸入時,數據可以緩沖。圖如圖3—1。
圖3-1 單片機引腳圖
2.2.2 晶振和復位模塊
89C51芯片內部有一個高增益反相放大器,用于構成振蕩器。如圖3—2,反相放大器的輸入端為XTAL1,輸出端XTAL2,兩個跨接石英晶體及兩個電容就可以構成穩定的自激振蕩器。XTAL1 是片內振蕩器的反相放大器輸入端,XTAL2 則是輸出端,使用外部振蕩器時,外部振蕩信號應直接加到XTAL1,而XTAL2 懸空。一個晶體振蕩器,接在單片機內部的振蕩電路上,兩個電容是起振電容,頻率越高,應該越小。
圖4-1 晶振模塊
在振蕩器運行時,有兩個機器周期(24 個振蕩周期)以上的高電平出現在此引腳時,將使單片機復位,只要這個腳保持高電平,51 芯片便循環復位。復位后P0-P3 口均置1 引腳表現為高電平,程序計數器和特殊功能寄存器SFR 全部清零。當復位腳由高電平變為低電平時,芯片為ROM 的00H 處開始運行程序。如上圖5-1所示復位電路,由于復位時高電平有效,當剛接上電源的瞬間,電容C1兩端相當于短路,即相當于給RESET引腳一個高電平,等充電結束時(這個時間很短暫),電容相當于斷開,這時已經完成了復位動作。
圖5-1 復位模塊
2.2.3 按鈕模塊
本模塊采用四個按鈕進行控制,通過串行口輸入輸出連接,當K1按鍵波動一次后,方可進行年、月、日、星期、時、分的改變,當循環滿時,按下K0可實現對鬧鐘的改變。按鍵K2、K3分別實現加一減一的操作。
圖6-1 按鈕模塊
2.3 系統軟件設計
2.3.1 主程序設計
圖7-1 主程序流程圖
圖8-1 LCD顯示程序和初始化子程序流程圖
三、仿真和分析
將程序下載到單片機開發板上,LCD12864顯示如下圖,第一行為漢字“數字電子鐘”,第二行為時分秒,第三行為年月日以及星期,第四行為鬧鐘,通過按鍵可實現時間的調整,也可實現整點報時和鬧鐘。符合設計要求。
圖9-1 實物仿真圖
程序:
#include《reg52.h》
{ uchar i,j; for(i=xms;i》0;i--)
for(j=110;j》0;j--);
}
void warn(uchar xn)//“嘟”xn次函數 { uint nn;
for(nn=0;nn《xn;nn++) { uint n;
for(n=2000;n》0;n--) { beep=1; delayms(1); beep=0; delayms(2);
}
for(n=1000;n》0;n--) { beep=1;
delayms(3);
}
}
}
void warn3s()//3s報警函數 { uint n;
for(n=3000;n》0;n--) { beep=0; delayms(2); beep=1; delayms(1);
}
}
void write_com(uchar com)//12864寫指令函數 { rs=0; rw=0; en=0; P2=com; delayms(5); en=1; delayms(5); en=0; }
void write_data(uchar date)//12864數據指令函數 { rs=1; rw=0; en=0; P2=date; delayms(5); en=1; delayms(5); en=0;
}
{ X=0x88;
} if(X==3) { X=0x98; } pos=X+Y; write_com(pos);
}
void write_sfm(int add,uint date)//時鐘數值函數 { uchar shi,ge; shi=date/10; ge=date%10; lcd_pos(1,0+add); write_data(0x30+shi); write_data(0x30+ge);
}
void write_sfm1(int add1,uint date1)//年月日數值函數 { uchar shi,ge;
shi=date1/10;
void lcd_pos(uchar X,uchar Y)//12864顯示位置函數 { uchar pos; if(X==0) { X=0x80; } if(X==1) { X=0x90; }
if(X==2)
{ X=0x88;
} if(X==3) { X=0x98; } pos=X+Y; write_com(pos);
}
void write_sfm(int add,uint date)//時鐘數值函數 { uchar shi,ge; shi=date/10; ge=date%10; lcd_pos(1,0+add); write_data(0x30+shi); write_data(0x30+ge);
}
void write_sfm1(int add1,uint date1)//年月日數值函數 { uchar shi,ge;
shi=date1/10;
ge=date1%10; lcd_pos(2,0+add1); write_data(0x30+shi); write_data(0x30+ge);
}
void write_sfm2(int add2,uint date2)//鬧鐘數值函數 { uchar shi,ge; shi=date2/10; ge=date2%10; lcd_pos(3,0+add2); write_data(0x30+shi); write_data(0x30+ge);
}
{ TR0=0;
write_com(0x0f); lcd_pos(3,2);
}
}
if(kk==2) { lcd_pos(3,4);
} if(kk==3) { lcd_pos(3,6); } if(kk==4) { kk=0; TR0=1;
write_com(0x0c);
}
}
if(k1==0)//調試按鍵操作 { delayms(5);
if(k1==0)
void keyscan()//按鍵掃描函數 { if(k0==0)//鬧鐘按鍵操作 { delayms(5); if(k0==0) { while(!k0); kk++;
if(kk==1)
{ k++; while(!k1); if(k==1) { TR0=0;
write_com(0x0f); lcd_pos(1,4);
}
} if(k==2) { lcd_pos(1,2); } if(k==3) { lcd_pos(1,0); } if(k==4) { lcd_pos(2,4); } if(k==5) {
lcd_pos(2,2);
} if(k==6) { lcd_pos(2,0);
} if(k==7) { lcd_pos(2,7); } if(k==8) { k=0;
write_com(0x0c);
TR0=1;
}
}
if(k!=0) { if(k2==0)//“+1”按鍵操作 { delayms(5); if(k2==0) { while(!k2);
if(k==1)
{ miao++; if(miao==60)
miao=0;
write_sfm(4,miao);
lcd_pos(1,4); // write_sfm(4,miao);
} if(k==2) { fen++; if(fen==60)
fen=0; write_sfm(2,fen);
lcd_pos(1,2); // write_sfm(2,fen);
} if(k==3) { shi++; if(shi==24)
shi=0; write_sfm(0,shi);
lcd_pos(1,0); //
write_sfm(0,shi);
} if(k==4) { ri++; if(ri==32)
ri=1;
write_sfm1(4,ri);
lcd_pos(2,4); // write_sfm1(4,ri);
} if(k==5) { yue++; if(yue==13)
yue=1; write_sfm1(2,yue);
lcd_pos(2,2); // write_sfm1(2,yue);
} if(k==6) { nian++; if(nian==50)
nian=0;
write_sfm1(0,nian);
lcd_pos(2,0); // write_sfm1(0,nian);
}
if(k==7) { zhou++; if(zhou==8)
zhou=0;
write_sfm1(7,zhou);
lcd_pos(2,7); // write_sfm1(7,zhou);
}
}
}
if(k3==0)//“-1按鍵操作” { delayms(5); if(k3==0) { while(!k3); if(k==1) { miao--; if(miao==-1)
miao=59;
write_sfm(4,miao);
lcd_pos(1,4); // write_sfm(4,miao);
}
if(k==2) { fen--; if(fen==-1)
fen=59;
write_sfm(2,fen);
lcd_pos(1,2); // write_sfm(2,fen);
} if(k==3) { shi--; if(shi==-1)
shi=23; write_sfm(0,shi);
lcd_pos(1,0); // write_sfm(0,shi);
} if(k==4) {
ri--;
if(ri==-1)
ri=31;
write_sfm1(4,ri);
lcd_pos(2,4); // write_sfm1(4,ri);
}
if(k==5) { yue--; if(yue==-1)
yue=12;
write_sfm1(2,yue);
lcd_pos(2,2); // write_sfm1(2,yue);
} if(k==6) { nian--; if(nian==-1)
nian=50; write_sfm1(0,nian);
lcd_pos(2,0); // write_sfm1(0,nian);
}
if(k==7)
{ zhou--; if(zhou==-1)
zhou=7;
write_sfm1(7,zhou);
lcd_pos(2,7); // write_sfm1(7,zhou);
}
}
}
}
if(k==0) { if(k2==0) { delayms(5); if(k2==0) { while(!k2); if(kk==3) { miao0++; if(miao0==60)
miao0=0;
write_sfm2(6,miao0);
lcd_pos(3,6); // write_sfm2(6,miao0);
}
if(kk==2) { fen0++; if(fen0==60)
fen0=0;
write_sfm2(4,fen0);
lcd_pos(3,4); // write_sfm2(4,fen0);
} if(kk==1) { shi0++; if(shi0==24)
shi0=0; write_sfm2(2,shi0);
lcd_pos(3,2); // write_sfm2(2,shi0);
}
}
}
if(k3==0)
{
delayms(5); if(k3==0) { while(!k3); if(kk==3) { miao0--; if(miao0==-1)
miao0=59;
write_sfm2(6,miao0);
lcd_pos(3,6); // write_sfm2(6,miao0);
} if(kk==2) { fen0--; if(fen0==-1)
fen0=59; write_sfm2(4,fen0);
lcd_pos(3,4); // write_sfm2(4,fen0);
} if(kk==1) {
shi0--;
if(shi0==-1)
shi0=23;
write_sfm2(2,shi0);
lcd_pos(3,2); // write_sfm2(2,shi0);
}
}
}
}
}
void init()//初始化函數(12864初始化,定時器初始化) { PSB=1;
write_com(0x30); delayms(5); write_com(0x0c); delayms(5); write_com(0x01); delayms(5);
TH0=(65535-50000)/256; TL0=(65535-50000)%256; TMOD=0x01; ET0=1;
EA=1;
TR0=1;
}
void main()//主函數 { uchar i; delayms(10); init();
lcd_pos(0,2);//第一排顯示 i=0;
while(dis1[i]!=‘ 太阳城假日酒店| 百家乐官网庄家赢钱方法| 娱乐城开户送现金| 大发888客户端下载| 百佬汇百家乐的玩法技巧和规则 | 百家乐平注法到| 百家乐蓝盾在线现| 百家乐赌缆十三式| 24山72向吉凶断| 任你博百家乐官网娱乐城| 百家乐官网押注最高是多少| 保单百家乐官网游戏机厂家| 百家乐官网筹码币方形| 澳门百家乐官网娱乐城送彩金| 宝龙百家乐官网娱乐城| 百家乐官网投注打三断| 新锦江娱乐城| bet365怎么样| 博彩行业| 网上足球投注| E世博开户| 利来国际网址| 皇家金堡娱乐城| 银河国际| 最新博彩论坛| 惠水县| 大发888娱乐城优惠码lm0| 水果机下载| 二八杠算法| 全讯网hg055.com| 大发888官网sscbcgsesb| 大发888娱乐场18| 昆明百家乐装修装潢有限公司| 澳门百家乐下路写法| 百家乐赌场高手| 博彩网百家乐的玩法技巧和规则| 百家乐是个什么样的游戏| 二八杠网| 德州扑克在线玩| 娱乐城网址| 习水县|