单片机键盘扫描程序

单片机键盘扫描程序,第1张

2*3的键盘,太简单了,不值得用循环,特别是双重循环。

最简明、高效的程序如下:

sbit P10 = P1^0

sbit P11 = P1^1

sbit P12 = P1^2

sbit P13 = P1^3

sbit P14 = P1^4

char scan_key(void)

{

P13 = 0

if (!P10) return 0

if (!P11) return 1

if (!P12) return 2

P13 = 1

P14 = 0

if (!P10) return 3

if (!P11) return 4

if (!P12) return 5

}

本程序,使用的变量最少,也不涉及其它接口。

代码最少,执行效率最高。

// 你要看得懂代码首先你要了解按键扫描的原理

// k_input是Px 8个IO (x=0/1/2/3)

uchar keys()

{

     uchar i,j,k_in,k_out=0xfe,jm 

     k_input=0x0f        // 步骤1:Px7~Px4为低,Px3~Px0为高

     if(k_input!=0x0f)   // 步骤2:是否有按键按下,如果有,Px的值将发生变化

         yanshi(10)     // 软件消除抖动

     else

         return 16      // 如果没有,返回空键值  

 

     for( jm=0 jm<4 jm++)    // 扫描是哪个按键按下

     {

         k_input=k_out        // 步骤3:从Px0这一列开始扫描

         k_int=k_input        // 这里应该是k_in

         j=0x01

         for(i=0i<4i++)      // 步骤4:逐个扫描这一列上面的4个按键

         {

             if(~(k_in>>4)&j)  // 如果有按键按下,返回被按下的按键值 

                 return (jm*4+i) 

             j=_crol_(j,1)  // 如果没有按键按下,依次扫描这一列的其他按键        

         }

         k_out=crol_(k_out,1) // 步骤5:移位,依次扫描另一列,直到检测到按键按下

     }    

     return 16    // 如果没有扫描到按键,认为是误触发,返回空键值

}

我给你个键盘扫描程序 灯亮那个就很简单了!你自己改改吧 有问题再叫我哦!

//-----------------------------返回码-----------------------------

// P1.4 P1.5 P1.6 P1.7

// P1.0 0x11 0x21 0x41 0x81

// P1.1 0x12 0x22 0x42 0x82

// P1.2 0x14 0x24 0x44 0x84

// P1.3 0x18 0x28 0x48 0x88

// 无按键返回0

//----------------------------------------------------------------

//-----------------------------头文件-----------------------------

#include <reg51.h>

//----------------------------------------------------------------

//-----------------------------宏定义-----------------------------

#define uchar unsigned char

#define uint unsigned int

#define KEYPORT P3 //键盘扫描端口

//--------------------------------------------------------------------

//-----------------------------延迟函数-----------------------------

static void vDelay_uint(uint m)

{

for (m>0m--)

}

//-----------------------------按键扫描函数-----------------------------

uchar ucKb4X4_Scan(void)

{ uint m //用作连续按键的延时

uchar sccode,recode //sccode表示行,recode表示列,ucKeyVal表示返回码

KEYPORT=0xf0 //付初值KEYPORT = 11110000

if ((KEYPORT&0xf0)!=0xf0) //判断是否有按键,有按键则不为初值

{

vDelay_uint(200) //延时去抖动

if ((KEYPORT&0xf0)!=0xf0)

{

sccode=0xfe //使sccode = 11111110

while ((sccode&0x10)!=0) //用于循环4次因为是4*4键盘

{

KEYPORT=sccode

if ((KEYPORT&0xf0)!=0xf0) //判断按键是否在此行

{

recode=(KEYPORT&0xf0)|0x0f //确定列的位置

for (m=0((KEYPORT&0xf0)!=0xf0)&&(m<10000)m++)

//用m做一个10000次的延迟,(P1&0xf0)!=0xf0用于判定是否还在按着,

//如果是延迟20000次返回一次值码

vDelay_uint(10000) //延时10000次,共20000次返回一次值码

return((~sccode)+(~recode)) //返回按键码

}

else

sccode=(sccode<<1)|0x01 //不在此行下移一行

}

}

}

return(0) //无按键返回0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8136628.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存