我现在用51系列单片机做的设计中,需要比较两个缓冲区中的值是否相同,这个要怎么比较呢??需要设置缓冲区?
就是这样的,键盘扫描程序中,需要识别按键的值(至少要识别5个键值),所以我打算用双缓冲的办法去比较按下的键值,现在这两个buffer中的值我怎么样去读出然后确定是否真的按下了。
不知道我说明白了没的??
还是谢谢你哦~
你是独立键盘还是矩阵键盘(不过好像5个不能构成矩阵)。键盘扫描没必要用到双缓冲啊,你告诉我你那几个键的链接和按下时的电平,我帮你写段
需要8*8的矩阵键盘。只是说要按下5个键后,要准确的识别键值,然后再发音。 我现在才在做系统需要的流程图,然后再写代码。就是不知道两个缓冲区里的键值要怎么样进行比较、读取。很惆怅~~~谢谢你哦。哦,对了,用双缓冲的目的就是第一个缓冲中存第一次扫描到的键值,10ms的延时后将读取到的键值存入到第二个缓冲中,两个进行比较,确实在两个中都有的则发音,缓冲1中有,缓冲2里没有的,就关音。两个缓冲中的键值是否一样怎么实现呢?(我说明白了么?)
两个缓冲区,可以用数组表示。然后两个数组元素之间做异或运算,通过循环完成整个键值的运算。例如key1[n]和key2[n]做异或。然后按位分别查一下是否为一,如果为一,说明键位有变化,然后在判断键位是否有效就可以了。
匆匆忙忙写的,如果有问题再找我吧,你先试试看,记住先把对应口线改了
#include
#define hang P0 // 行输入低电平为有键按下,高电平为无键按下
#define lie P1 // 列输出低电平进行逐行扫描
#define speaker P2_1 //蜂鸣器低电平有效
volatile unsigned int key_number1,key_number2;
void delay_ms(unsigned int count) // 延时时间count*1ms
{ unsigned int i;
for(;count>0;count--)
{
for(i=0;i<110;i++);
}
}
unsigned int keyscanf(void)// 返回值为键盘扫描值高8为为行码,低8位为列码
{ unsigned char a,b,c,i;
unsigned int d ;
a=0;
b=0;
c=0XFE;
for(i=0;i<8;i++)
{ P1= c;
if(P0!=0xff)//如果有键按下
{ a=P0;
b=P1;
}
c=c<<1;
}
d=(a<<8)+b;
return d;
}
main()
{ while(1)
{key_number1=keyscanf() ;
delay_ms(10);
key_number2=keyscanf() ;
if((key_number1==key_number2)&&(key_number1==0xfefe)) //假设按下低8行第8列的键蜂鸣器叫
{ speaker=0; //蜂鸣器叫 //其他的你自己修改吧
}
}
}