求助:有关缓冲区的问题。各位大虾,帮帮忙吧,谢谢了~~~

bangchuI   2009-9-17 17:05 楼主
我现在用51系列单片机做的设计中,需要比较两个缓冲区中的值是否相同,这个要怎么比较呢??需要设置缓冲区?

回复评论 (7)

说具体点,干什么的缓冲区,有多大
点赞  2009-9-17 17:11
就是这样的,键盘扫描程序中,需要识别按键的值(至少要识别5个键值),所以我打算用双缓冲的办法去比较按下的键值,现在这两个buffer中的值我怎么样去读出然后确定是否真的按下了。
不知道我说明白了没的??
还是谢谢你哦~
点赞  2009-9-17 17:14
你是独立键盘还是矩阵键盘(不过好像5个不能构成矩阵)。键盘扫描没必要用到双缓冲啊,你告诉我你那几个键的链接和按下时的电平,我帮你写段
点赞  2009-9-17 19:11
需要8*8的矩阵键盘。只是说要按下5个键后,要准确的识别键值,然后再发音。 我现在才在做系统需要的流程图,然后再写代码。就是不知道两个缓冲区里的键值要怎么样进行比较、读取。很惆怅~~~谢谢你哦。哦,对了,用双缓冲的目的就是第一个缓冲中存第一次扫描到的键值,10ms的延时后将读取到的键值存入到第二个缓冲中,两个进行比较,确实在两个中都有的则发音,缓冲1中有,缓冲2里没有的,就关音。两个缓冲中的键值是否一样怎么实现呢?(我说明白了么?)
点赞  2009-9-18 09:35
两个缓冲区,可以用数组表示。然后两个数组元素之间做异或运算,通过循环完成整个键值的运算。例如key1[n]和key2[n]做异或。然后按位分别查一下是否为一,如果为一,说明键位有变化,然后在判断键位是否有效就可以了。
点赞  2009-9-18 10:42
匆匆忙忙写的,如果有问题再找我吧,你先试试看,记住先把对应口线改了
#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;  //蜂鸣器叫                                                         //其他的你自己修改吧
           }
         }
}
点赞  2009-9-19 23:10
谢谢楼上了,非常感谢。
点赞  2009-9-22 10:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复