zl0801的个人空间 https://blog.eetop.cn/zl0801 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

9-键盘扫描

已有 661 次阅读| 2006-10-1 23:12 |个人分类:开发板实验

天气: 晴朗
心情: 高兴

 

#include <reg51.h>
#include <intrins.h>

/********************/
unsigned char table[]=
   {0x3f,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[i])   
   return i;    //
返回键值

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

 

 

 


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 16

    评论
  • 908

    访问数

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-16 03:48 , Processed in 0.030943 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部