实验一 开发环境及GPIO实验
为了降低学弟学妹的学习压力,我把大三上的电设实验报告开源出来给你们参考
文章共2,511字 · 阅读需要大约9分钟
一键AI生成摘要,助你高效阅读
问答
·
实验一题目
一、实验目的
- 掌握AVR单片机开发平台的搭建方法。
- 掌握GPIO的编程方法。
二、实验内容 - 验证课堂例题
编译下载运行课堂例题——“LED流水灯”和“按键控制LED亮灭”,查看运行结果。 - 设计程序
参考上述例题的编程思路,在图1-1所示电路中实现“按键控制流水灯样式”的程序编写与调试。
具体要求如下:
(1)初始状态下,所有LED灯点亮;
(2)K1为启/停键,按下后控制LED流水灯按照当前指定样式运行或停止;
(3)K2为流水灯样式选择键,分两种样式,默认为样式1。每次按下K2当前样式立即转变。
样式1:每次仅相邻两个LED点亮,点亮LED从L0至L7转移,如此循环运行。
样式2:每次仅相邻两个LED点亮,点亮LED从L7至L0转移,如此循环运行。
在设计报告中,需进行总体设计思路描述,给出所涉及到的主程序、中断程序、关键功能子函数的流程图和设计代码。描述程序调试结果及出现的问题。
实验代码
#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
int flag=0,flag0=0;//四种流水灯样式编号,通过按键赋值
//四种LED样式输出码组
int a[8]={0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00};//流水灯初始状态
int b[8]={0X7E,0XFC,0XF9,0XF3,0XE7,0XCF,0X9F,0X3F};//流水灯1输出码组
int c[8]={0X7E,0X3F,0X9F,0XCF,0XE7,0XF3,0XF9,0XFC};//流水灯2输出码组
//延时函数
void delay(uint x)
{
uint y,z;
for(y=x;y>0;y--)
for(z=1111;z>0;z--);
}
//LED初始化
void LED_init()
{//灯总开关
DDRA=0x04; //PA2口推挽输出
PORTA=0x04;//PA2输出高电平
//8个LED
DDRB=0xff; //PB口推挽输出
PORTB=0X00;//灯全亮
}
//按键初始化
void KEY_init()
{
DDRD&=0X00;//清除寄存器低四位,配置D0 D1 D2 D3为输入模式
PORTD&=0X00;//清除PORTD低四位
PORTD|=0XFF;//低四位置一,D0D1D2D3配置为上拉输入
}
int KEY,KEY_FLAG;
//按键扫描函数
int KEY_scan()
{
KEY=PIND;//判断D口低四位按键状态
if(KEY==0XFE||KEY==0XFD||KEY==0XFB||KEY==0XF7)//如果有按键按下
{
delay(10);//按键防抖动
if(KEY==0XFE)//按下按键1
KEY_FLAG=1;
else if(KEY==0XFD)//按下按键2
KEY_FLAG=2;
else if(KEY==0XFB)//按下按键3
KEY_FLAG=3;
else if(KEY==0XF7)//按下按键4
KEY_FLAG=4;
return KEY_FLAG;//返回按键值
}
else if(KEY==0XFF)//初始样式标号为0,就是按键没有按下
return 0;
}
void main(void)
{
int KEY_RES=0;//默认键值为0
int n=0,i=0;
LED_init();//LED初始化,灯全灭
KEY_init();//按键初始化
while(1)
{
KEY_RES=KEY_scan();//扫描按键
if(KEY_RES==1)//按键控制灯启停
{
delay(20);
while(1)//循环停留流水灯当前状态
{
KEY_RES=KEY_scan();//扫描按键
PORTB=a[n];//当前状态
if(KEY_RES==1)//再次按下跳出循环进入流水灯
{
break;
}
}
}
if(KEY_RES==2)//按下按键2,变换样式
{
flag0++;
if(flag0==1)//样式1执行
{
n=0;
for(i=0;i<8;i++)//样式1输出码组赋值
{
a[i]=b[i];
}
}
if(flag0==2)//样式2执行
{
n=0;
for(i=0;i<8;i++)//样式2输出码组赋值
{
a[i]=c[i];
}
flag0=0;//按键2样式标志位清零
}
}
PORTB=a[n];//流水灯输出寄存器赋值
n++;
if(n>7)//保证每次循环周期为8次
{
n=0;
}
delay(50);//流水灯循环延时
}
}
proteus8.9仿真
完整代码工程-实验报告-PROTEUS工程仿真工程在在这个链接下载
实验由林学长完成,希望学弟学妹可以点个赞并且关注我一下
更多推荐
已为社区贡献1条内容
所有评论(0)