一、程序结构
[/url]
(原文件名:程序结构.jpg)
二、仿真效果
[url=http://download.ourdev.cn/bbs_upload247021/files_23/ourdev_516624.jpg]
(原文件名:仿真效果.jpg)
三、程序源码
1、main.c
/*******************************************************************************
Platform : AVR mega16学习板(www.iccavr.com)
bbs : http://bbs.armavr.com/
Project : 实验四:按键扫描+8种LED亮灭模式控制
Clock F : 3.6864M
Software : ICCAVR7.14C
Author : 林夕依然
Version : 08.11.22
Updata : 09.02.25 模块化
09.04.30 增加proteus仿真模型,修改key_scan.c检测程序,仿真通过
comments :
1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上
2、AVR单片机端口寄存器的使用及理解
3、练习程序模块化,结构化的书写
4、端口电平检测程序的编写方法
5、8种LED点亮模式由对应的KEY键选择,同时按下多个键时,LED点亮模式不会循环进行,
详见仿真。原因为:尽管key_scan.c采用循环判断方式,但采用了状态处理程序
6、增加状态处理,防止运行选定LED模式序时按下其他按键
Problem :
1、当前模式运行时切换其他模式时必须先复位,否则不能实现切换,考虑自动切换实现方法
解决方法:更改key_scan.c检测程序,使用for循环,不用while(1)无限循环。
*******************************************************************************/
#include
#include
void main()
{
port_init();
while (1)
{
key_scan();
}
//MCUCR=0x40; //空闲模式,CPU占用100%
//MCUCR=0x50; //ADC噪声抑制模式,CPU占用100%
//MCUCR=0x60; //掉电模式,CPU占用80%
//MCUCR=0x70; //省电模式,CPU占用4%
//MCUCR=0xE0; //Standby模式,CPU占用80%
MCUCR=0xF0; //扩展Standby模式,CPU占用4%
asm("sleep"); //CPU休眠指令
}
2、key_scan.c
#include
#include
/***键盘扫描函数***/
void key_scan()
{
int l,m,n,o,p,q,r,s,i;
if((PINA&(1