原创 实验9-键盘扫描

2006-10-3 21:48 4474 13 13 分类: MCU/ 嵌入式

#include
#include <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


/********************/
unsigned char table[]=
   {0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
   //
共阴数码管 0-9
/********************/  
sbit seclet_A = P1^0; //
管脚定义 74-138 3-8 控制信号线
sbit seclet_B = P1^1;
sbit seclet_C = P1^2;
/********************/  //
宏定义  
#define  SM_1  seclet_C=0;seclet_B=0;seclet_A=0
#define  SM_2  seclet_C=0;seclet_B=0;seclet_A=1
#define  SM_3  seclet_C=0;seclet_B=1;seclet_A=0
#define  SM_4  seclet_C=0;seclet_B=1;seclet_A=1
#define  SM_5  seclet_C=1;seclet_B=0;seclet_A=0
#define  SM_6  seclet_C=1;seclet_B=0;seclet_A=1
#define  SM_7  seclet_C=1;seclet_B=1;seclet_A=0
#define  SM_8  seclet_C=1;seclet_B=1;seclet_A=1


bit flag;   //定义中断 标志位
    
//==================================
键盘程序
code unsigned char key_tab[16]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,
    0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7};


unsigned char ReadKey(void);   //扫描键盘 返回键值



//=============      
void main(void) 
{
 
     
    EA="1";   //
开启总中断
    EX0=1;    //
开启外部中断 0
    IT0=1;        //
设置成 下降沿触发方式
   SM_1;
   while(1)
   {
        P0=0XF0;   //
预置P0 口准备读取键值
        if(flag)     //检测时候 进入中断
        {
           
          P2=table[ReadKey()];   //
读取键值,并附给P2口显示
          flag=0;   //
清除 标志位
        }
       
    }
}
//========**************=====      
void key_scan()   interrupt 0    //
外部中断的优先级最高        
{       //
所以用 0
 flag=1;  //置标志位为 1
}
//========**************===== 
//
这个程序有一定的难度   
unsigned char ReadKey(void)
{
 unsigned char i,j,key;
 j=0xfe;       //
预置 准备 扫描
 
 for(i=0;i<4;i++)  //
循环四次 扫描
   {
    P0=j;      //
附值给P0
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();     
    if((P0&0xf0)!=0xf0)   //
如果有按键 按下
    { 
      key=P0;   //
读取键值
      break;   //
跳出for 循环 或者 while 循环
    } 
    j=_crol_(j,1);       //
循环左移 处理  
 
     key="0xff";
  }
  for(i=0;i<16;i++)   //
循环16 查表的到相应的键值
   if(key==key_tab)   
   return i;    //
返回键值


  return 0x10;       //否则 返回错码
}


 点击看大图


 

点击看大图


 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
13
关闭 站长推荐上一条 /3 下一条