查看: 1047|回复: 0
打印 上一主题 下一主题

020、4×4 矩阵式键盘识别

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-29 20:56:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/********************************************************************
                            汇诚科技
网址:http://www.ourhc.cn
产品有售淘宝店:http://shop36330473.taobao.com   
*********************************************************************/
#include <iom16v.h>
/********************************************************************
                数据类型定义
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
                数码管段码定义0123456789
*********************************************************************/
uchar Table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };         //所需的段的位码
uchar k;           
/**********************************************************************
                                  MS级延时函数程序,参数i 延时时间                                                  
**********************************************************************/
void DelayMS(uint i)
{
uint j;
for(;i!=0;i--)
{
for(j=800;j!=0;j--);
}
}
/**********************************************************************
                矩阵键盘函数
*********************************************************************/  
void Getch ( )
{
unsigned char X,Y,Z;
DDRD=0xF0;
PORTD=0x0F;
if(PIND!=0x0F) //判断是否有键按下
{
DelayMS(1); //延时,软件去干扰
if(PIND!=0x0F) //确认按键按下
{
X=PIND|0xF0;
DelayMS(1);
DDRD=0x0f;
PORTD=0xf0;
if(PIND!=0xf0) //判断是否有键按下
{
DelayMS(1); //延时,软件去干扰
if(PIND!=0xf0) //确认按键按下
{
Y=PIND|0x0F;
Z=X&Y; //取出键值
switch ( Z ) //判断键值(那一个键按下)
{
case 0xee: k=0; break; //对键值赋值
case 0xde: k=1; break;
case 0xbe: k=2; break;
case 0x7e: k=3; break;
case 0xed: k=4; break;
case 0xdd: k=5; break;
case 0xbd: k=6; break;
case 0x7d: k=7; break;
case 0xeb: k=8; break;
case 0xdb: k=9; break;
case 0xbb: k=10;break;
case 0x7b: k=11;break;
case 0xe7: k=12;break;
case 0xd7: k=13;break;
case 0xb7: k=14;break;
case 0x77: k=15;break;
} } } }}} //请注意写程序时的格式规范,此处是为了节省纸张  
//////////////////////////////初始化////////////////////////////////////
void Init_IO(void)//初始化I/O
{
//设置A口为输出
DDRA=0xFF;
PORTA=0xFF;
//设置B口为输出
DDRB=0xFF;
PORTB=0xFF;
//设置C口为输出
DDRC=0xFF;
PORTC=0xFF;
//设置D口为输入
DDRD=0x00;
PORTD=0xff;

}

/**********************************************************************
                                           主函数                                                         
**********************************************************************/
void main(void)
{
Init_IO();  //初始化I/O
while(1)
{
Getch();
PORTA=Table[k]; //查表LED输出
PORTC=0x0f; //输出相同的四位数据//仿真

}
}
/**********************************************************************
                                            结束                                         
**********************************************************************/





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表