实验一题目

一、实验目的

  1. 掌握AVR单片机开发平台的搭建方法。
  2. 掌握GPIO的编程方法。
    二、实验内容
  3. 验证课堂例题
    编译下载运行课堂例题——“LED流水灯”和“按键控制LED亮灭”,查看运行结果。
  4. 设计程序
    参考上述例题的编程思路,在图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工程仿真工程在在这个链接下载

实验由林学长完成,希望学弟学妹可以点个赞并且关注我一下

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐