?? counter1.11.c
字號:
/*****************************Copyright(c)***************************
**----------------------------File Info-------------------------
** File name: 按鍵LED顯示Version1.11
** Created by: 邵峰sshaofeng@163.com
** Descriptions: 在數碼管上顯示按鍵的次數(按鍵瞬間計數,按下時仍然顯示)
** Date: 2008-9-10
*******************************************************************/
#include <mega16.h> //Atmel16的頭文件
#include <delay.h> //CVAVR的特色delay function.
#define K1 0x02 //按鍵K1與PC.1相連
//#define K1 1<<6 //按鍵K1與PC.4相連,試驗時一直顯示01,奇怪?因為板子故障,C.2~PC.5四個端口不正常,一直置低電平;
//const char dig0 = 0x40, dig1 = 0x80;/* dig2=0x10, dig3=0x08, dot=0x20*/ //定義靜態變量
#define dig0 (1<<6) //推薦用這種形式,簡單形象
#define dig1 (1<<7)
int i; //定義變量類型及賦初值
unsigned char BCD0, BCD1;
char segconv[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90/*,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xbf*/};
/********************************************************************
** 函數名稱 :port_init()
** 函數功能 :端口初始化
** 入口參數 :無
** 出口參數 :無
********************************************************************/
void port_init(void) // the initialization function
{
PORTA = 0x00; //設全為低
DDRA = 0xFF; //設置為輸出
PORTB = 0xFF; //B口對應數碼管7端控制端,且共陽極,若給低一開始便導通,因此置高
DDRB = 0xFF; //設置為輸出
PORTC = 0xFF; //set the default
DDRC = 0x00; //C口設置為輸入
PORTD = 0x00; //LED高電平有效,則初始化時給低電平
DDRD = 0xFF;
}
/********************************************************************
** 函數名稱: BinToBCD()
** 功能描述: 預給值分位函數
** 入口參數 :預給數值
** 出口參數 :無
********************************************************************/
void BinToBCD(int data) //十進制函數
{
BCD0=0; //BCD0、1、2、3分別為個十百千位
BCD1=0; //設初值
if(data>=10)
{
BCD1=data/10; //商給十位
data=data%10; //余給個位
}
BCD0=data;
}
/********************************************************************
** 函數名稱: dispseg() ;
** 功能描述: 按位顯示八段LED數;
** 入口參數 :無
** 出口參數 :無
********************************************************************/
void dispseg(void)
{
PORTB=segconv[BCD0]; //本實驗板為共陽極,而表為共陰極的表,故用~符號取反后,再送值。
PORTA=dig0; //送數(打開個位LED位選,高電平有效)
delay_ms(10); //延時10ms
PORTB=segconv[BCD1]; //寫數
PORTA=dig1; //送數(打開十位LED)
delay_ms(10); //延時10ms
}
/********************************************************************
** 函數名稱: display()
** 功能描述: 按所預給數顯示
** 入口參數 :data 預給數值
** 出口參數 :無
********************************************************************/
void display(int data) //集成顯示子程序,
{
BinToBCD(data); //一次定義和運行即可,現在的編寫則是每次都需運行,不好。
//說得不對,display()為void函數,而數值與data有關,他每次必用。
dispseg();
}
/******************************************************************************************
**函數名稱: Key_value()
**函數功能: 按鍵加一函數
**入口參數: 無
**出口參數: 鍵值i
*******************************************************************************************/
int Key_value(void) //在AVR和ARM中,均要區分大小寫(對于AVR,至少CVAVR和ICC軟件要區分)
{
if((PINC&K1)==0) //判斷PC.1鍵是否按下
delay_ms(10); //延時去抖,但實踐證明不去抖也不出錯,可能是現在按鍵好的緣故
if((PINC&K1)==0) //再次判斷PC.1鍵是否按下
{
i++; //若有鍵按下,i加1
PORTD.0=1; //用線連接蜂鳴器(J7)和PD.0口,并置一,
delay_ms(20); //設置蜂鳴時間
PORTD.0=0; //蜂鳴停止
if(i>99) i=0; //★計數循環顯示,到99加一后變成00
while ((PINC&K1)==0) //★該行與下一行使在按鍵的過程中,仍然顯示
display(i);
while(!(PINC&K1)); //★等待按鍵抬起
}
return i; //返回按鍵值給調用函數
}
/********************************************************************
** 函數名稱 :main()
** 函數功能 :主程序:調用端口初始化子程序、按鍵加一和雙LED顯示子程序
** 調試說明 :無
********************************************************************/
main()
{
port_init();
while(1)
{
Key_value();
display(i); //★使按鍵抬起時仍然顯示
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -