在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2308|回复: 0

9-键盘扫描

[复制链接]
发表于 2006-10-1 23:12:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x








#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  的优先级最高        
{       //
所以用 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;       //否则 返回错码
}











附件:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


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

GMT+8, 2024-11-26 11:51 , Processed in 0.015565 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表