用 LCD1602 顯示的秒表
給STC89C51安一個(gè)LCD1602液晶顯示器。寫一段程序,使得STC89C51有計(jì)時(shí)、顯示功能。
當(dāng)給STC89C51一個(gè)連續(xù)的高電平時(shí),單片機(jī)開(kāi)始計(jì)時(shí),同時(shí)在顯示器上顯示計(jì)時(shí)的秒數(shù);
當(dāng)結(jié)束高電平時(shí),計(jì)時(shí)停止,但是顯示器上保留計(jì)時(shí)數(shù)值。
當(dāng)下一個(gè)高電平來(lái)到,顯示器接著上次的時(shí)間繼續(xù)計(jì)時(shí)。
簡(jiǎn)單的講就是說(shuō)顯示器顯示幾個(gè)間斷的高電平持續(xù)的時(shí)間之和。
再設(shè)一個(gè)腳實(shí)現(xiàn)清零。
這個(gè)題目,實(shí)際上就是設(shè)計(jì)一個(gè)采用液晶顯示的秒表。
LCD1602和51單片機(jī)的之間,如果采用常規(guī)接法,共需要11條線;
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/eafb581918de515237fa4148.html
如果覺(jué)得LCD1602占用單片機(jī)的引腳太多,可以只用6條引線來(lái)實(shí)現(xiàn)對(duì)液晶屏的驅(qū)動(dòng)。詳情可看下列的鏈接:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/32d640df73343d4bcdbf1ac8.html
------------------------------------
驅(qū)動(dòng)LCD1602,很簡(jiǎn)單,關(guān)鍵是要寫好“寫指令”和“寫數(shù)據(jù)”兩個(gè)函數(shù),其它的設(shè)置、顯示等等,就不難了。
晶振選用11.0592/12MHz,均可。
實(shí)現(xiàn)脈沖長(zhǎng)度計(jì)時(shí)、顯示的程序如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_IOP2
sbitLCD_RS=P3^0;
sbitLCD_RW=P3^7;
sbitLCD_EN=P3^1;
sbitsw1=P3^2;
sbitsw2=P3^3;
ucharcount;
uintsec;
ucharcodeLCD_line1[]="PulseContinued:";
ucharcodeLCD_line2[]="00000s";
//---------------------------------------------------
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)for(y=10;y>0;y--);
}
//---------------------------------------------------
voidW_LCD_Com(ucharcom)//寫指令
{
LCD_RS=0;LCD_EN=0;//LCD_RS和R/W同時(shí)為低電平時(shí),可以寫入指令
LCD_IO=com;delay(5);//下面用EN輸入一個(gè)高脈沖
LCD_EN=1;delay(5);LCD_EN=0;
}
//---------------------------------------------------
voidW_LCD_Dat(uchardat)//寫數(shù)據(jù)
{
LCD_RS=1;LCD_EN=0;//LCD_RS為高,LCD_RW為低時(shí),可以寫入數(shù)據(jù)
LCD_IO=dat;delay(5);//下面用EN輸入一個(gè)高脈沖
LCD_EN=1;delay(5);LCD_EN=0;
}
//---------------------------------------------------
voidW_LCD_STR(uchar*s)//寫字符串
{
while(*s>0){W_LCD_Dat(*s);s++;}
}
//---------------------------------------------------
voidinit()
{
W_LCD_Com(0x38);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
W_LCD_Com(0x80);W_LCD_STR(LCD_line1);
W_LCD_Com(0xC0);W_LCD_STR(LCD_line2);
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EX0=1;
EX1=1;
PX1=1;
EA=1;
}
//---------------------------------------------------
voidW_LCD_X1_Dat(uintsec)
{
W_LCD_Com(0xc0+7);
W_LCD_Dat(0x30+sec/10000);
W_LCD_Dat(0x30+(sec%10000)/1000);
W_LCD_Dat(0x30+(sec%1000)/100);
W_LCD_Dat(0x30+(sec%100)/10);
W_LCD_Dat(0x30+sec%10);
}
//---------------------------------------------------
voidmain()
{
init();
while(1);
}
//-------------------------------------------
voidtimer0()interrupt1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
count++;
if(count==20){
count=0;
sec++;
W_LCD_X1_Dat(sec);
}
}
//-------------------------------------------
voidX0_INT()interrupt0
{
while(sw1==0);
}
//-------------------------------------------
voidX1_INT()interrupt2
{
while(sw2==0);
count=0;
sec=0;
W_LCD_X1_Dat(sec);
}
================================================