日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] LCD1602的接口形式是并行的,它有8條數(shù)據(jù)線(xiàn)、3條控制線(xiàn)。這樣就需要11條線(xiàn)來(lái)控制它的正常工作。雖然它還可以工作在4位數(shù)據(jù)線(xiàn)的形式,最精簡(jiǎn)的形式是6條線(xiàn)。有位網(wǎng)友想要使用74HC595進(jìn)行串-并轉(zhuǎn)換,想要

LCD1602的接口形式是并行的,它有8條數(shù)據(jù)線(xiàn)、3條控制線(xiàn)。這樣就需要11條線(xiàn)來(lái)控制它的正常工作。雖然它還可以工作在4位數(shù)據(jù)線(xiàn)的形式,最精簡(jiǎn)的形式是6條線(xiàn)。


有位網(wǎng)友想要使用74HC595進(jìn)行串-并轉(zhuǎn)換,想要用4條線(xiàn)來(lái)控制LCD1602。

可見(jiàn)鏈接:http://zhidao.baidu.com/question/458604195.html。


多用了一塊芯片,省下了單片機(jī)的引腳,這也算是一種方法吧,在系統(tǒng)規(guī)模較大、資源緊張的條件下,還是值得應(yīng)用的。


74HC595是“串入并出”的移位寄存器芯片,它需要用3條線(xiàn)控制數(shù)據(jù)的輸入,才能正常的輸出8位數(shù)據(jù)。


有了8位數(shù)據(jù),這時(shí),LCD1602還需要至少兩條控制線(xiàn)。


經(jīng)過(guò)做而論道的精心設(shè)計(jì),分時(shí)使用這些控制線(xiàn),最終,僅僅使用了3條線(xiàn),就完成了對(duì)74HC595和LCD1602的有效控制!


這要比前面的網(wǎng)友提出的4條線(xiàn)的方案,還要更加精簡(jiǎn),節(jié)省率提高了25%。


精簡(jiǎn)后的電路圖如下:



圖中是一個(gè)數(shù)字鐘,是為另一個(gè)網(wǎng)友編寫(xiě)的,可以參考下面的鏈接:

http://hi.baidu.com/do_sermon/item/c8d1161d40768f10e3f98682

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/a0c99e2343b541844423e865.html

(百度空間在2012年8月,無(wú)聊的改版了,結(jié)果,把它自己的網(wǎng)站鏈接,都弄斷了。因此,下面的鏈接,已經(jīng)失效了。不刪了,留作紀(jì)念吧。)


由于LCD1602的驅(qū)動(dòng)電路發(fā)生了改變,所以數(shù)字鐘的程序,也要相應(yīng)的修改。

那么,針對(duì)本電路的程序如下:


//===================================================


#include

#defineucharunsignedchar

#defineuintunsignedint


#defineKEY_IOP3


sbitLCD_RS=P2^0;

sbitLCD_EN=P2^2;


sbitSCK=P2^0;

sbitSDI=P2^1;

sbitRCK=P2^2;


sbitSPK=P1^2;

sbitLED=P2^4;


bitnew_s,modify=0;

chart0,sec=50,min=59,hour=23;


charcodeLCD_line1[]="DesignedbyZELD";

charcodeLCD_line2[]="Timer:00:00:00";

charTimer_buf[]="23:59:50";

//---------------------------------------------------

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)for(y=100;y>0;y--);

}

//---------------------------------------------------

voidwrite_595(uchardate)//寫(xiě)入595

{

uchari;

for(i=0;i<8;i++){

SCK=0;SDI=date&0x80;

SCK=1;date<<=1;

}

}

//---------------------------------------------------

voidW_LCD_Com(ucharcom)//寫(xiě)指令

{

write_595(com);LCD_RS=0;//寫(xiě)入指令

RCK=1;RCK=0;//令595輸出,并用EN輸出一個(gè)高脈沖

}

//---------------------------------------------------

voidW_LCD_Dat(uchardat)//寫(xiě)數(shù)據(jù)

{

write_595(dat);LCD_RS=1;//寫(xiě)入數(shù)據(jù)

RCK=1;RCK=0;//令595輸出,并用EN輸出一個(gè)高脈沖

}

//---------------------------------------------------

voidW_LCD_STR(uchar*s)//寫(xiě)字符串

{

while(*s)W_LCD_Dat(*s++);

}

//---------------------------------------------------

voidW_BUFF(void)//填寫(xiě)顯示緩沖區(qū)

{

Timer_buf[7]=sec%10+48;Timer_buf[6]=sec/10+48;

Timer_buf[4]=min%10+48;Timer_buf[3]=min/10+48;

Timer_buf[1]=hour%10+48;Timer_buf[0]=hour/10+48;

W_LCD_Com(0xc0+7);W_LCD_STR(Timer_buf);

}

//---------------------------------------------------

ucharread_key(void)

{

ucharx1,x2;

KEY_IO=255;

x1=KEY_IO;

if(x1!=255){

delay(100);

x2=KEY_IO;

if(x1!=x2)return255;

while(x2!=255)x2=KEY_IO;

if(x1==0x7f)return0;

elseif(x1==0xbf)return1;

elseif(x1==0xdf)return2;

elseif(x1==0xef)return3;

elseif(x1==0xf7)return4;

}

return255;

}

//---------------------------------------------------

voidInit()

{

W_LCD_Com(0x38);delay(50);

W_LCD_Com(0x38);delay(50);

W_LCD_Com(0x0c);

W_LCD_Com(0x06);

W_LCD_Com(0x01);delay(50);

W_LCD_Com(0x80);W_LCD_STR(LCD_line1);

W_LCD_Com(0xC0);W_LCD_STR(LCD_line2);


TMOD=0x01;//T0定時(shí)方式1

TH0=0x4c;

TR0=1;//啟動(dòng)T0

PT0=1;//高優(yōu)先級(jí),以保證定時(shí)精度

ET0=1;

EA=1;

}

//---------------------------------------------------

voidmain()

{

uinti,j;

ucharKey;

Init();


while(1){

//-------------------------------

if(new_s){//如果出現(xiàn)了新的一秒,修改時(shí)間

new_s=0;sec++;sec%=60;

if(!sec){min++;min%=60;

if(!min){hour++;hour%=24;}

}

W_BUFF();//寫(xiě)顯示

//-------------------------------

if(!sec&&!min){//整點(diǎn)報(bào)時(shí)

for(i=0;i<200;i++){

SPK=0;for(j=0;j<100;j++);

SPK=1;for(j=0;j<100;j++);

}}

}

//-------------------------------

Key=read_key();//讀出按鍵

switch(Key){//分別處理四個(gè)按鍵

case0:modify=1;break;

case1:if(modify){min++;min%=60;W_BUFF();break;}

case2:if(modify){hour++;hour%=24;W_BUFF();break;}

case3:modify=0;break;

}}

}

//---------------------------------------------------

voidtimer0(void)interrupt1//T0中斷函數(shù),50ms執(zhí)行一次

{

TH0=0x4c;

t0++;t0%=20;//20,一秒鐘

if(t0==0){new_s=1;LED=~LED;}

if(modify)LED=0;

}

//===================================================


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉