|
//---------------------------------------------------------------------
//Copyright(c) 博控设计 joecongmin 2010 All righr reserved
//文件名:delay_rest.c
//文件描述:实现按键控制LED 灯的亮灭,按一下亮,再按一
// 下灭,如此循环往复。
//实验目的:学习AVR 单片机的I/O口如何配置为输入和输出
//当前版本号:V1.0
//完成时间:2010-4-6 9:48:19
//修改记录:
//修改时间:
//起草时间:
//---------------------------------------------------------------------
//----------------------------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;
}
}
}