/*剛剛開始學習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口全部輸出低
}
}

|