原创 3×4矩阵键盘

2009-8-9 02:04 3332 3 4 分类: MCU/ 嵌入式
//以下程序模仿电话机键盘布局写成,LED0~LED4为按键测试指示作用,在键处理函数调用,使用时可以删掉,再添加实际的键处理函数即可。
电路图如下(晶振,复位电路没画上去,自行添加):
点击看大图



#include <REG52.H>  
#define KEY P1
sbit LED0=P3^0;
sbit LED1=P3^1;
sbit LED2=P3^2;
sbit LED3=P3^3;
sbit LED4=P3^4;

void delay(unsigned int N);
bit judge_hitkey();
unsigned char scan_key();
void key_manage(unsigned char keycode);
void manage_key1(void);
void manage_key2(void);
void manage_key3(void);
void manage_key4(void);
void manage_key5(void);
void manage_key6(void);
void manage_key7(void);
void manage_key8(void);
void manage_key9(void);
void manage_key*(void); 
void manage_key0(void);
void manage_key$(void);
void delay(unsigned int N)  //(16*N+24)uS的延时
{
unsigned int i;
for(i=0;i<N;i++);
}

bit judge_hitkey()
{
unsigned char scancode,keycode;            
   scancode=0x0f;
KEY=scancode;
keycode=KEY;
if(keycode==0x0f)
return(0);
else
return(1);
 }
 unsigned char scan_key()
 {
unsigned char scancode,keycode;
scancode=0xef;
while(scancode!=0xff)
{
KEY=scancode;
keycode=KEY;
if((keycode&0x0f)!=0x0f)
break;
scancode=(keycode<<1)|0x0f;
}
keycode=~keycode;
return(keycode);
 }
void manage_key0(void)
{
LED0=~LED0;
}
void manage_key1(void)
{
LED1=~LED1;
}
void manage_key2(void)
{
LED2=~LED2;
}

void manage_key3(void)
{
LED3=~LED3;
}

void manage_key4(void)
{
LED4=~LED4;
}

void  manage_key5(void)
{
}
void  manage_key6(void)
{
}
void  manage_key7(void)
{
}
void  manage_key8(void)
{
}
void  manage_key9(void)
{
}
void manage_key*(void)
{
}
void manage_key0(void)
{
}
void manage_key$(void)
{
}

void key_manage(unsigned char keycode)
{         
switch(keycode)
            { 
              case 0x12: manage_key1();break;
              case 0x14: manage_key2();break;
              case 0x18: manage_key3();break;
              case 0x22: manage_key4();break;
              case 0x24: manage_key5();break;
              case 0x28: manage_key6();break;
      case 0x42: manage_key7();break;
              case 0x44: manage_key8();break;
              case 0x48: manage_key9();break;
      case 0x82: manage_key*();break;
              case 0x84: manage_key0();break;
              case 0x88: manage_key$();break;  
 default:    break;
            }

}
void main()
{
unsigned char key_code;
while(1) 
{

if(judge_hitkey())
{
delay(1000); //延时20mS左右,防抖动
if(judge_hitkey())
{
key_code=scan_key();
while(judge_hitkey());
key_manage(key_code);
}
}  
}  


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-9-2 11:50

bu cuo
相关推荐阅读
用户216695 2009-08-17 00:08
Nios II 软核处理器相关
1、Nios II 是软核处理器,有三种运行模式:超级用户模式、用户模式和调试模式。目前有三种类型:Nios II/e、 Nios II/s、 Nios II/f,性能后一种比前一种好,但所耗资源相应...
用户216695 2009-08-16 21:01
51内核相关
   51内核采取冯.诺依曼结构,包括CPU、内部RAM、内部ROM、位处理器、定时器、串行口、并行口和中断控制系统等。下以80C51为例具体说明:内部RAM:共256个数据存储单元,分低128单元和...
用户216695 2009-08-16 21:00
ARM7TDMI处理器相关
1、 ARM7TDMI处理器内核   内核采用ARM v4 T结构实现,具有ARM和Thumb两种操作状态,支持7种处理器模式:用户(usr):程序正常工作模式快中断(fiq):中断(irq):用于通...
用户216695 2009-08-16 20:58
Quartus II(包括SOPC Builder) 和Nios II IDE生成的文件说明
以下由Quartus II生成.qpf 工程文件.bdf 原理图文件.ptf SOPCBuilder 系统文件,存储Nios II系统硬件内容,提供给NiosII为目标硬件编译相应软件.bsf 符号模...
用户216695 2009-08-12 20:17
单片机控制DS18B20测温度1602显示
//管脚连接见注释,其中1602的R/W我固定了为0电平。另外,1602的VL脚最好连接电位器的可调端,以选好偏压,否则会容易出现鬼影或屏幕无显示。#include<reg52.h>#in...
用户216695 2009-08-12 19:52
如何开机自动运行程序
开机运行程序或打开文件夹,只需把对应的程序或其快捷方式拖放到开始菜单的启动里面即可。“启动”文件夹对应的路径为:C:\Documents and Settings\Administrator\开始」菜...
我要评论
1
3
关闭 站长推荐上一条 /3 下一条