資源描述:
《藍(lán)橋杯備賽筆記.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、1、P0口的復(fù)用P2口高3位的值38譯碼器低電平端口功能備注000(0x00)Y0無(wú)001(0x20)Y1010(0x40)Y2011(0x60)Y38255的CE引腳0:使能82551:禁用8255100(0x80)Y4LED燈鎖存信號(hào)0:點(diǎn)亮LED燈1:熄滅LED燈101(0xA0)Y5UNL2003輸出鎖存信號(hào)0:斷開繼電器、禁用直流電機(jī)、關(guān)閉蜂鳴器1:閉合繼電器、轉(zhuǎn)動(dòng)直流電機(jī)、開啟蜂鳴器110(0xC0)Y6數(shù)碼管位選鎖存信號(hào)0:禁用該位1:使能該位111(0xE0)Y7數(shù)碼管段選鎖存信號(hào)0:點(diǎn)亮該段
2、1:熄滅該段PS1:上電后需給所有鎖存器初始化(Y5,Y6初始化為0x00,其余初始化為0xFF)PS2:使用P0口時(shí),按如下方式:禁用所有寄存器——P0口賦值——打開目標(biāo)寄存器——禁用所用寄存器PS3:鎖存器高電平選通,低電平關(guān)閉/***********************************************@brief初始化開發(fā)板*@paramnone*@returnnone************************************************/voidiniti
3、al_board(void){P0_BUS_COMcom;P2&=0x1F;//禁用所有鎖存器for(com=3;com<8;com++){if(com==UNL2003
4、
5、com==DIGITAL_BIT)P0=0x00;elseP0=0xFF;P2
6、=com<<5;_nop_();P2&=0x1F;}}/***********************************************@brief通過(guò)P0總線傳輸數(shù)據(jù)*@paramcom:總線占用的端口;databuf:傳輸?shù)臄?shù)據(jù)*@retur
7、nnone************************************************/voidP0_BUS(unsignedcharcom,unsignedchardatabuf){P2&=0x1F;//禁用所有鎖存器P0=databuf;P2
8、=com<<5;_nop_();P2&=0x1f;}PS4:數(shù)碼管段碼unsignedcharcodeNUM[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};2、按鍵一、單按鍵單按鍵按如
9、下流程圖獲取按鍵值:分層思想在按鍵上的應(yīng)用:1、硬件層從I/0口獲取按鍵信息映射到keybuf(按鍵寄存器)上2、驅(qū)動(dòng)層根據(jù)keybuf的值,分析按鍵是否有效(是否有抖動(dòng)產(chǎn)生的),并返回按鍵編碼3、應(yīng)用層對(duì)不同按鍵的響應(yīng)分層的好處:如果按鍵連接的I/O變化,或者按鍵所在的I/O口不連續(xù),只需修改硬件層的程序,驅(qū)動(dòng)層和應(yīng)用層則不受影響。/***********************************************@brief初始化鍵盤*@paramnone*@returnnone*******
10、*****************************************/voidinitial_key(void){KEY0=1;KEY1=1;KEY2=1;KEY3=1;}/***********************************************@brief讀鍵值(硬件層)*@paramnone*@return讀取的鍵值************************************************/staticuint8get_keybuf(void){u
11、int8keybuf;keybuf=P3&0x0F;returnkeybuf;}/***********************************************@brief獲取按鍵編碼值(驅(qū)動(dòng)層)*@paramnone*@return按鍵的編碼值************************************************/uint8readkey(void){staticuint8lastkey=NOKEY;//上一次獲取的鍵值staticuint16keycount=0;
12、//獲取同一鍵值的次數(shù)staticuint16keyovertime=KEY_OVER_TIME;//進(jìn)入連擊延時(shí)staticuint16upspeed=0;//加速相應(yīng)(長(zhǎng)按越久連擊延時(shí)越短)uint8keytemp=NOKEY;//保存當(dāng)前獲取的鍵值keytemp=get_keybuf();if(keytemp==NOKEY){//是否有按鍵按下keycount=0;upspeed=0;keyo