原创 中断按键LED显示程序

2009-5-3 17:52 2451 4 6 分类: MCU/ 嵌入式

        程序由2个文件构成,main.c文件和key.c文件,以及对应的main.h文件和key.h文件。使用keil C51和proteus调试成功,键盘程序采用行列扫描式。程序还有不少不足之处,还请各位指正。


点击看大图


key.c文件:


#include<reg51.h>
#include"key.h"


void keyscan(void)  // 行列扫描式键盘处理子程序
{
 unsigned char scancode;
 for(;;) 
 { 
  scancode=0xef;  //扫描第一行
  P1=scancode;  //送扫描码
  keycode=P1;   //取键值
  if((keycode&0x0f)!=0x0f)  //判断有健按下否
  {
   keycode=~keycode;    //键值取反
   switch(keycode)
   {
    case 0x11:P2=led[0];break;
    case 0x12:P2=led[1];break;
    case 0x14:P2=led[2];break;
    case 0x18:P2=led[3];break;
    default:P2=0xff;break;
   }
  }
  scancode=0xdf;  //扫描第二行
  P1=scancode;  //送扫描码
  keycode=P1;   //取键值
  if((keycode&0x0f)!=0x0f)  //判断有健按下否
  {
   keycode=~keycode;    //键值取反
   switch(keycode)
   {
    case 0x21:P2=led[4];break;
    case 0x22:P2=led[5];break;
    case 0x24:P2=led[6];break;
    case 0x28:P2=led[7];break;
    default:P2=0xff;break;
   }
  }
  scancode=0xbf;  //扫描第三行
  P1=scancode;  //送扫描码
  keycode=P1;   //取键值
  if((keycode&0x0f)!=0x0f)  //判断有健按下否
  {
   keycode=~keycode;    //键值取反
   switch(keycode)
   {
    case 0x41:P2=led[8];break;
    case 0x42:P2=led[9];break;
    case 0x44:P2=led[10];break;
    case 0x48:P2=led[11];break;
    default:P2=0xff;break;
   }
  }
  scancode=0x7f;  //扫描第四行
  P1=scancode;  //送扫描码
  keycode=P1;   //取键值
  if((keycode&0x0f)!=0x0f)  //判断有健按下否
  {
   keycode=~keycode;    //键值取反
   switch(keycode)
   {
    case 0x81:P2=led[12];break;
    case 0x82:P2=led[13];break;
    case 0x84:P2=led[14];break;
    case 0x88:P2=led[15];break;
    default:P2=0xff;break;
   }
  }
 }
 return;
}


key.h文件:


#ifndef _key_h
#define _key_h


extern unsigned char keycode;
extern unsigned char code led[];


void keyscan(void);


#endif
main.c文件:


#include<reg51.h>
#include"main.h"


unsigned char keycode="0xff";
unsigned char code led[]={0xc0,0xf9,0xa4,0xb0,0x99,
                          0x92,0x82,0xf8,0x80,0x90,
              0x88,0x83,0xc6,0xa1,0x86,0x8e,};  //共阳极数码管显示代码


void key_isr(void) interrupt 0  //中断服务子程序
{
 keyscan();  //调用键盘扫描子程序
 return;
}


int main(void)
{
 IT0=1;  //设置边沿触发模式  
 EA=1;  
 EX0=1;  //开中断
 P2=keycode; 
 P1=0x0f;  //初始化端口
 for(;;)  //等待中断
  ;
 return 0;
}


main.h文件:


#ifndef _main_h
#define _main_h


extern void keyscan(void);


void key_isr(void);


#endif

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

tengjingshu_112148725 2009-5-3 22:45

上面不是有protus的图吗?

用户403611 2009-5-3 15:31

电路图如何连接呢?
相关推荐阅读
用户518079 2011-05-14 00:13
嵌入式系统与FPGA的最新动向
嵌入式处理器:2011年有望增长12%,中国设计增幅高于全球   据Semico Reserch资深分析师Tony Massimini介绍[1],2010年,微逻辑组件(微处理器、微控制器和DSP)的...
用户518079 2011-05-14 00:11
苹果-三星的合作关系变质
苹果公司和三星公司一度曾是非常紧密的合作关系,不过现在,这两家公司却闹了起来,此举将较大幅度的降低三星公司市场份额。据报道,2010年苹果公司在三星订购了数量惊人的DRAM,NAND闪存以及其他半导...
用户518079 2011-05-14 00:10
英特尔3D晶体管引发的震动:ARM继续打低功耗牌么?
这两日,半导体产业界被一个消息所震撼:英特尔宣布自己将彻底告别传统的平面晶体管,只身进入一个3D架构、22nm制程的新纪元——这个芯片巨人新推出的处理器(代号Ivy Bridge),将由其自行研发的3...
用户518079 2010-12-19 22:00
经典回复!
( 我靠 ! )此回复虽有且仅有两个字,却深刻地表达了回复人的深深的祝福与刻骨的情感,可谓言简意赅,一字千金,字字扣人心弦,字字催人泪下,足可见回复人扎实的文字功底和信手拈来的写作技巧及惨绝人环的创新...
用户518079 2010-08-13 12:13
实例说明PID(转)
PID实指“比例proportional”、“积分integral”、“微分derivative”,如果我们要求被控制的对象最终趋于一个稳定的结果,一般就可以使用PID算法。假设说,有一辆速度为1m/...
用户518079 2010-08-13 12:06
延迟实现八位的PWM
八位的PWM:unsigned char i;while(1){        P1^1 = 1;        delay(i);        P1^1 = 0;        delay(256...
EE直播间
更多
我要评论
2
4
关闭 站长推荐上一条 /3 下一条