搜索
bottom↓
回复: 2

傻孩子帮帮忙~

[复制链接]

出0入0汤圆

发表于 2009-4-13 11:08:47 | 显示全部楼层 |阅读模式
#include"reg51.h"  
uchar key_state=0;  
uchar key_temp,time=0;  

#define k1_1 1  
#define k1_2 2  
#define k1_3 3  
#define k1_4 4  
#define k2_1 5  
#define k2_2 6  
#define k2_3 7  
#define k2_4 8  
#define k3_1 9  
#define k3_2 10  
#define k3_3 11  
#define k3_4 12  
#define k4_1 13  
#define k4_2 14  
#define k4_3 15  
#define k4_4 16  


uchar keyscan()  
{  
uchar  key_value, key_line;  
uchar key_return = 0, i;  
switch(key_state)  
{  
case 0:  
key_line=0xEF;//0b 0000 1000  
for(i=0; i<4; i++)  
{  
P0=(key_line|0x0F);  
if(( P0&0x0F) == 0x0F)  
{  
key_line<<= 1;  
}  

///////////////  
else  
{  
key_value=P0;  
key_state++;  
break;  
}  
}  
break;  
//////////////////  
case 1:  
if(P0 == key_value)  
{  
key_value=P0;  
switch (key_value )  
{  
case 0xEE: //0b 1110 1000   
key_return = k1_1;  
break;  

case 0xED: //0b 1101 1000   
key_return = k1_2;  
break;  

case 0xEB: //0b 1011 1000   
key_return = k1_3;  
break;  

case 0xE7: //0b 0111 1000   
key_return = k1_4;  
break;  
//////////////////////////////  
case 0xDE: //0b 1110 0100   
key_return = k2_1;  
break;  

case 0xDD: //0b 1101 0100   
key_return = k2_2;  
break;  

case 0xDB: //0b 1011 0100   
key_return = k2_3;  
break;  

case 0xD7: //0b 0111 0100   
key_return = k2_4;  
break;  
/////////////////////////////////  
case 0xBE: //0b 1110 0010   
key_return = k3_1;  
break;  

case 0xBD: //0b 1101 0010   
key_return = k3_2;  
break;  

case 0xBB: //0b 1011 0010   
key_return = k3_3;  
break;  

case 0xB7: //0b 1011 0010   
key_return = k3_4;  
break;  

case 0x7E: //0b 1011 0010   
key_return = k4_1;  
break;  
case 0x7D: //0b 1011 0010   
key_return = k4_2;  
break;  
case 0x7B: //0b 1011 0010   
key_return = k4_3;  
break;  
case 0x77: //0b 1011 0010   
key_return = k4_4;  
break;  
/////////////////////////////  
}  
key_state=2;  
}  
else  
key_state=0;  
break;  
case 2:  
if(( P0&0x0F) == 0x0F)key_state=0;  
break;  
}  
return key_return;  
}  
////////////////////////////////////////  
void init_timer1()  
{  
TMOD=0x10;                   ///定时器1方式1  
TL1=0xDC;  
TH1=0X00;  
EA=1;  
ET1=1;  
TR1=1;  
}  
/////////////////////////////////  
time1()interrupt 3 using 1  
{  

key_temp = keyscan();  

}  
////////////////////  
void main()  
{  
init_timer1();  
while(1)  
{  
if(key_temp ==1)time=time+1;  //time等于75?  
if(key_temp ==2)time=key_temp; //time==2  
time_dis();  
}  
}  
我试着把例程改成51单片机的模式,有下列问题:
用上述按键程序,本来欲实现按一次键,time就增加一。  
但是却变成按一次键time+1不是一次加1,而是time一直往下加,我在case 1:里加上第二次得到的key_return值与第一次相同则不返回键值结果time就不会一直加了,key_return没变化吗?uchar key_return = 0没有作用,不知道为何?键盘程序可用,if(key_temp ==2)time=key_temp; 这段返回的是键值2.

出0入296汤圆

发表于 2009-4-13 15:22:04 | 显示全部楼层
在定时器触发的间隔, key_temp一直保持上一次的值……比如,上一次key_temp的值为1,
那么在下一次定时器触发前,主循环会一直检测到key_temp == 1的条件成立,于是,time就
一直加一,你检测到time = 75,恰好说明,再每次定时器触发的间隔,主循环一功能执行75次。

出0入0汤圆

 楼主| 发表于 2009-4-15 09:28:45 | 显示全部楼层
谢谢^_^,其实道理挺简单,当时怎么就没想明白呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 00:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表