您的位置 首页 技术

AVR学习心得(二)

AVRmega128I/O控制下面是我用C语言写的第一个实验:花样流水灯功能说明:1.有四种显示方式,没键按下时为默认的第1种方式:循环点亮2….

AVR mega128 I/O操控

下面是我用C言语写的第一个试验:把戏流水灯

功用阐明:

1.有四种显现方法,没键按下时为默许的第1种方法:循环点亮

2.当按下K1时,显现第1种方法:循环点亮;当按下K2时,显现第2种方法:逐一点亮;当按下K3时,显现第3种方法:距离点亮;当按下K4时,显现第4种方法:循环平息。

试验中简单呈现的问题:

1.在界说数组时,要差异与51的界说方法:

51:unsigned charcodearr[ ] = { };

AVR:#program codeunsigned char arr[ ] = { }; 或constunsigned char arr[ ] = { };

2.在端口设置时,应该把PORTX放在前面,DDRX放在后边,不然会呈现一些初始化时的过错。例如:假如端口接的是低电平有用的发光二极管,放反后就会呈现时间短的闪耀。

3.if((key_scan&0xF0)!=0xF0),在这一句中假如没有括号,程序不能正常运转。所以应留意C言语中契合的优先级和结合方法。

/************************************************
文件:main.c
用处:
留意:内部8M晶振
创立: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};//循环点亮
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};//循环平息

/*============================ 延时部分 ======================================*/

void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}

void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i delay_1ms();
}
/*============================ 按键部分 ======================================*/

void key_init(void) //按键端口初始化
{
KEY_PORT|= (1< KEY_DDR &= (1<}

unsigned char key_get(void) //按键获取
{
unsigned char key_value = 0xFF;
key_value = KEY_PIN&((1< if(key_value!=((1< {
delay_nms(2);//延时消抖
if(KEY_PIN&((1< {
key_value = KEY_PIN&((1< while((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;
}
}

/*============================ 主函数部分 ====================================*/
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< case((1< case((1< case((1< default:break;
}
}
}

/*============================ 程序完毕 ======================================*/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/275847.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部