★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
【相关资源】
【ATMEGA16L】单片机学习案例硬件电路图
实验1:8种LED点亮模式
实验2:有源蜂鸣器驱动实验
实验3:按键扫描(用KEY选择对应LED点亮)
实验4:按键扫描+8种LED亮灭模式控制
实验5:按键扫描(用KEY选择LED点亮模式)
实验6:无源蜂鸣器驱动实验
实验7:外部中断INT0实验
实验8:7种LED亮灭模式+INT0中断+蜂鸣器
实验9:蜂鸣器产生音节节拍
实验10:按键扫描(KEY控制对应LED亮灭)
实验11:SPI实验(数码管显示)
实验12:SPI实验(数码管位显示控制)
实验13:SPI实验(数码管显示INT0次数)
实验14:TC0用作PWM相位修正模式
实验15:TC0定时器四种工作模式实验
实验16:TC0定时器中断实验
实验17:TC0定时器溢出定时实验
实验18:TC1比较中断实现10ms定时实验
实验19:音乐键盘
实验20:USART实验(查询方式收发数据)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
一、程序结构
二、仿真效果
三、程序源码
1、main.c- /*******************************************************************************
- Platform : AVR mega16学习板(www.iccavr.com)
- Project : 实验三:按键扫描(用KEY选择对应LED点亮)
- Clock F : 3.6864M
- Software : ICCAVR7.14C
- Author : 林夕依然
- Version : 08.11.22
- Updata : 09.02.25 模块化
- 09.04.30 增加proteus仿真模型,仿真通过。
- comments :
- 1、以学习板八个LED灯和八个按键为硬件电路,JP7短路块需装上
- 2、AVR单片机端口寄存器的使用及理解
- 3、端口电平检测程序的编写方法
- 4、操作KEY键控制对应的LED点亮
- 5、PORTB=~BIT(0)和PORTB&=~BIT(0);的区别,前者是对整个B口的操作,
- 后者是只对B0的操作,不影响其他端口的状态
- 6、同时按下多个键时,LED不会依次循环点亮,详见仿真。原因为:尽管key_scan.c
- 采用循环判断方式,但进行了状态处理。
- *******************************************************************************/
- #include <iom16v.h>
- #include <macros.h>
- #define uint unsigned int
- void main()
- {
- port_init();
- while(1)
- {
- key_scan();
- }
- }
复制代码 2、key_scan.c- #include <iom16v.h>
- #include <macros.h>
- /***键盘扫描程序***/
- void key_scan(void)
- {
- if((PINA&(1<<PA0))==0)
- {
- PORTB=~BIT(0);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA1))==0)
- {
- PORTB=~BIT(1);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA2))==0)
- {
- PORTB=~BIT(2);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA3))==0)
- {
- PORTB=~BIT(3);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA4))==0)
- {
- PORTB=~BIT(4);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA5))==0)
- {
- PORTB=~BIT(5);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA6))==0)
- {
- PORTB=~BIT(6);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- if((PINA&(1<<PA7))==0)
- {
- PORTB=~BIT(7);
- DelayMs(50);
- while(PINA != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前
- }
- }
复制代码 3、delay.c- /*******************************
- Platform : AVR mega16学习板(www.iccavr.com)
- function :延时函数
- Clock F : 3.6864M
- Software : ICCAVR7.14C
- Author : 林夕依然
- Version : 09.02.25
- comments :
- 1、两种方式实现延时
- ********************************/
- /*---------------------------------------------------------------------------------
- 延时程序计算方法
- 计数个数j = 延时时间/6*晶振频率 - 1
- ---------------------------------------------------------------------------------*/
- #define uchar unsigned char
- #define uint unsigned int
- //方式一:
- void Delay()
- {
- uchar a, b, c;
- for (a = 1; a; a++)
- for (b = 1; b; b++)
- for (c = 0; c<10; c++) //循环次数=255*255*10
- ;
- }
- //方式二:1ms延时,准确性较Delay();高
- void DelayMs(uint i)
- {
- while(i--)
- {
- uint j;
- for(j=1;j<=613;j++)
- ;
- }
- }
复制代码 4、port_init.c- #include <iom16v.h>
- #include <macros.h>
- /***端口初始化函数***/
- void port_init()
- {
- DDRA =0X00;
- PORTA=0XFF;
- DDRB =0XFF;
- PORTB=0XFF;
- DDRC =0X00;
- PORTC=0XFF;
- DDRD =0X00;
- PORTD=0XFF;
- }
复制代码 四、完整项目文件下载
实验3完整项目文件及proteus模型.rar (52.52 KB)
|