您的位置 首页 嵌入式

AVR M16 试验之五 矩阵键盘

***********************************************************************文件名称:mainc*程序作者:kidcao1987*程序

/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版别: V1.0
* 功用描绘: 按动16个按键,在数码管上显现“0~e” 这16个16进制的数字。
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
#include
#include

#define uint unsigned int
#define uchar unsigned char

unsigned char const LedData[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char const LedPos[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar n,x,key;

void HC595send(uchar x);
void init(void);
void HC595shift(void);
void HC595store(void);
void display(uchar pos,uchar dat);
uchar keyscan(void);
void init(void);

int main(void)
{
init();
while(1)
{
display(n,keyscan());
}
}
void init(void)
{
DDRB=0xff;
PORTB=0xff;
}
uchar keyscan(void)
{
uchar temp=0;

PORTA=0xef;
DDRA=0xf0; //设置行线电平,留意先PORTx再DDRx
temp=PINA; //读取列线电平
temp&=0x0f; //屏蔽行线电平
if(temp!=0x0f) //判别是否有按键按下
{
_delay_ms(20); //有按键按下,延时消抖
temp=PINA; //消抖后再读列线电平
temp&=0x0f; //屏蔽行线电平
if(temp!=0x0f) //判别是否颤动
{
temp=PINA; //确认不是颤动,读取列线
switch(temp) //依据列线电平给按键赋值
{
case 0xee:key=0;break;
case 0xed:key=1;break;
case 0xeb:key=2;break;
case 0xe7:key=3;break;
}
}
while(temp!=0x0f) //松手检测
{
temp=PINA;
temp&=0x0f;
}
}
//以下为第二到第四行扫描,只需要更改行线电平
PORTA=0xdf;
DDRA=0xf0;
temp=PINA;
temp&=0x0f;
if(temp!=0x0f)
{
_delay_ms(20);
temp=PINA;
temp&=0x0f;
if(temp!=0x0f)
{
temp=PINA;
switch(temp)
{
case 0xde:key=4;break;
case 0xdd:key=5;break;
case 0xdb:key=6;break;
case 0xd7:key=7;break;
}
}
while(temp!=0x0f)
{
temp=PINA;
temp&=0x0f;
}
}

PORTA=0xbf;
DDRA=0xf0;
temp=PINA;
temp&=0x0f;
if(temp!=0x0f)
{
_delay_ms(20);
temp=PINA;
temp&=0x0f;
if(temp!=0x0f)
{
temp=PINA;
switch(temp)
{
case 0xbe:key=8;break;
case 0xbd:key=9;break;
case 0xbb:key=10;break;
case 0xb7:key=11;break;
}
}
while(temp!=0x0f)
{
temp=PINA;
temp&=0x0f;
}
}

PORTA=0x7f;
DDRA=0xf0;
temp=PINA;
temp&=0x0f;
if(temp!=0x0f)
{
_delay_ms(20);
temp=PINA;
temp&=0x0f;
if(temp!=0x0f)
{
temp=PINA;
switch(temp)
{
case 0x7e:key=12;break;
case 0x7d:key=13;break;
case 0x7b:key–;break;
case 0x77:key++;break;
}
}
while(temp!=0x0f)
{
temp=PINA;
temp&=0x0f;
}
}
return key;
}
void HC595send(uchar x)
{
uchar n,temp;
for(n=0;n<8;n++)
{
temp=x&0x80;
if(temp!=0)
{
PORTB|=(1<HC595shift();
}
else
{
PORTB&=~(1<HC595shift();
}
x<<=1;
}
}
void HC595store(void)
{
PORTB|=(1<PORTB&=~(1<}
void HC595shift(void)
{
PORTB|=(1<PORTB&=~(1<}
void display(uchar pos,uchar dat)
{
HC595send(LedPos[pos]);
HC595send( LedData[dat]);
HC595store();
}

视频地址:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/258824.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部