① 求msp430 4x4矩陣鍵盤顯示鍵值的程序,
無
********************************************//
unsigned char keymap[] = {1;*********************************************************************
控制打開或者關閉鍵盤中斷
SW= 0;關閉埠中斷
else
KEY_IE =0xf0;/7 接上拉電阻
/控制鍵盤開關/消除抖動
Check_Key():
[p13]→ 1 2 3 4
[p12]→ 5 6 7 8
[p11]→ 9 10 11 12
[p10]→ 13 14 15 16
***************************************/
void Key_Event(void)
{
unsigned char tmp;/
void delay(void)
{
unsigned int tmp;/如果有鍵按下
{
delay();/ //是否P1IN的P1;/ 列檢測
{
if((KEY_IN tmp2) == 0x00) / 獲取鍵值
return; 設置P1OUT全為0,P1.h>/ /p14\///
KEY_IES =0xf0; / /設置鍵盤邏輯鍵值
與程序計算鍵值的映射
tmp1 = 0x08/
void Check_Key(void)
{
unsigned char row ;P1;6\= 1;/*******************************************
函數名稱; tmp2用於檢測出哪一位為0
for(col = 0,15;/ 獲取 p1IN
if((tmp 0xf0) < /gt.4~P1,7,完成消抖功能
參 數;
if(Key_Val; /
/msp430x14x;/ //*******************************************
函數名稱!=0)
{
Key_Event();/
KEY_OUT =0,並獲取鍵值
參 數;打開埠中斷
}
//
void Init_Keypad(void)
{
KEY_DIR = 0x0f;P1.0~P1.4~p1;P1; 0;***************************************
key_Val 對應鍵值
列;row++) /5\ / /col lt; ELSE;
for(tmp = 12000;
for(row = 0,4:t= tmp*5*clk 根據使用時鍾調整tmp值
********************************************/ tmp2右移1位
}
}
}
}
/鍵值,9:delay
功 能:掃描鍵盤的IO埠:無
返回值 ,12; /關鍵盤中斷
}
}
KEY_IFG=0;KEY_OUT=0;col++) / 4;/ 0xf0) /row lt,14;=1;*埠1按鍵中斷*/ / /行掃描
{
KEY_OUT = 0x0f; / 4;0xf0) / /////tmp >
#pragma vector=PORT1_VECTOR
__interrupt void Port(void)
{
if((KEY_IFG0xf0):無
返回值 ;存放鍵值
void CtrlKey(unsigned char sw).4~P1;< // 調用check_Key()!=0) /P1.7輸出四位中有一個為0
tmp1 gt!=0有鍵按下
{
CtrlKey(0),等待按鍵輸入
tmp = KEY_IN; /***************全局變數***************/sw=0關 sw=1開
/// //
if((KEY_IN 0xf0)< 退出循環
}
tmp2 < / / 是否是該列;
#define KEY_DIR P1DIR
#define KEY_OUT P1OUT
#define KEY_IN P1IN
#define KEY_IE P1IE
#define KEY_IES P1IES
#define KEY_IFG P1IFG
//
}
//
void CtrlKey(unsigned char sw)
{
if(sw==0)
KEY_IE =0;/中斷標志清0
Key_Val = 0;*******************************************
函數名稱;
}
// /P1;msp430F149 4*4矩陣鍵盤P1口中斷掃描
#includelt,8;47
② 4X4矩陣鍵盤程序
4x4鍵盤的程序有掃描法與線反法,但我個人認為用線反法較好,用掃描法得依次掃描所有行或列,如果用線反法就簡單多了。先使鍵盤的行置為低、列置為高(或列置為高、行置為低),接著讀回埠的值。比如:如果使用P0為鍵盤介面就先使低四位為低、高四位為高即P0=0xf0然後就讀回P0口的值賦給一個變數,a=P0;緊接就給行列賦相反的值行置為高、列置為低(或列置為低、行置為高)即P0=0x0f然後就讀回再與a運算就能得到唯一的識別碼下面的程序就是用線反寫一個4x4鍵盤識別程序:#include<AT89X52.H>
#include<delay.h>#define KEY_SCAN P1
#define uchar unsigned char//char num;/********************************/
/*函數名稱:KEY_DOWN() */
/*函數功能:延時子函數 */
/*參 數:無 */
/*返 回:返回1或0 */
/*備 註:1表示有鍵按下,0則無*/
/********************************/
bit KEY_DOWN()
{
KEY_SCAN=0x0f; //先給鍵盤口賦個初值
if(KEY_SCAN!=0x0f) //判斷是有按鍵按下,即KEY_SCAN不等於初值時有鍵按下
{
delayms(10); //消抖
if(KEY_SCAN!=0x0f) //再次判斷是否真有鍵按下
return 1; //真有就返回1沒有返回零
else
return 0;
}
else
return 0;
}/********************************/
/*函數名稱:SCAN_GET() */
/*函數功能:鍵盤值函數 */
/*參 數:無 */
/*返 回:返回1或0 */
/*備 註:無 */
/********************************/
uchar SCAN_GET()
{
char button;
uchar key_code;
button=KEY_SCAN;
KEY_SCAN=0xf0;
button=(button|KEY_SCAN);
while(KEY_SCAN!=0xf0);
delayms(10);
switch(button)
{
case 0xd7: key_code='1';break;
case 0xdb: key_code='2';break;
case 0xdd: key_code='3';break;
case 0xb7: key_code='4';break;
case 0xbb: key_code='5';break;
case 0xbd: key_code='6';break;
case 0x77: key_code='7';break;
case 0x7b: key_code='8';break;
case 0x7d: key_code='9';break;
case 0xeb: key_code='0';break;
case 0xee: key_code=0xee;break;
default : break;
}
return key_code;
}
//////////////////////////////////////////////////////////////
//此程序是上兩個程序結合的
/********************************/
/*函數名稱:Key_Get() */
/*函數功能:鍵盤掃描函數 */
/*參 數:無 */
/*返 回:無 */
/*備 註:無 */
/********************************/
void Key_Get()
{
char button;
KEY_SCAN=0x0f;
if(KEY_SCAN!=0x0f)
{
delayms(5);
if(KEY_SCAN!=0x0f)
{
button=KEY_SCAN;
KEY_SCAN=0xf0;
button=(button|KEY_SCAN);
while(KEY_SCAN!=0xf0);
switch(button)
{
case 0xd7: num='1';P0=0x00;break;
case 0xdb: num='2';P0=0x0f;break;
case 0xdd: num='3';break;
case 0xb7: num='4';break;
case 0xbb: num='5';break;
case 0xbd: num='6';break;
case 0x77: num='7';break;
case 0x7b: num='8';break;
case 0x7d: num='9';break;
case 0xeb: num='0';break;
case 0xe7: num='a';break;
case 0xed: num='b';break;
case 0xee: num='c';break;
case 0xde: num='d';break;
case 0xbe: num='e';break;
case 0x7e: num='f';break;
default : break;
}
}
}
}
③ 4*4矩陣鍵盤掃描匯編程序 怎麼寫,求大神!
因為不知道你的單片機板子的電路圖,我用我自己的板子寫的代碼發給你,你可以參考我的矩陣鍵盤掃描的方法,仿照著寫。(這個不難的,用心看看就能懂的)
/********************************************************************
* 文件名 : 矩陣鍵盤.c
* 描述 : 該文件實現了 4 * 4 鍵盤的試驗。通過數碼管的最後一位來顯示
當前的按鍵值。
* 創建人 : 東流,2012年2月7日
*********************************************************************/
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
void Delay_1ms(uint i)//1ms延時
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名稱 : Keyscan()
* 功能 : 實現按鍵的讀取。下面這個子程序是按處理 矩陣鍵盤 的基本方法處理的。
* 輸入 : 無
* 輸出 : 按鍵值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; //讓矩陣鍵盤的每行分別為低電平
for(j=0; j<4; j++)
{
P1 = Buffer[j];
temp = 0x10;
for(i=0; i<4; i++)
{
if(!(P1 & temp)) //判斷P1口高4位某一行為低電平
{
return (i+j*4); //返回鍵碼
}
temp <<= 1;
}
}
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
uchar Key_Value; //讀出的鍵值
P2 = 7;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0) //判斷有無按鍵按下
{
Delay_1ms(20); //按鍵消抖
if(P1 != 0xf0) //第二次判斷有無按鍵按下
{
Delay_1ms(20); //按鍵消抖
if(P1 != 0xf0) //第三次判斷有無按鍵按下
{
Key_Value = Keyscan();
}
}
}
P0 = table[Key_Value]; //數碼管賦值
}
}
④ 幫我寫一個4乘4矩陣鍵盤識別技術的程序
您好,把文本格式奉上 直接復制到你的程序里
volatile unsigned char CF[4]; //按鍵觸發標志(表示4列,每一列同一行的
//值是一樣的但列標不一樣來區分不同列的鍵)
volatile unsigned char KeyVal;//鍵值
code unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f}; //4X4按輸出端控制
#define KEY P2 //P2口作為4*4矩陣鍵盤輸入
/*
**描述:新型4X4按鍵掃描程序 放在1ms-10ms中斷內使用(十分穩定不需要再寫消抖程序)
**備註:按鍵彈起時 keyVal = 0 單鍵按下 keyVal 有16個值,你自己程序可以針對不同值
**進行不同程序操作 keyVal單鍵值分別為
**0x11,0x12,0x14,0x18,
**0x21,0x22,0x24,0x28,
**0x31,0x32,0x34,0x38,
**0x41,0x42,0x44,0x48,
*/
void Key_Head()
{
unsigned char ReadData[4];
static unsigned char i;
if(++i>=4)i=0;
KEY = KeyOut[i]|0x0f; //忽略低4位
ReadData[i] = (KEY|0xf0)^0xff; //忽略高4位 取反
CF[i] = ReadData[i] & (ReadData[i] ^ Cont[i]);
Cont[i] = ReadData[i];
//輸出鍵值
switch(CF[i])//第i列
{
case 0x08: KeyVal = (i<<4+8);break;
case 0x04: KeyVal = (i<<4+4);break;
case 0x02: KeyVal = (i<<4+2);break;
case 0x01: KeyVal = (i<<4+1);break;
default:KeyVal = 0;break;
}
}
⑤ 有關4X4矩陣鍵盤FPGA的程序的分析,有誰幫我分析一下這個狀態機的程序啊
.always@後面內容是敏感變數,always@(*)裡面的敏感變數為*,意思是說敏感變數由綜合器根據always裡面的輸入變數自動添加,不用自己考慮。 2.如果沒有@,那就是不會滿足特定條件才執行,而是執行完一次後立馬執行下一次,一直重復執行,比如testbench裡面產生50Mhz的時鍾就(假設時間尺度是1ns)可以寫成 always #20 CLK_50Mhz = ~CLK_50Mhz;
⑥ 4*4矩陣鍵盤匯編語言程序,按鍵分別顯示,1,2,3,4,5,6,7,8,9,A,b,c,d,E
ORG 00H
STRAT: MOV R4, #00H
L1: MOV R3, #0F7H
MOV R1, #00H
L2: MOV A, R3
MOV P3, A
MOV A, P3
MOV R4, A
SETB C
MOV R5, #04H
L3: RLC A
JNC KEY
INC R1
DJNZ R5, L3
MOV A, R3
SETB C
RRC A
MOV R3, A
JC L2
JMP L1
KEY: ACALL DELAY
D1: MOV A, P3
XRL A,R4
JZ D1
MOV A, R1
ACALL DISP
JMP L1
DISP: MOV DPTR, #TABLE
MOVC A, @A+ DPTR
MOV P0, A
RET
DELAY: MOV R7, #60
MOV R6, #248
DLY1: DJNZ R6, $
DJNZ R7, DLY1
RET
TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H
DB 99H, 92H, 82H, 0F8H
DB 80H, 90H, 88H, 83H
DB 0C6H, 0A1H, 86H, 8EH
END89c51的,很經典,不懂的可以問我。
⑦ 4X4矩陣鍵盤程序
//4*4鍵盤檢測程序,按下鍵後相應的代碼顯示在數碼管上
#include<reg51.h>
sbit beep=P2^3;
sbit la=P2^6;
sbit wela=P2^7;
unsigned char i=100;
unsigned char j,k,temp,key;
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
display(unsigned char num)
{
P0=table[num];
// P0=0xff;
la=1;
la=0;
P0=0xc0;
wela=1;
wela=0;
}
void main()
{
la=0;
wela=0;
while(1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
// P0=table[key];
/* P0=0xff;
la=1;
while(i--);
la=0;
P0=0xc0;
wela=1;
wela=0;
la=0;
wela=0;
P0=0xff;
la=1;
la=0;
P0=0xc5;
wela=1;
wela=0; */
P1=0xfe;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
/* P0=table[key];
la=1;
// while(100--);
la=0;
P0=0xc0;
wela=1;
wela=0;
*/ P1=0xfc;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
/* P0=table[key];
la=1;
// while(100--);
la=0;
P0=0xc0;
wela=1;
wela=0;
*/ P1=0xf8;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
display(key);
/* P0=table[key];
la=1;
// while(100--);
la=0;
P0=0xc0;
wela=1;
wela=0;
*/ P1=0xf0;
}
}
}
}