導航:首頁 > 操作系統 > 單片機鍵盤擴展實驗

單片機鍵盤擴展實驗

發布時間:2022-09-27 20:02:21

『壹』 使用單片機的P1口擴展4*4鍵盤矩陣,實現在鍵盤上每按一個數字鍵用靜態顯示或動態顯

P1.0~P1.3為列線,P1.4~P1.7為行線;列線和行線的交叉點接按鍵。先在列線上依次輸出1,然後再在行線上讀取;可根據行線的輸入和列線的輸出來判定是哪個按鍵按下。具體的顯示部分,應該很簡單吧。

『貳』 at89s51單片機用擴展pc口接4*4矩陣鍵盤請問怎麼用c語言編程

下面是在P1口接4X3矩陣鍵盤的驅動程序,供你參考。上拉電阻也可以不用.

codeU8kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};
//反轉碼對應鍵值 0 1 2 3 4 5 6 7 8 9 A B
U8key(void)
{U8a,r=0xff;
delay_ms(20);//延時20毫秒,消除按鍵抖動
if(P1==0xf0)gotorn;
a=P1;
P1=a|0x0f;
delay_ms(20);
a=P1;
for(r=0;r<=11;r++)
{ if(a==kcode[r])break;
};
rn:P1=0xf0;
returnr;
}

『叄』 求單片機 4X4鍵盤及數碼管顯示實驗 程序

我有這個視頻教程!是PIC的C語言。其實都一樣
有空了,給你一個視頻和代碼!

『肆』 51單片機做數字電子鍾

這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦

『伍』 51單片機的4*4鍵盤程序

/* 實驗目的:1.掌握鍵盤掃描的原理以及十/十六進制的轉換
* 2.了解單片機輸入和輸出的過程,以及如何對數據進行採集的
* 實驗內容:鍵盤上對應有16個按鍵,從0到F,按下相應的鍵會在數碼管上顯示相應的數字,
* 其中K0到K15是採用4*4的方式連接的
*/
;******************************************************************
; 0 1 2 3 ---P30
; 4 5 6 7 ---P31
; 8 9 A B ---P32
; C D E F ---P33
; | | | |
; P34 P35 P36 P37
;******************************************************************

ORG 0000h
LJMP MAIN
ORG 0030h
MAIN:
MOV DPTR,#TAB ;將表頭放入DPTR
LCALL KEY ;調用鍵盤掃描程序
MOVC A,@A+DPTR ;查表後將鍵值送入ACC
MOV P0,A ;將Acc值送入P0口
CLR P1.3 ;開顯示
LJMP MAIN ;返回調用子程序反復循環顯示

KEY: LCALL KS ;調用檢測按鍵子程序
JNZ K1 ;有鍵按下繼續
LCALL DELAY2 ;無鍵按下調用延時去抖動程序
AJMP KEY ;返回繼續檢測有無按鍵按下
K1: LCALL DELAY2
LCALL DELAY2 ;有鍵按下繼續延時去抖動
LCALL KS ;再一次調用檢測按鍵程序
JNZ K2 ;確認有按下進行下一步
AJMP KEY ;無鍵按下返回繼續檢測
K2: MOV R2,#0EFH ;將掃描值送入 R2暫存
MOV R4,#00H ;將第一列的列值00H送入R4暫存,R4用於存放列值。
K3: MOV P3,R2 ;將R2的值送入P3口
L6: JB P3.0,L1 ;P3.0等於1跳轉到L1
MOV A,#00H ;將第一行的行值00H送入ACC
AJMP LK ;跳轉到鍵值處理程序
L1: JB P3.1,L2 ;P3.1等於1跳轉到L2
MOV A,#04H ;將第二行的行值送入ACC
AJMP LK ;跳轉到鍵值理程序進行鍵值處理
L2: JB P3.2,L3 ;P1.2等於1跳轉到L3
MOV A,#08H ;將第三行的行值送入ACC
AJMP LK ;跳轉到鍵值處理程序
L3: JB P3.3,NEXT ;P3.3等於1跳轉到NEXT處
MOV A,#0cH ;將第四行的行值送入ACC
LK: ADD A,R4 ;行值與列值相加後的鍵值送入A
PUSH ACC ;將A中的值送入堆棧暫存
K4: LCALL DELAY2 ;調用延時去抖動程序
LCALL KS ;調用按鍵檢測程序
JNZ K4 ;按鍵沒有松開繼續返回檢測
POP ACC ;將堆棧的值送入ACC
RET

NEXT:
INC R4 ;將列值加一
MOV A,R2 ;將R2的值送入A
JNB ACC.7,KEY ;掃描完成跳至KEY處進行下一回合的掃描
RL A ;掃描未完成將A中的值右移一位進行下一列的掃描
MOV R2,A ;將ACC的值送入R2暫存
AJMP K3 ;跳轉到K3繼續
KS: MOV P3,#0FH ;將P3口高四位置0低四位值1
MOV A,P3 ;讀P3口
XRL A,#0FH ;將A中的值與A中的值相異或
RET ;子程序返回
DELAY2: ;40ms延時去抖動子程序8*FA*2=40ms
MOV R5,#08H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ R5,L7
RET

TAB:
DB 0C0H;0
DB 0F9H;1
DB 0A4H;2
DB 0B0H;3
DB 099H;4
DB 092H;5
DB 082H;6
DB 0F8H;7
DB 080H;8
DB 090H;9
DB 088H;A
DB 083H;b
DB 0C6H;C
DB 0A1H;d
DB 086H;E
DB 08EH;F
END

『陸』 單片機4*8矩陣鍵盤行列方式如何擴展求c程序

要做4x8矩陣鍵盤並不難,8條行線用一個並口,4條列線用另一個並口的4個I/O口就行了。至於程序,與4×4矩陣鍵盤的寫法是完全相同的,只是返回的鍵值要增加了,從00H~1FH,共32個鍵值。

『柒』 單片機匯編矩陣鍵盤實驗(掃描法)

關於掃描按鍵的原理,可以看下面這篇文章。

本文以循序漸進的思路,引導大家思考如何用最少的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個。

最後再說下,如果實際設計時,還是按思路四設計好,軟體也沒那麼麻煩。如果是你的話你會選擇哪種方法呢?你還有沒有其他的設計方法呢?

『捌』 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;
}

}

『玖』 如何用單片機模擬鍵盤控制電腦

介面協議原理
PS/2鍵盤介面採用一種雙向同步串列協議。即每在時鍾線上發一個脈沖,就在數據線上發送一位數據。在相互傳輸中,主機擁有匯流排控制權,即它可以在任何時候抑制鍵盤的發送。方法是把時鍾線一直拉低,鍵盤就不能產生時鍾信號和發送數據。在兩個方向的傳輸中,時鍾信號都是由鍵盤產生,即主機不產生通信時鍾信號。
如果主機要發送數據,它必須控制鍵盤產生時鍾信號。方法如下:主機首先下拉時鍾線至少100μs抑制通信,然後再下拉數據線,最後釋放時鍾線。通過這一時序控制鍵盤產生時鍾信號。當鍵盤檢測到這個時序狀態,會在10ms內產生時鍾信號。如圖3中 A 時序段。主機和鍵盤之間,傳輸數據幀的時序如圖2、圖3所示。2.2 數據包結構在主機程序中,利用每個數據位的時鍾脈沖觸發中斷,在中斷常式中實現數據位的判斷和接收。在實驗過程中,通過合適的編程,能夠正確控制並接收鍵盤數據。但該方案有一點不足,由於每個CLOCK都要產生一次中斷,中斷頻繁,需要耗用大量的主機資源。

/*-----------------------------------------------
ps2滑鼠的基本原理應用
說明:此程序使用標准PS2鍵盤輸入。此樣例僅作測試使用
晶振使用12M或者11.0592M,本鍵盤使用部分字母和數字測試,其他按鍵不能使用,用
戶可以自行擴展。由於開發板和程序的各種參數,程序中沒有使用奇偶校驗,不保證沒有
誤碼,校驗程序請自行添加。
-------------------------------------------------*/

#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

sbit Key_Data = P3^3 ; //定義Keyboard引腳
sbit Key_CLK = P3^2; //使用中斷

bit BF=0;
bit Shift; //定義上檔鍵標志
bit Key_UP; //定義通碼斷碼標志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;

/*-----------------------------------------------
外部中斷讀入信息
-----------------------------------------------*/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因鍵盤數據是低>>高,結合上一句所以右移一位
if (Key_Data)
KeyV = KeyV | 0x80; //當鍵盤數據線為1時到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高

if (IntNum > 10)
{
IntNum = 0; //當中斷11次後表示一幀數據收完,清變數准備下一次接收
BF = 1; //標識有字元輸入完了
EA = 0; //關中斷等顯示完後再開中斷
}
}

/*-----------------------------------------------
解碼信息
注意:如SHIFT+G為12H 34H F0H 34H F0H 12H
也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
-----------------------------------------------*/
void Decode(unsigned char ScanCode) //
{
unsigned char TempCyc,Val;
if (!Key_UP) //當鍵盤按下時
{
switch (ScanCode)
{
case 0xF0 : // 當收到0xF0,Key_UP置1表示斷碼開始
Key_UP = 1;
break;

case 0x12 : // 左 SHIFT
Shift = 1;
break;

case 0x59 : // 右 SHIFT
Shift = 1;
break;

default:
if(!Shift) //如果SHIFT沒按下
{
for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (UnShifted[TempCyc][0] == ScanCode)
{
Val= UnShifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重頭寫數據
}
}
}
else //按下SHIFT
{
for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表顯示
if (Shifted[TempCyc][0] == ScanCode)
{
Val= Shifted[TempCyc][1];
LCD_Write_Char(DisNum%16,DisNum/16,Val);
DisNum++;
if(DisNum==33)
{
LCD_Clear(); //清屏
DisNum=0; //重頭寫數據
}
}
}
break;
}
}
else
{
Key_UP = 0;
switch (ScanCode) //當鍵松開時不處理判碼,如G 34H F0H 34H 那麼第二個34H不會被處理
{
case 0x12 : // 左 SHIFT
Shift = 0;
break;

case 0x59 : // 右 SHIFT
Shift = 0;
break;
}
}
BF = 0; //標識字元處理完了

}

/*-----------------------------------------------
ps2初始化(實際初始化外部中斷)
-----------------------------------------------*/
void PS2_Init(void)
{
IT1 = 0; //設外部中斷1為低電平觸發
EA = 1; //外部中斷開
EX0 = 1; //開中斷
}
/*-----------------------------------------------
讀取鍵盤值
-----------------------------------------------*/
void Read_KeyBoard(void)
{

if (BF)
Decode(KeyV);
else
EA = 1; //開中斷
}

閱讀全文

與單片機鍵盤擴展實驗相關的資料

熱點內容
找漫畫看應該下載什麼app 瀏覽:180
如何在vps上搭建自己的代理伺服器 瀏覽:744
nginxphp埠 瀏覽:403
內臟pdf 瀏覽:152
怎麼看雲伺服器架構 瀏覽:85
我的世界國際服為什麼登不進伺服器 瀏覽:996
微盟程序員老婆 瀏覽:930
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:98
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:479
單片機液晶驅動 瀏覽:855
魔拆app里能拆到什麼 瀏覽:132
新預演算法的立法理念 瀏覽:144
wdcpphp的路徑 瀏覽:135
單片機p0口電阻 瀏覽:926
瀏覽器中調簡訊文件夾 瀏覽:594
五菱宏光空調壓縮機 瀏覽:70