欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
跪求單片機矩陣鍵盤問題,num亂跳
[打印本頁]
作者:
0孫悟空0
時間:
2019-2-14 23:02
標題:
跪求單片機矩陣鍵盤問題,num亂跳
如圖,為什么num亂跳,或者有其他矩陣鍵盤代碼?
作者:
0孫悟空0
時間:
2019-2-14 23:17
#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar num=0;//注意這里是0void delay(uint z){ uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--);}uchar KeyScan() //帶返回值的子函數{ uchar cord_l,cord_h;//聲明列線和行線的值的儲存變量 P3 = 0xf0;//1111 0000 if( (P3 & 0xf0) != 0xf0)//判斷是否有按鍵按下 { delay(5);//軟件消抖 if( (P3 & 0xf0) != 0xf0)//判斷是否有按鍵按下 { cord_l = P3 & 0xf0;// 儲存列線值 P3 = cord_l | 0x0f; cord_h = P3 & 0x0f;// 儲存行線值 while( (P3 & 0x0f) != 0x0f );//松手檢測 return (cord_l + cord_h);//返回鍵值碼 } } }void KeyPro(){ switch( KeyScan() ) { //矩陣鍵盤第一行第一個的鍵值碼 case 0xee: num++; break; } }void main(){ while(1) { KeyPro();// }}跪求大佬問為什么我按下了那個按鍵num不是1,而是亂跳的數值,用led燈看過數值
作者:
yfpc2006
時間:
2019-2-15 00:41
這代碼怎么看啊?貼個我用過的,僅作參考!
//4*4 鍵盤掃描
void Scan_KEY(void)
{
S8 = 0; //==16,12,13,15
S7 = 1;
S6 = 1;
S5 = 1;
__delay_us(1);
if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1) //未按下
{
S8 = 1;
S7 = 0; //10(0), 5, 14,11
S6 = 1;
S5 = 1;
KEY_num_16_bit = 0;
KEY_num_12_bit = 0;
KEY_num_13_bit = 0;
KEY_num_15_bit= 0;
KEY_num = 0;
if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1) //未按下
{
S8 = 1;
S7 = 1;
S6 = 0; //=====9, 4, 1, 6
S5 = 1;
KEY_num_10_bit = 0;
KEY_num_5_bit = 0;
KEY_num_14_bit= 0;
KEY_num_11_bit= 0;
KEY_num = 0;
if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1) //未按下
{
S8 = 1;
S7 = 1;
S6 = 1;
S5 = 0; //=8, 3, 2, 7
KEY_num_9_bit = 0;
KEY_num_4_bit = 0;
KEY_num_1_bit= 0;
KEY_num_6_bit= 0;
KEY_num = 0;
if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 1) //未按下
{
KEY_num_8_bit = 0;
KEY_num_3_bit = 0;
KEY_num_2_bit= 0;
KEY_num_7_bit= 0;
KEY_num = 0;
KEY_tmp = 0; //只能這里清零一次,或者不需要這個
}
else
{
++KEY_tmp;
if(KEY_tmp >= KEY_delay_OK) //去抖
{
KEY_tmp = 0;
if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1) //S1 + S4 按下
{
if(KEY_num_8_bit == 0)
{
KEY_num_8_bit = 1;
KEY_num = 8;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1) //S1 + S3 按下
{
if(KEY_num_3_bit == 0)
{
KEY_num_3_bit = 1;
KEY_num = 3;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1) //S1 + S2 按下
{
if(KEY_num_2_bit == 0)
{
KEY_num_2_bit = 1;
KEY_num = 2;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0) //S1 + S1 按下
{
if(KEY_num_7_bit == 0)
{
KEY_num_7_bit = 1;
KEY_num = 7;
KEY_once_bit = 0;
}
}
}
}
}
else
{
++KEY_tmp;
if(KEY_tmp >= KEY_delay_OK) //去抖
{
KEY_tmp = 0;
if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1) //S7 + S4 按下
{
if(KEY_num_9_bit == 0)
{
KEY_num_9_bit = 1;
KEY_num = 9;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1) //S7 + S3 按下
{
if(KEY_num_4_bit == 0)
{
KEY_num_4_bit = 1;
KEY_num = 4;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1) //S7 + S2 按下
{
if(KEY_num_1_bit == 0)
{
KEY_num_1_bit = 1;
KEY_num = 1;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0) //S7 + S1 按下
{
if(KEY_num_6_bit == 0)
{
KEY_num_6_bit = 1;
KEY_num = 6;
KEY_once_bit = 0;
}
}
}
}
}
else
{
++KEY_tmp;
if(KEY_tmp >= KEY_delay_OK) //去抖
{
KEY_tmp = 0;
if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1) //S6 + S4 按下
{
if(KEY_num_10_bit == 0)
{
KEY_num_10_bit = 1;
KEY_num = 10;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1) //S6 + S3 按下
{
if(KEY_num_5_bit == 0)
{
KEY_num_5_bit = 1;
KEY_num = 5;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1) //S6 + S2 按下
{
if(KEY_num_14_bit == 0)
{
KEY_num_14_bit = 1;
KEY_num = 14;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0) //S6 + S1 按下
{
if(KEY_num_11_bit == 0)
{
KEY_num_11_bit = 1;
KEY_num = 11;
KEY_once_bit = 0;
}
}
}
}
}
else
{
++KEY_tmp;
if(KEY_tmp >= KEY_delay_OK) //去抖
{
KEY_tmp = 0;
if(S4 == 0 && S3 == 1 && S2 == 1 && S1 == 1) //S5 + S4 按下
{
if(KEY_num_16_bit == 0)
{
KEY_num_16_bit = 1;
KEY_num = 16;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 0 && S2 == 1 && S1 == 1) //S5 + S3 按下
{
if(KEY_num_12_bit == 0)
{
KEY_num_12_bit = 1;
KEY_num = 12;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 0 && S1 == 1) //S5 + S2 按下
{
if(KEY_num_13_bit == 0)
{
KEY_num_13_bit = 1;
KEY_num = 13;
KEY_once_bit = 0;
}
}
else if(S4 == 1 && S3 == 1 && S2 == 1 && S1 == 0) //S5 + S1 按下
{
if(KEY_num_15_bit == 0)
{
KEY_num_15_bit = 1;
KEY_num = 15;
KEY_once_bit = 0;
}
}
}
}
}
//=END
作者:
ping264888
時間:
2019-2-15 08:34
沒看出來問題在哪里,可能碼需要處理一下沒有按鍵時候的情況, 下面是我用的4*4鍵盤掃描程序。
uchr keyscan()
{
uchr keyL,keyH;
GPIO_KEY = 0x0f; //行線置0
keyH = GPIO_KEY & 0x0f; //取行值
if(keyH != 0x0f) //檢查是否有見按下
{
delayms(10); //去抖
keyH = GPIO_KEY & 0x0f; //取行值
if(keyH != 0x0f)
{
keyH = GPIO_KEY & 0x0f; //取行值
GPIO_KEY = keyH | 0xf0; //輸出列線
keyL = GPIO_KEY & 0xf0; //取列值
return keyL + keyH;
}
}
return 0xff;
}
uchr getkey()
{
uchr key,v;
key = keyscan();
switch(key)
{
case 0xd7: v=key0; break;
case 0xeb: v=key1; break;
case 0xdb: v=key2; break;
case 0xbb: v=key3; break;
case 0xed: v=key4; break;
case 0xdd: v=key5; break;
case 0xbd: v=key6; break;
case 0xee: v=key7; break;
case 0xde: v=key8; break;
case 0xbe: v=key9; break;
case 0xe7: v=keyleft; break;
case 0xb7: v=keyright; break;
case 0x7e: v=keyup; break;
case 0x7d: v=keydown; break;
case 0x77: v=keyent; break;
case 0x7b: v=keynone; break;
default: v=keynull; break;
}
while(key == keyscan() && key != keynull);
return v;
}
復制代碼
作者:
wulin
時間:
2019-2-15 08:36
//P3 4*4矩陣鍵盤,P1 LED 顯示鍵值
#include <reg52.h>
#define uint unsigned int //宏定義無符號整型數據
#define uchar unsigned char //宏定義無符號字符型數據
uchar key=0; //定義鍵值全局變量
void keyscan() //按鍵掃描程序
{
static bit sign=0; //按鍵自鎖標志
static uint count=0; //消抖計數變量
uchar num=0; //臨時變量
P3=0xf0; //賦值P3 1111 0000
if(P3!=0xf0) //檢測有按鍵按下
{
count++; //消抖計數
if((count>=500)&&(sign==0))//100~1000,根據主循環周期調整約10~20ms
{
sign=1; //按鍵自鎖標志置1
num=P3; //保存P3值xxxx 0000,x為0或1
num|=0x0f; //保存num按位或0x0f值xxxx 1111
P3=num; //賦值P3 xxxx 1111
num=P3; //保存P3值xxxx xxxx
switch(num)
{
case 0xee: key= 1; break;
case 0xde: key= 2; break;
case 0xbe: key= 3; break;
case 0x7e: key= 4; break;
case 0xed: key= 5; break;
case 0xdd: key= 6; break;
case 0xbd: key= 7; break;
case 0x7d: key= 8; break;
case 0xeb: key= 9; break;
case 0xdb: key=10; break;
case 0xbb: key=11; break;
case 0x7b: key=12; break;
case 0xe7: key=13; break;
case 0xd7: key=14; break;
case 0xb7: key=15; break;
case 0x77: key=16; break;
}
}
}
else //鍵抬起
{
sign=0; //按鍵自鎖標志清0
count=0; //消抖計數清0
}
}
void main() //主函數
{
while(1)
{
keyscan(); //按鍵掃描程序
P1=~key; //LED顯示鍵碼1~16,低電平亮
}
}
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1