欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)矩陣按鍵掃描
[打印本頁(yè)]
作者:
楓樹566
時(shí)間:
2019-5-11 10:43
標(biāo)題:
單片機(jī)矩陣按鍵掃描
#ifndef __KEY_H
#define __KEY_H
#include "stc8.h"
#define GPIO_KEY P0 // 定義按鍵I/O口
/*
*函數(shù)名:delay_ms
*描述 :延時(shí)函數(shù)(ms級(jí))
*/
void delay_ms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*
*函數(shù)名:key_scan
*描述 :獲取按下的鍵值。
*返回值:鍵值
*/
unsigned char key_scan(void)
{
unsigned char keyvalue1='#',keyvalue2='#';
GPIO_KEY = 0xf0;
if(GPIO_KEY != 0xf0)
{
delay_ms(10);
if(GPIO_KEY != 0xf0)
{
//確定按下按鍵所在列數(shù):(或0或1或2或3),并賦值給keyvalue1
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case 0xe0: keyvalue1 = 3;break;
case 0xd0: keyvalue1 = 2;break;
case 0xb0: keyvalue1 = 1;break;
case 0x70: keyvalue1 = 0;break;
default:keyvalue='#';break;
}
//確定按下按鍵所在行數(shù):keyvalue1(或+0或+4或+8或+12),并賦值給keyvalue2
GPIO_KEY=0x0f;
if((GPIO_KEY != 0x0d)||(GPIO_KEY != 0x0b)||(GPIO_KEY != 0x07))
keyvalue2 = keyvalue1;
if(GPIO_KEY == 0x0d)
keyvalue2 = keyvalue1+4;
if(GPIO_KEY == 0x0b)
keyvalue2 = keyvalue1+8;
if(GPIO_KEY == 0x07)
keyvalue2 = keyvalue1+12;
while(GPIO_KEY!=0x0f);
}
}
return keyvalue2;
}
#endif
矩陣鍵盤引腳圖.PNG
(51.74 KB, 下載次數(shù): 45)
下載附件
2019-5-11 11:02 上傳
矩陣按鍵引腳圖
作者:
楓樹566
時(shí)間:
2019-6-27 10:41
本帖最后由 楓樹566 于 2019-6-27 18:29 編輯
矩陣按鍵修改版:(說(shuō)明:只有按下的瞬間返回值為鍵值,其他時(shí)間鍵值為16)
#include "key.h"
#define GPIO_KEY P0 // 重定義I/O口0
/*************************************************
* 函數(shù)名:delay_ms
* 描述 :延時(shí)函數(shù)
* 參數(shù) :xms , xms是幾延時(shí)幾毫秒
* 返回值:無(wú)
* 調(diào)用 :內(nèi)部調(diào)用
*************************************************/
void delay_ms(u16 xms)
{
unsigned char i, j;
unsigned int x;
for(x=xms;x>0;x--)
{
i = 16;
j = 147;
do
{
while (--j);
} while (--i);
}
}
/*************************************************
* 函數(shù)名:key_scan
* 描述 :把按下的矩陣按鍵的鍵值返回
* 參數(shù) :無(wú)
* 返回值:按下的鍵值
* 調(diào)用 :外部調(diào)用
*************************************************/
u8 key_scan()
{
u8 keyvalue1,keyvalue2,a=0;
GPIO_KEY = 0xf0; // 高四位為1,低四位為0
if(GPIO_KEY != 0xf0)
{
delay_ms(10); // 延時(shí)消抖
if(GPIO_KEY != 0xf0)
{
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case 0xe0: keyvalue1 = 3;break; // 確定矩陣按鍵被按下的位置是第幾列
case 0xd0: keyvalue1 = 2;break; // 0、1、2、3
case 0xb0: keyvalue1 = 1;break;
case 0x70: keyvalue1 = 0;break;
}
GPIO_KEY=0x0f;
// 確定矩陣按鍵被按下位置的鍵值:列(或0或1或2或3) + 行(或0或4或8或12)
if((GPIO_KEY != 0x0d)||(GPIO_KEY != 0x0b)||(GPIO_KEY != 0x07))
keyvalue2 = keyvalue1;
if(GPIO_KEY == 0x0d)
keyvalue2 = keyvalue1+4;
if(GPIO_KEY == 0x0b)
keyvalue2 = keyvalue1+8;
if(GPIO_KEY == 0x07)
keyvalue2 = keyvalue1+12;
while((a<50)&&(GPIO_KEY!=0x0f))
{
delay_ms(10);
a++;
}
}
}
if(GPIO_KEY==0xF0)
keyvalue2 = 16;
return keyvalue2;
}
這個(gè)方法可以實(shí)現(xiàn)按一次按鍵,變量值加1,長(zhǎng)按可以連續(xù)增加。
作者:
楓樹566
時(shí)間:
2019-6-27 16:51
經(jīng)典矩陣按鍵掃描:
unsigned char Check_key(void)
{
unsigned char row,col,temp1,temp2,keyvalue;
temp1 = 0x01;
for(row=0;row<4;row++) // 行掃
{
P0 = 0xF0; // 先將P0.4~P0.7置高
P0 = ~temp1; // 使P0.1~P0.3中有一位為0
temp1 *= 2; // temp1左移一位
if((P0 & 0xF0) < 0xF0) // 當(dāng)按鍵按下時(shí),(P0 & 0xF0) 高四位不在是F,可能為7或B或D或E。
{ // 這時(shí)可以確定按下的是(row+1)行
temp2 = 0x80;
for(col=0;col<4;col++) // 列掃
{
if((P0 & temp2)==0x00) // 當(dāng)(P0 & temp2)等于0x00時(shí),可以確定按下的位置是(col+1)列
{
keyvalue = row*4+col; // 得到所按下按鍵的鍵值
return keyvalue; // 把得到的鍵值作為返回值
}
temp2 /= 2; // temp2右移一位
}
}
}
return 16; // 因?yàn)槎x數(shù)碼管段選表中,16對(duì)應(yīng)的是全滅,故無(wú)按鍵按下時(shí)返回16
}
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1