A. 單片機應用:把獨立按鍵、靜態數碼管、矩陣鍵盤三個實驗程序合成一個程序(並注釋)請大神們幫助
100軟妹幣..
B. 單片機獨立按鍵實驗
能不能別發圖片,折怎麼調試
C. 單片機匯編矩陣鍵盤實驗(掃描法)
關於掃描按鍵的原理,可以看下面這篇文章。
本文以循序漸進的思路,引導大家思考如何用最少的IO驅動更多的按鍵,並依次給出5種方案原理圖提供參考。在實際項目中我們經常會遇到有按鍵輸入的需求,但有的時候為了節省資源成本,我們都會選擇在不增加硬體的情況下使用最少的控制器IO驅動更多的按鍵,那麼具體是怎麼做的呢,下面我們就以用5個IO引腳為例,講下怎麼設計可以實現更多的按鍵?共有5種設計思路,下面依次介紹。
首先通常想到的可能是下面這樣的設計:
這樣我們可以先識別K01、K02、K03、K04、K05,若沒有按鍵按下然後再和思路四的設計一樣去識別其他按鍵。但這樣存在一個問題,如果IO1配置為0,IO5讀到0,那麼怎麼知道是K51按下還是K05按下呢,這里只需要在程序里做下判斷,先判斷下是不是K05按下,若不是就是K51,因為按鍵K01、K02、K03、K04、K05在5個IO口都為讀取的情況下,就可以識別,不需要掃描識別處理,相當於這5個按鍵優先順序高與其他按鍵。
總結
綜合上述,5個IO口最多可以識別25個按鍵,思路五程序上處理比較麻煩,若實際中只按思路四設計,也可識別20個按鍵,那麼如果有N個IO口可識別多少按鍵呢?這里給出如下公式:
假設有N個IO口按照思路三可以識別N*(N-1)/2個;
按照思路四可識別N*(N-1)個;
按照思路5可以識別N*(N-1)+N個。
最後再說下,如果實際設計時,還是按思路四設計好,軟體也沒那麼麻煩。如果是你的話你會選擇哪種方法呢?你還有沒有其他的設計方法呢?
D. 單片機是ATmega48的,在設計一個簡單的按鍵實驗,但是不知道為什麼按鍵按下去始終沒有反應,求指教
汗 電路圖就有問題
硬體是 是按鍵跟電阻位置對調。電阻是上拉,按鍵是按下短路。
軟體上是 IO配置為帶上拉數字輸入。如DDRC &= ~0x02,PORTC |= 0x02;
E. 51單片機中獨立按鍵控制led燈的實驗當中按鍵的返回值怎麼設定
返回值,不需要設定。
對返回值,進行判斷,應該有個預定值。
這就要看你的獨立按鍵通過什麼介面晶元接入單片機了。
通常是某個位,為0。
F. 89C51單片機簡單鍵盤實驗利用keil uVision4模擬程序。利用簡單鍵盤模塊中提供的8個獨
#include<reg52.h>
sbit key = P1^0;//按鍵
void delay(unsigned int time)
{
unsigned int i,j;
for(i=0; i<time; i++)
for(j=0; j<1000; j++)
{;}
}
void mian()
{
unsigned int temp =0x00;
while(1)
{
if(key == 0)
{
delay(20);//適當延時,消除按鍵抖動,自己看實際情況修改時間
if(key == 0)
temp = ~temp;
}
P2 = temp;
}
}
G. 單片機實驗編程 按鍵聲光報警實驗 編寫程序.c
要同步就把揚聲器和指示燈用一個I/O控制就可以了,那就用定時器定時,0.5-1S取反一次就可以了,加一個觸發的引腳即可
H. 按鍵實驗
無論是矩陣鍵盤還是獨立鍵盤,單片機檢測其是否被按下的方法都是一樣的。也就是檢測與按鍵對應的 I/O 口的電平高低。
Ø 獨立按鍵有一端固定為低電平或高電平,單片機寫檢測程序時比較方便。
Ø 矩陣按鍵兩端都與單片機I/O口相連,因此檢測時需要人為地通過單片機 I/O 口送出低電平。先送一列為低電平,其餘幾列全為高電平(此時確定了列數),然後輪流檢測一次各行是否有低電平,若某一行為低電平(此時又確定了行數)。那麼我們就可以確定是哪一行哪一列的鍵被按下。 用同樣的方法,依次輪流送各列一次低電平,再輪流檢測一次各行中是否有低電平。這樣就可檢測完 所有的按鍵,也就能判斷出被按下的是哪一個鍵。 當然我們也可將各行線置低電平,然後掃描檢測各列線中是否出現低電平, 這就是矩陣鍵盤檢測的原理和方法。
#include <reg51.h>
#define uchr unsigned char
#define uint unsigned int
uchr code DSY_Table[]= //共陽極數碼管編碼
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, //0,1,2,3,4,5,6,7,8
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF, //9,A,B,C,D,E,F,-
};
uchr key; //按鍵序號
void delayms(uchr x)
{
uchr i;
while(x--) for(i=0;i<120;i++);
}
void main()
{
uchr kp;
P0=0xff;
while(1)
{
P1=0xfd; //P1.1置 0
if(P1!=0xfd) //有鍵按下?
{
delayms(5); //延時消抖動
if(P1!=0xfd) //確認
{
kp=P1; //讀取埠鍵值
while(P1!=0xfd); //等待鍵松開
switch(kp&0xf0) //屏蔽低4位,判斷高4位
{
case 0xe0: //若高4位為e(即1鍵)
key=1; //賦鍵值
break;
case 0xd0: //若高4位為d(即5鍵)
key=5; //賦鍵值
break;
case 0xb0: //若高4位為b(即9鍵)
key=9; //賦鍵值
break;
case 0x70: //若高4位為7(即"9"鍵:num[9])
key=13; //賦鍵值
break;
}
}
}
P0 = DSY_Table[key]; //顯示按鍵值
delayms(5);
}
}