/*刚刚开始学习AVR单片机,
*把学习到的知识和大家分享。有错误或者更好的写法,欢迎交流。
*方便新手学习,我都尽可能的注释
*/
#include <iom16v.h>
#include <macros.h>
#include <stdio.h> //标准输入输出头文件
#define LED_DDR DDRA //LED接PA0~PA7
#define LED_P0RT PORTA //指示灯
/*********************************
*按键定义
*******************************/
#define K1 PINC & (1<<PC0) //位读取 PC0 可以读取K1的电压值
#define K2 PINC & (1<<PC1) //位读取 PC1
#define K3 PINC & (1 << PC2) //位读取 PC2
#define K4 PINC & (1 << PC3) //位读取 PC3
#define K5 PINC & (1 << PC4) //位读取 PC4
#define K6 PINC & (1 << PC5) //位读取 PC5
#define K7 PINC & (1 << PC6) //位读取 PC6
#define K8 PINC & (1 << PC7) //位读取 PC7
unsigned char key_s,biaozhi;
void port_init(void) //IO端口初始化
{
DDRC=0xFF;
PORTC=0xff;
DDRB=0xff;
PORTB=0xff;
DDRD=0xff;
PORTD=0xff;
DDRA=0xff;
PORTA=0xff;
}
#pragma interrupt_handler timer1_ovf_isr:15 //dingsh中断函数
void timer1_ovf_isr()
{
TCNT1H=0XFB; //赋初值定义0.01s
TCNT1L=0X1D;
/***************************按键程序**************************************/
if(((K1)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}} //按键按下 key_s开始++,起到延时给按键去抖的作用
if(((K2)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K3)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K4)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K5)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K6)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K7)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K8)==0)&&(biaozhi==0)){key_s++;if(key_s>=2){biaozhi=1;key_s=0;a=~a;}}
if(((K1)!=0)&&((K2)!=0)&&((K3)!=0)&&((K4)!=0)&&((K5)!=0)&&((K6)!=0)&&((K7)!=0)&&((K8)!=0))
{biaozhi=0;key_s=0;} //按键判弹起
if(key_s>=4){key_s=0;biaozhi=1;}
}
void init_timer1() // 定时器1初始化
{
TCCR1B=0X03; //64分频
TIFR=0X01;
TIMSK=0X04;
TCNT1H=0XFB; //10ms
TCNT1L=0X1D;
SREG|=BIT(7);
}
void main()
{
port_init(); //I/O初始化函数
init_timer1();//定时器初始化函数
while(1)
{
if(a==0xff){LED_P0RT=0x00;} //PA口全部输出低
if(a==0x00){LED_P0RT=0xff;} //PA口全部输出低
}
}
|