基本輸入輸出單元與編程
輸出電路:
基本輸出元件:發光二極管(Light Emitting Diode)

灌入的最大電流為 10 mA
拉出的最大電流為 1 mA
單片機輸出低電平時驅動能力尚可,輸出高電平時驅動能力很差,

輸入電路:
基本輸入元件:按鈕(Button)或開關(Switch)

當按鍵未按下壓時,Px.n埠為高電平;按壓按鍵后為低電平,
實體1 獨立按鍵識別
【要求】采用獨立按鍵方式實作下述功能:開機時LED全熄,然后根據按鍵動作使相應燈亮,并將亮燈狀態保持到按壓其它鍵時為止,

獨立按鍵——每個按鍵都彼此獨立地各占有一位I/O口線,特點是電路簡單,但占用I/O口線較多,
【分析】

為使按鍵抬起后LED能保持先前的點亮狀態,需要在按鍵未壓下期間禁止向P2輸出P0狀態值,
參考程式如下:
void main( ) {
char key = 0; //定義按鍵變數
while(1){
key = P0 & 0x0f; //讀取按鍵狀態,高4位清零
if (key != 0x0f) P2 = key; //有按鍵動作時,P0狀態值送P2
}
}

實體2 鍵控流水燈
【要求】
K1為“啟動鍵”,首次按壓K1可產生“自下向上” 的流水燈運動;
K2 為“停止鍵”,按壓K2可終止流水燈的運動;
K3和K4為“方向鍵”,分別產生 “自上向下”和 “自下向上” 運動,

思路分析:設立狀態標志變數→根據鍵值修改標志值→根據標志值控制燈的亮滅

總體關系流程圖如下:

獲取按鍵狀態

按鍵狀態值:
無按鍵—— xxxx 1111B → 0x0f
按壓K1——xxxx 1110B → 0x0e
按壓K2——xxxx 1101B → 0x0d
按壓K3——xxxx 1011B → 0x0b
按壓K4——xxxx 0111B → 0x07
按鍵動作判斷——(P0 & 0x0f)是否等于 0x0f?若是,說明無按鍵動作,反之則有按鍵動作,
修改方向和啟圖示志值
switch(P0 & 0x0f){
case 0x0e:run=1;break,
case 0x0d:run=0,dir=0;break,
case 0x0b: dir=1,break,
case 0x07: dir=0;break,
}
D1~D4回圈方向控制

P2口亮燈編碼:
xxxx 1110
xxxx 1101
xxxx 1011
xxxx 0111
char led [ ] = {0xfe,0xfd,0xfb,0xf7};
for (i=0; i<=3; i++){ P2 = led [i]; } //↓移動
for (i=3; i>=0; i-- ) { P2 = led [i]; } //↑移動

#include "reg51.h"
char led[]={0x01,0x02,0x04,0x08};
void delay(unsigned int time){
unsigned int j= 0;
for(;time>0;time--)
for(j=0;j<125;j++);
}
void main(){
bit dir =0,run=0;
//標志位初始化
char i;
while(1){
switch(P0 & 0x0f){ //根據鍵值修改標志位
case 0x0e:run=1;break;
case 0x0d:run=0;dir=0;break;
case 0x0b:dir=1;break;
case 0x07:dir=0;break;
}
if(run) //若run=dir=1,自上而下流動
if(dir)
for(i=0;i<=3;i++){
P2=led[i];
delay(200);
}
else //若run=l,dir=0, 自下而上流動
for(i=3;i>=0;i--){
P2=led[i];
delay(200);
}
else P2=0; //若run=0,燈全滅
}
}
實體2原理圖與程式界面圖

實體2程式運行效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/250223.html
標籤:其他
上一篇:第一周學習報告
下一篇:個人學習筆記:按鍵實驗
