AVR學習心得(二)
下面是我用C語言寫的第一個實驗:花樣流水燈
本文引用地址:http://m.butianyuan.cn/article/201611/317323.htm功能說明:
1.有四種顯示方式,沒鍵按下時為默認的第1種方式:循環(huán)點亮
2.當按下K1時,顯示第1種方式:循環(huán)點亮;當按下K2時,顯示第2種方式:逐個點亮;當按下K3時,顯示第3種方式:間隔點亮;當按下K4時,顯示第4種方式:循環(huán)熄滅。
實驗中容易出現(xiàn)的問題:
1.在定義數(shù)組時,要區(qū)別與51的定義方式:
51:unsigned charcodearr[ ] = { };
AVR:#program codeunsigned char arr[ ] = { }; 或constunsigned char arr[ ] = { };
2.在端口設(shè)置時,應該把PORTX放在前面,DDRX放在后面,否則會出現(xiàn)一些初始化時的錯誤。例如:如果端口接的是低電平有效的發(fā)光二極管,放反后就會出現(xiàn)短暫的閃爍。
3.if((key_scan&0xF0)!=0xF0),在這一句中如果沒有括號,程序不能正常運行。所以應注意C語言中符合的優(yōu)先級和結(jié)合方式。
/************************************************
文件:main.c
用途:
注意:內(nèi)部8M晶振
創(chuàng)建:2008.4.23
修改:2008.4.23
Copy Right (c) zhaojun
************************************************/
#include
#include
// 按鍵端口定義
#define KEY_DDR DDRD
#define KEY_PORT PORTD
#define KEY_PIN PIND
#define S1 4
#define S2 5
#define S3 6
#define S4 7
//
const unsigned char led1[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF};//循環(huán)點亮
const unsigned char led2[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};//逐個點亮
const unsigned char led3[]={0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0xFF};//間隔點亮
const unsigned char led4[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};//循環(huán)熄滅
/*============================ 延時部分 ======================================*/
void delay_1ms(void) //1ms延時函數(shù)
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延時函數(shù)
{
unsigned int i=0;
for (i=0;i
}
/*============================ 按鍵部分 ======================================*/
void key_init(void) //按鍵端口初始化
{
KEY_PORT|= (1<
unsigned char key_get(void) //按鍵獲取
{
unsigned char key_value = 0xFF;
key_value = KEY_PIN&((1<
delay_nms(2);//延時消抖
if(KEY_PIN&((1<
key_value = KEY_PIN&((1<
}
}
return key_value; //返回按鍵值
}
/*============================ 流水燈部分 ====================================*/
unsigned char scan(const unsigned char * led)
{
unsigned char i;
unsigned char key_scan;
for(i=0;i<16;i++)
{
PORTE = led[i]; // 輸入顯示
delay_nms(300); // 延時
key_scan=key_get(); // 按鍵掃描
if((key_scan&0xF0)!=0xF0)// 如果有鍵按下,返回按鍵值
return key_scan;
}
}
/*============================ 主函數(shù)部分 ====================================*/
void main(void)
{
unsigned char key;
const unsigned char * led_temp;
PORTE = 0xFF; // 初始化顯示端口
DDRE = 0xFF;
key_init(); // 初始化按鍵端口
led_temp=led1; // 默認方式
while(1)
{
key=scan(led_temp); // 流水燈顯示
switch(key)
{
case((1<
}
}
}
/*============================ 程序結(jié)束 ======================================*/
評論