用 LCD1602 顯示的秒表
給STC89C51安一個LCD1602液晶顯示器。寫一段程序,使得STC89C51有計時、顯示功能。
當(dāng)給STC89C51一個連續(xù)的高電平時,單片機開始計時,同時在顯示器上顯示計時的秒數(shù);
當(dāng)結(jié)束高電平時,計時停止,但是顯示器上保留計時數(shù)值。
當(dāng)下一個高電平來到,顯示器接著上次的時間繼續(xù)計時。
簡單的講就是說顯示器顯示幾個間斷的高電平持續(xù)的時間之和。
再設(shè)一個腳實現(xiàn)清零。
這個題目,實際上就是設(shè)計一個采用液晶顯示的秒表。
LCD1602和51單片機的之間,如果采用常規(guī)接法,共需要11條線;
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/eafb581918de515237fa4148.html
如果覺得LCD1602占用單片機的引腳太多,可以只用6條引線來實現(xiàn)對液晶屏的驅(qū)動。詳情可看下列的鏈接:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/32d640df73343d4bcdbf1ac8.html
------------------------------------
驅(qū)動LCD1602,很簡單,關(guān)鍵是要寫好“寫指令”和“寫數(shù)據(jù)”兩個函數(shù),其它的設(shè)置、顯示等等,就不難了。
晶振選用11.0592/12MHz,均可。
實現(xiàn)脈沖長度計時、顯示的程序如下:
#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同時為低電平時,可以寫入指令
LCD_IO=com;delay(5);//下面用EN輸入一個高脈沖
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ù)據(jù)
LCD_IO=dat;delay(5);//下面用EN輸入一個高脈沖
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);
}
================================================