Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1562779
  • 博文数量: 354
  • 博客积分: 8137
  • 博客等级: 中将
  • 技术积分: 5137
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 15:40
文章分类

全部博文(354)

文章存档

2010年(300)

2009年(54)

分类: 嵌入式

2010-04-22 10:09:42

/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版本: V1.0
* 功能描述: 按动左下角的四个独立按键,在数码管上会显示“1~4”,这四个不同的数字。
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:
**********************************************************************/
#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);

int main(void)
{
while(1)
{
x=keyscan(); //按键扫描,返回值存于全局变量X中
if(x) //当有按键按下时显示
{
init(); //设置数码管控制端口
display(0,x); //显示扫描值
}
}
}
void init(void)
{
PORTB=0x00;//B口全部低电平
DDRB=0xff;//B口全部输出
}
uchar keyscan(void) //键盘扫描函数,返回值对应按键
{
uchar temp=0,key_value=0; //定义局部变量
PORTB|=(1<<0);
DDRB&=~(1<<0); //设置PB0为输入口,使用上拉电阻,高阻态
temp=PINB; //读PB口电平
key_value=(temp&0x01); //保留最低位,屏蔽其他端口干扰
if(key_value==0) //第一次判断是否有按键按下
{
_delay_ms(20); //有按键按下,延时消抖
temp=PINB; //读PB口电平
key_value=(temp&0x01);//保留最低位,屏蔽其他端口干扰
if(key_value==0) //再次判断是否有按键按下
{
key=1; //消抖之后再次确认有按键按下,则表示按键确实按下
}
}
while(!key_value) //送手检测
{
temp=PINB;
key_value=(temp&0x01);
}
/*以下扫描方式流程与上类同*/
PORTD|=(1<<2);
DDRD&=~(1<<2);
temp=PIND;
key_value=(temp&0x04);
if(key_value==0)
{
_delay_ms(20);
temp=PIND;
key_value=(temp&0x04);
if(key_value==0)
{
key=2;
}
}
while(!key_value)
{
temp=PIND;
key_value=(temp&0x04);
}
PORTD|=(1<<6);
DDRD&=~(1<<6);
temp=PIND;
key_value=(temp&0x40);
if(key_value==0)
{
_delay_ms(20);
temp=PIND;
key_value=(temp&0x40);
if(key_value==0)
{
key=3;
}
}
while(!key_value)
{
temp=PIND;
key_value=(temp&0x40);
}
PORTD|=(1<<7);
DDRD&=~(1<<7);
temp=PIND;
key_value=(temp&0x80);
if(key_value==0)
{
_delay_ms(20);
temp=PIND;
key_value=(temp&0x80);
if(key_value==0)
{
key=4;
}
}
while(!key_value)
{
temp=PIND;
key_value=(temp&0x80);
}
/*以上扫描方式流程与上类同*/
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();
}


视频地址:

阅读(1606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~