| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 811 人关注过本帖
标题:问个c51的程序 是按键扫描的
只看楼主 加入收藏
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
结帖率:75%
收藏
 问题点数:0 回复次数:2 
问个c51的程序 是按键扫描的
程序代码:
#include
#define N    5

sbit SEG_En = P1^0;
sbit DIG_En = P1^1;
sbit LED_En = P1^2;
sbit Key_En = P1^3;

unsigned char Key_Value;


/***********************************************/
/*延时函数。                                   */
/***********************************************/
void delay_ms(unsigned int TData)
{
   unsigned int i,j;
   for(j=0; j<TDATA; J++)
      for(i=0; i<120; i++);
}


/***********************************************/
/*按键扫描函数                                 */
/***********************************************/
void key_scan()
{
   unsigned char TD;
   P0       = 0x00;
   SEG_En   = 1;
   DIG_En   = 1;
   SEG_En   = 0;
   DIG_En   = 0;

   P0       = 0xFE;                //扫描第一行
   DIG_En   = 1;
   DIG_En   = 0;
   Key_En   = 0;
   TD       = P0;
   switch(TD)  
   {
      case 0xFE : Key_Value = 0x00; break;
      case 0xFD : Key_Value = 0x01; break;
      case 0xFB : Key_Value = 0x02; break;
      case 0xF7 : Key_Value = 0x03; break;
      default   : break;
   }
   Key_En = 1;

   P0       = 0xFD;                //扫描第二行
   DIG_En   = 1;
   DIG_En   = 0;
   Key_En   = 0;
   TD       = P0;
   switch(TD)  
   {
      case 0xFE : Key_Value = 0x04; break;
      case 0xFD : Key_Value = 0x05; break;
      case 0xFB : Key_Value = 0x06; break;
      case 0xF7 : Key_Value = 0x07; break;
      default   : break;
   }
   Key_En = 1;

   P0       = 0xFB;                //扫描第三行
   DIG_En   = 1;
   DIG_En   = 0;
   Key_En   = 0;
   TD       = P0;
   switch(TD)  
   {
      case 0xFE : Key_Value = 0x08; break;
      case 0xFD : Key_Value = 0x09; break;
      case 0xFB : Key_Value = 0x0A; break;
      case 0xF7 : Key_Value = 0x0B; break;
      default   : break;
   }
   Key_En = 1;

   P0       = 0xF7;                //扫描第四行
   DIG_En   = 1;
   DIG_En   = 0;
   Key_En   = 0;
   TD       = P0;
   switch(TD)  
   {
      case 0xFE : Key_Value = 0x0C; break;
      case 0xFD : Key_Value = 0x0D; break;
      case 0xFB : Key_Value = 0x0E; break;
      case 0xF7 : Key_Value = 0x0F; break;
      default   : break;
   }
   Key_En = 1;
}

void main()
{                           
   unsigned char temp,i,j;
   unsigned char a[5];
  
   SEG_En    = 0;
   DIG_En    = 0;
   Key_En    = 1;
   LED_En    = 1;
   Key_Value = 0xFF;
   temp      = 0xFF;
   i         = 0x00;
   j         = N-1; 

   while(1)
   {
      key_scan();
      if(i == N)
      {        
         P0     = a[j] << 4;
         LED_En = 0;
         delay_ms(500);
         LED_En = 1;
         delay_ms(500);
         j++;
         if(j == N)
            j = 0x00;                 
      }
      else
      {
         if(Key_Value != 0xFF)
         {        
            P0     = Key_Value << 4;
            LED_En = 0;
            delay_ms(20);
            LED_En = 1;

            if(temp != Key_Value)
            {              
                temp = Key_Value;
                a[i] = Key_Value;
                i++;
            }
         }
      }
   }
}







这里面while(1)
   {
      key_scan();
      if(i == N)
      {        
         P0     = a[j] << 4;
         LED_En = 0;
         delay_ms(500);
         LED_En = 1;
         delay_ms(500);
         j++;
         if(j == N)
            j = 0x00;                 
      }
      else
      {
         if(Key_Value != 0xFF)
         {        
            P0     = Key_Value << 4;
            LED_En = 0;
            delay_ms(20);
            LED_En = 1;

            if(temp != Key_Value)
            {              
                temp = Key_Value;
                a[i] = Key_Value;
                i++;
            }
         }
      }
   }
}尤其的不理解是什么意思啊 谁能帮我解释下
搜索更多相关主题的帖子: include 
2011-08-22 15:00
万仁全
Rank: 1
等 级:新手上路
帖 子:23
专家分:1
注 册:2011-8-31
收藏
得分:0 
这里应该是逐行扫描吧,动手在草稿纸上把流程写一遍就理解了
2011-09-15 21:17
lyh320218
Rank: 2
等 级:论坛游民
帖 子:10
专家分:10
注 册:2012-1-31
收藏
得分:0 
是进行硬件防抖动了么?如不是的话那还得加防拌动程序
2012-01-31 10:43
快速回复:问个c51的程序 是按键扫描的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022171 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved