* 【編譯環境】: ICCAVR
* 【函數功能】: 按鍵K5 K6 實現數碼管加減1 初始值 8888
* 【晶 振】: 8M
* 【芯 片】: ATMEGA16A
* */
/******************************************************************************/
#define uchar unsigned char
#define uint unsigned int
#include <iom16v.h>
#define Set_Bit(val, bitn) (val |=(1<<(bitn)))
#define Clr_Bit(val, bitn) (val&=~(1<<(bitn)))
#define Get_Bit(val, bitn) (val &(1<<(bitn)) )
uchar disbuf[4]={0,0,0,0};
uchar discode[10]={ 0xC0, 0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 }; //段碼表
uchar disbit[4] ={ 0xFE, 0xFD,0xFB,0xF7}; //選通值
uchar Key_Up;
uchar Key_Down;
static uint k=8888;
/******************************************************************************/
//延時函數
/******************************************************************************/
void delay(void)
{uint i;
for(i=0;i<500;i++);
}
/******************************************************************************/
/******************************************************************************/
//顯示函數
/******************************************************************************/
void Display(void)
{ uchar i;
for(i=0;i<4;i++)
{
PORTB=discode[disbuf[i]];
PORTA=disbit[i];
delay();
PORTA=0xff;
}
}
/******************************************************************************/
//顯示數據處理
/******************************************************************************/
void Process(uint i,uchar *disbuf)
{ disbuf[0]=i/1000;
i=i%1000;
disbuf[1]=i/100;
i=i%100;
disbuf[2]=i/10;
i=i%10;
disbuf[3]=i;
}
/******************************************************************************/
//按鍵處理子程序
/******************************************************************************/
void Get_Key(void)
{
if(Get_Bit(PINA,4)==0) //PA4 按鍵處理函數
{
Display();
Display();
Display();
Display();
while(!(Get_Bit(PINA,4)))//等待按鍵松開
{
Display();
}
k++;
if(k>9999)k=0;
Process(k,disbuf);
}
if(Get_Bit(PINA,5)==0) //PA5 按鍵處理函數
{
Display();
Display();
Display();
while(!Get_Bit(PINA,5)) //等待按鍵松開
{
Display();
Display();
}
k--;
if(k==65535)k=9999;
Process(k,disbuf);
}
}
void main (void)
{
DDRA|=1<<0|1<<1|1<<2|1<<3|0<<4|0<<5;//設置PA0,PA1,PA2為輸出,PA4,PA5為輸入
PORTA=0x00;
DDRB=0xFF;
PORTB=0xFF;
Process(k,disbuf);
while(1)
{
Get_Key();
Display();
}
}
|