㈠ 單片機c語言矩陣
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
uchar code KeyCodeTable[]=
{
0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88
};
void Delay() //延時,不用多說,延時時間600us左右
{
uchar i;
for(i=0;i<200;i++);
}
uchar Keys_Scan() //鍵盤掃描程序
{
uchar sCode,kCode,i,k;
P1 = 0xf0; //P1低四位置零
if((P1&0xf0)!=0xf0) //讀高四位數據,根據高四位是否有零判斷是否有鍵按下
{
Delay(); //若有鍵按下,延時,去抖動
if((P1&0xf0)!=0xf0) //再次判斷是否有鍵按下,防止上一步是誤判斷
{
sCode = 0xfe; //確實有鍵按下,准備讀鍵值
for(k=0;k<4;k++) //4*4矩陣鍵盤,需要掃描四次
{
P1 = sCode; //行線最低位置零
if((P1&0xf0)!=0xf0) //判斷第一行是否有鍵按下
{
kCode = ~P1; //若有鍵按下,讀鍵值
for(i=0;i<16;i++) //鍵值總共會有16種可能情況
{
if(kCode == KeyCodeTable[i]) //讀鍵值表,判斷是幾號鍵按下
return i; //返回按鍵編號
}
}
else
sCode = _crol_(sCode,1); //若第一行沒有鍵按下,循環左移一位,掃描第二行
}
}
}
return -1; //若沒有鍵按下,返回錯誤值
}
void main()
{
uchar KeyNO = -1;
uchar i,P2_LED,P3_LED;
while(1)
{
KeyNO = Keys_Scan(); //掃描鍵盤
if(KeyNO != -1) //有鍵按下
{
P2_LED = 0xff; //顯示清零
P3_LED = 0xff;
for(i=0;i<=KeyNO;i++) //顯示程序,16個LED對應16個按鍵,一一對應,根據按鍵編號顯示對應LED
{
if(i<8)
P3_LED>>=1;
else
P2_LED>>=1;
}
P3 = P3_LED;
P2 = P2_LED;
}
}
}
這是程序是一個按鍵掃描程序,P1口接4*4矩陣鍵盤,P2,P3分別接8個LED,灌電流點亮,每個按鍵對應一個LED,每按下一個鍵,相應的LED便被點亮
DSY_CODE 這個數組是4位8段數碼管的碼表,碼表上看是共陽數碼管,對應數碼管顯示1-f,最後一個是全亮;
KeyCodeTable 是4*4矩陣鍵盤的鍵值,4*4矩陣鍵盤每按下一個鍵,有兩位被拉低,取反就是有兩位置高,這兩位一位位於低四位,一位位於高四位,所有總共有16種情況
建議你看一看51單片機的書,裡面矩陣鍵盤跟數碼管講得很清楚
㈡ 用51單片機矩陣如何寫程序
矩陣鍵盤嗎?,這是4*4矩陣鍵盤掃描程序,10毫秒掃描一次,用定時器1控制:
void t1isr() interrupt 3
{
unsigned char sccode,recode;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P3=0x0f; //發0掃描,列線輸入
if ((P3 & 0x0f) != 0x0f)keynum++; //有鍵按下
else keynum=0;
if(keynum>5) //按鍵保持在5次中斷以上
{
keynum=0;
sccode = 0xef; //逐行掃描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
getkey((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
getkey(0);
}
㈢ c51單片機如何用矩陣實現菜單功能
在完成實現菜單功能,需要在單片機的連接輸入時,更改一下驅動處理的晶元參數。
參數設置為矩陣模式,應用相關數據函數完成。
㈣ 單片機矩陣當中第二行的十六進制怎麼表示
單片機的數據(或者是c程序)裡面經常出現一些字母(例如0xff)表示一個位元組的數據,你如果想表示兩個位元組,也就是16位數據的時候就直在0x後跟四個字母(16進制的話,必須是0~9,a~f范圍內)就好了。例如variant
=
0xffff,就表示variant的16個bit全部置1。
㈤ 51單片機按鍵矩陣4X4求指點 不明白他是啥意思
P3埠4根線(高4位)作為輸入,另4根線作為輸出,作為輸入的4根線輸出為1(51單片機引腳作為輸入時先寫1),如果去讀取結果當然為1,但有按鍵接在上面和4根輸出線相連,並且這4根輸出線輪流輸出低電平,有按鍵按下時,這個低電平就傳到了輸入引腳,這時你讀這4個引腳的狀態,就不全是1了,根據哪個引腳是0就可以區分4個按鍵,4個輸出口輪流輸出0,就可以識別16個按鍵
4根輸出線每次只有一個是0,因此化成16進制只能是0x07 0x0b 0x0d 0x0e這些數,由於一次只有一個按鍵按下,因此高4位中也只能有一個0,最終只有16種狀態是合法的如
0x77 0x7b 0x7d 0x7e 0xb7 0xbb 0xbd 0xbe……其它狀態不可能出現,出現也是非法的(因為干擾或者同時按了兩個鍵),我們把這16個對應的狀態編上號,稱為0 1 2 3……,這就是鍵值
㈥ 51單片機矩陣按鍵
首先記住,你的是矩陣鍵盤,就是說一個按鍵a的一端接單片機的一個腳(假設p00),另一個也接一個腳(假設p07),
gpio_key=0x0f;
當沒有按下的話,gpio_key還是等於0x0f的,假設按下a按鍵,由於按鍵兩邊一個接高電平,一個接低電平,按下後,高電平被低電平拉成低電平,也就是說按鍵a兩側都是0,此時不就可以判定了嘛
㈦ 單片機如何控制矩陣型LED燈的亮滅。
這個你要看原理圖。流水燈的控制是通過單片機p口接上595晶元來驅動,軟體實現移位實現流水燈現象
具體的步驟:
1:畫出你的原理圖,最小系統,外加led,595晶元
2:些軟體程序,通過keil編譯並下載到你的單片機
3:觀測效果
具體的程序根據你的原理圖
可以參考《吳鑒鷹單片機項目實戰精講》裡面關於搖搖棒的設計
㈧ 為什麼單片機矩陣按鍵中低電平有效
這是跟單片機的具體電路有關,不同的信號或者不同的單片機結構不一樣,信號的有效電平也就不一樣,但有些信號已成標准,比如片選,大多數晶元的片選信號都是低電平有效,自然很多單片機廠商也把單片機的某些信號設計成低電平有效。而且一般io的灌電流(低電平時)比拉電流(高電平時)大得多,所以低電平有效時驅動能力就強
㈨ 誰能給我講明白單片機的4x4矩陣鍵盤工作原理
給P1賦值0xf0,這時P1^4,P1^5,P1^6,P1^7為高電平,P1^0,P1^1,P1^2,P1^3為低電平。如果這時候有按鍵按下那麼P1^4,P1^5,P1^6,P1^7就有一個會變成低電平。因此P1的值就不等於0xf0,這是就可以判斷有按鍵按下。
4x4矩陣鍵盤的工作原理是在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。當按鍵沒有按下時,所有的輸入端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會被拉低,通過讀入輸入線的狀態就可得知是否有鍵被按下。
(9)單片機矩陣擴展閱讀:
在鍵盤中按鍵數量較多時,為了減少I/O口的佔用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。
這樣,一個埠(如P1口)就可以構成4*4=16個按鍵,比之直接將埠線用於鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用埠線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,採用矩陣法來做鍵盤是合理的。
㈩ 單片機矩陣按鍵掃描為什麼用if判斷兩次
好好看書,這是延時消抖,按鍵剛按下時會有一個不穩定過程,似接非接,會出現高低電平的幾次跳變,如果只檢測一次低電平就認為按鍵按下了,會出現兩種情況,一是按一次被當作多次,二是某些偶爾的干擾也可能被當作按鍵按下。延時10到20ms,真正按下按鍵就穩定了,如果是干擾第二次判斷不可能仍是低電平。