单片机C语言 键盘编程问题 做的 关于密码锁 数码管显示 希望解答 大侠们!!!!!!

下面是我的键盘扫描程序,0-9是输入
12代表输入密码 13代表修改密码 14代表确认键
现在当检测到有12或13按下时 ,就做相应处理,
我现在编程有点混乱,就是数码管显示有点混乱!!!
{while扫描那里和处理之间关系不清楚!}

你们给我个思路 行吗?谢谢了 就需要个大体框架
uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j = 0; j < 4; j++) { //循环四次
P1 = Buffer[j]; //在P1高四位分别输出一个低电平
temp = 0x01; //计划先判断P1.0位
for(i = 0; i < 4; i++) { //循环四次
if(!(P1 & temp)) //从P1低四位,截取1位
return (4* i + j ); //返回取得的按键值
temp <<= 1; //判断的位,左移一位
} }

void Main(void)
{
uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值

while(1)
//---------以下读入按键、消抖、等待按键释放
{
P1 = 0xff;
Key_Temp1 = Keyscan(); //先读入按键
if(Key_Temp1 != 16) { //如果有键按下
//Delay_1ms(10); //延时一下

Display(Key_Value); //可用显示代替延时

Key_Temp2 = Keyscan(); //再读一次按键

if (Key_Temp1 == Key_Temp2) {//必须是两次相等

Key_Value = Key_Temp1;//
获得键值之后。。。。。。。。。。。。。。}

给你个框架看看
#define N 4
#dfeine INPUT 12
#define CHG 13
#define CONFIRM 14
#define idle 0
#define inputpass 1
#define chgpass 2
#define waitconfirm 3
#define end 4

unsigned char keyscan()
{
unsigned char key,tempkey;
//get key
//delay()
//confirm key
//return key
}

void show_Led(/***/)
{
//show something on leds
}

void main(void)
{
unsigned char State = idle,Key_Value,Pass[4] = {0},passCNT;
while(1)
{
Key_Value = keyscan();
switch(State)
{
case idle:{
if(INPUT == Key_Value) State = inputpass;
if(ICHG == Key_Value) State = chgpass;
State = idle;
show_Led(/*idle*/);
break;
}
case inputpass:{

if(/*Key_Value != CHG && != INPUT* && passCNT++ < N/)
{/*get pass into Pass[] & show_Led()*/}
else
{
if(passCNT == N)
{
State = waitconfirm;
}
else
{
State = idle; /*state error!*/
show_Led(/*error then idle*/);
}
}
break;
}
case chgpass:{
/*see inputpass*/
}
case waitconfirm:{
if(CONFIRM == Key_value){State = end ;};
else{/*if timeout( State = idle)*/}
break;
}
case end:{
/* add do pass check*/

}
default :{
State = idle;
show_Led(/*idle*/);
break;
}
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-29
你把按键扫描写成一个子程序,,然后再主程序当中不停的循环扫描,,。。
相似回答