//文件名:delay_rest.c
//文件描述:实现按键控制LED 灯的亮灭,按一下亮,再按一
//下灭,如此循环往复。
//实验目的:学习AVR 单片机的I/O口如何配置为输入和输出
//当前版本号:V1.0
//---------------------------------------------------------------------
//----------------------------start------------------------------------
#include"iom88v.h"
#define uint16 unsigned int
#define uchar unsigned char
void delay (uint16 i);
void key_scnf(void);
uchar count_key=0;
void main(void)
{
// DDRC &= 0XFE; //PC0 input
DDRC |= 0x02; //PC1 output
while(1)
{
key_scnf( );
if(count_key)
{
PORTC |= 0x02; //PC1 = 1;
}
else
{
PORTC &= 0xfd; //PC1 = 0;
}
}
}
//-------------------------------------------------------------------
//函数原型:void delay (uint16 i);
//入口参数:uint16 i:延时变量
//出口参数:无
//功能:实现延时功能
//-------------------------------------------------------------------
void delay (uint16 i)
{
uchar j;
while(i--)
{
for(j=125;j>0;--j)
{
;
}
}
//-------------------------------------------------------------------
//函数原型:void key_scnf(void);
//入口参数:无
//出口参数:无
//功能:实现读键值功能
//-------------------------------------------------------------------
void key_scnf(void)
{
uchar c_pinb;
DDRB |= 0x20; //RB5设置为输出
PORTB |= 0x20; //RB5输出1
//delay(1); //延时一段时间
DDRB &= 0xdf; //RB5 设置位输入 =0
c_pinb = PINB;
if((c_pinb&0x20)!=0x20) //判断portb5的键有无按下
{
delay(1);//延时消抖
//DDRB |= 0x20; //RB5设置为输出//注释掉的部分,不必须
//PORTB |= 0x20; //RB5输出1
//delay(1); //延时一段时间
// DDRB &= 0xdf; //RB5 设置位输入 =0
c_pinb = PINB;
if((c_pinb&0x20)!=0x20) //真的按下
{
//DDRB |= 0x20; //RB5设置为输出
//PORTB |= 0x20; //RB5输出1
//delay(1); //延时一段时间
// DDRB &= 0xdf; //RB5 设置位输入 =0
//c_pinb = PINB;
while((c_pinb&0x20)!=0x20) //按键没弹起,等键释放;关键,开始时写成!=0出错
{
//DDRB |= 0x20; //RB5设置为输出
//PORTB |= 0x20; //RB5输出1
//delay(1); //延时一段时间
// DDRB &= 0xdf; //RB5 设置位输入 =0
c_pinb = PINB;
}
count_key += 1;
if(count_key==2)
count_key = 0;
}
}
}