51单片机键盘扫描c语言程序,简单的51单片机键盘C程序

爱你爱你94559711级分类:C/C++语言被浏览181次2013.05.26

#include "reg51.h"

#include "intrins.h"

#define uchar unsigned char

unsigned int updown=0; /*灯的流动方向*/

unsigned int start=0; /*灯开始流动显示*/

unsigned int stop=0; /*使灯停止流动显示*/

/*延时程序*/

void Delay(unsigned int time)

{

unsigned int j;

for(;time>0;time--)

{

for(j=0;j<124;j++)

{;}

}

}

/*按键获取程序*/

unsigned int Key()

{

uchar keyvalue;

keyvalue=P3;

keyvalue|=0xc3;

if((keyvalue|=0xc3)==0xff)

{

Delay(10);

if((keyvalue|=0xc3)==0xff)

{

return(0);

}

}

else

{

Delay(10);

if((keyvalue|=0xc3)!=0xff)

{

if((keyvalue|=0xfb)!=0xff)

{ return(1);}

if((keyvalue|=0xf7)!=0xff)

{ return(2);}

if((keyvalue|=0xef)!=0xff)

{ return(3);}

if((keyvalue|=0xdf)!=0xff)

{ return(4);}

}

}

}

/*按键处理程序*/

void Prokey(unsigned int keyvalue)

{

if(keyvalue==1)

{ start=1;

updown=1;

stop=0;

}

if(keyvalue==2)

{ start=1;

stop=1;}

if(keyvalue==3)

{ start=1;

updown=1;}

if(keyvalue==4)

{ start=1;

updown=0;}

}

void main()

{

unsigned int keyvalue; /*按键的数值*/

uchar lamp=0xfe; /*LED循环的数值*/

for(;;)

{

keyvalue=key(); /*获取按键值*/

Prokey(keyvalue);

if(start) /*开始灯的流动显示*/

{

if(stop)

{ P1=0xff;

lamp=0xfe;

}

else

{ if(updown)

{ P1=lamp;

lamp=_cror_(lamp,1);

}

else

{ P1=lamp;

lamp=_crol_(lamp,1);

}

}

Delay(500);

}

}

}

要完成的任务是:按下K1键,灯开始流动显示(由下往上);按下K2键,灯停止流动,所有灯为暗;按下K3键,灯由下往上流动;按下K4键。灯开始由上往下流动。

小弟自己编的程序,只能完成第一个任务,按下K2、K3、K4键都没用,请教各位大虾,这是什么原因???

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c语言实现单片机的键盘程序 #include "SST89x5x4.H" #include #define uchar unsigned char #define uint unsigned int #define _Nop() _nop_() unsigned char code Key_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff, 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void Key_Init(void); unsigned char GetScanKey(void); unsigned char GetKey(void); void LCD_Init(void); void LCD_Init2(void); //void WriteW(uint a); void CheckBF(void); unsigned char Key_ASC2(unsigned char); void WritD(unsigned char); void Delay_ns(int i); void Delay_ms(int ms); unsigned char key; unsigned char key_asc2; unsigned char bKeyUp_Flag; uchar xdata *ptr; //函数功能描述:键盘初始化,将标志位置1; void Key_Init(void) { bKeyUp_Flag=1;//标志(全局变量)位置1 } //函数功能描述:键盘扫描函数,得到键的行列位置; unsigned char GetScanKey(void) { unsigned char key, i, temp; unsigned char xdata * ptr; key=0xff; for (i=1; i<0x10; i<<=1) //i的低4位为行数位,行依次检测 循环4次 { ptr=0x8fff; //数码管位选地址 * ptr =i; temp = * ptr; //取键盘IO口的值 temp &= 0x0f; //屏蔽高四位 if (temp!=0x00) //是否有有效键值 { key = i<<4; //取行数位的值并将其放入返回值高4位 key|=temp; //列数位的值放入返回值低4位 break; } } return key; //返回行位(高四)和列位(低四) } /*函数功能描述:取键值,长按无效; unsigned char code Key_Value_Table[16]={0xff,0x00,0x01,0xff,0x02,0xff,0xff,0xff, 0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; 说明:计算因子,定义在函数外部。此数组在计算键值的中间过程起作用。比如右下方键按下(行列值为0x88),通过查找数组得到行对应的中间值0x03,列对应的中间值0x03。 */ unsigned char GetKey(void) { unsigned char key, temp; if (!bKeyUp_Flag) //判断标志,是0执行 /*按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,长按键无效返回无效值,直至按键无效返回无效按键值,置"1"标志位。按键输入恢复有效。屏蔽这部分则长按键有效*/ { key=GetScanKey(); if (key==0xff) //没有按键,置标志位 bKeyUp_Flag=1; else //保持按键 return 0xff; //因为0xff大于15,故为无效键值,实现长按键无效 } key=GetScanKey(); if (key==0xff) //没有按键 return key; else //有按键有效 temp=key; //取键值 Delay_ms(20); //延时20ms 消抖 key=GetScanKey(); //键盘扫描 if(key!=temp) //判断两次键值是否相同,排除干扰信号影响 确认有效信号 { key=0xff; return key; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值