/**********************************************************************
* 文件名称: main.c/基于状态机的按键
* 程序作者: Kevin Chin
* 程序版本: V1.0
* 编制日期: 2010/07/14
* 功能描述: 按一个K20(PD7),LED灯亮(PB1),松开熄灭
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
#include
#include
#define KEY_Value PIND & 0x80 //定义按键所在的引脚PD7
#define LED_OPEN PORTB &= ~(_BV(PB1)) //PB1口的LED灯点亮
#define LED_CLOSE PORTB |= _BV(PB1) //PB1口的LED灯熄灭
#define KEY_STATE_0 0 //状态0
#define KEY_STATE_1 1 //状态1
#define KEY_STATE_2 2 //状态2
uint8_t KeyScane(void) //按键扫描函数
{
static uint8_t keystate = 0, keyreturn = 0; //定义静态变量
uint8_t keypress;
keypress = KEY_Value;//读取按键的状态赋给keypress
switch(keystate)
{
case KEY_STATE_0: if(!keypress) //如果是状态1并且按键按下去了。
{
keystate = KEY_STATE_1; //状态切换到1
keyreturn = 0;
}
break;
case KEY_STATE_1: if(!keypress) //如果10ms后按键按下状态再次确认
{
keystate = KEY_STATE_2; //按键状态切换到2
keyreturn = 1; //返回值为1
}
else keystate = KEY_STATE_0;
break;
case KEY_STATE_2: if(keypress) //判断按键是否松开
{
keystate = KEY_STATE_0; //切换到状态0
keyreturn = 0;
}
break;
default: break;
}
return keyreturn; //返回键值
}
int main(void)
{
uint8_t keydata;
PORTB = 0xff;
DDRB = 0xff;
PORTD = 0x80;
DDRD = 0x00;
while(1)
{
_delay_ms(10); //延时10ms
keydata = KeyScane(); //调用按键扫描函数
if(keydata) //如果按键扫描函数返回为1,执行下面的语句
{
LED_OPEN; //LED点亮
}
else LED_CLOSE; //LED熄灭
}
}
关键字:AVR 状态机的 按键
引用地址:
AVR main.c/基于状态机的按键
推荐阅读最新更新时间:2024-03-16 14:39
怎样设计一个基于AVR单片机的SPI串行外设接口?
1、AVR单片机的SPI接口 SPI(SerialPeripheralINTERFACE---串行外设接口)总线系统是一种同步串行外设接口,允许MCU与各种外围设备以串行方式进行通信、数据交换,广泛应用于各种工业控制领域。基于此标准,SPI系统可以直接于各个厂家生产的多种标准外围器件直接接口。SPI接口通常包含有4根线:串行时钟(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)和低电平有效的从机选择线SS。在从机选择线SS使能的前提下,主机的SCK脉冲将在数据线上传输主/从机的串行数据。主/从机的典型连接图如图(1)所示: 图(1)主/从机的连接图 串行外设接口SPI允许ATmega16
[单片机]
采用AVR单片机对FPGA进行配置
Altera公司的ACEX、FLEX等系列的FPGA芯片应用广泛,但其FPGA基于SRAM结构,决定电路逻辑功能的编程数据存储于SRAM中。由于SRAM的易失性,每次上电时必须重新把编程数据装载到SRAM中,这一过程就是FPGA的配置过程。FPGA的配置分为主动式和被动式。在主动模式下,FPGA上电后主动将配置数据从专用的EPROM(如EPC1,EPC2等)加载到SRAM中。被动模式下,FPGA为从属器件,由相应的控制电路或微处理器控制配置过程,包括通过下载电缆由计算机控制配置和单片机模拟配置时序配置。其中,专用的EPROM价格高,可编程次数少,而计算机配置在现场应用中又很不现实,因此本文提出一种基于AVR单片机的被动配置方式。由于
[单片机]
按键盘数码管流动显示实验
要求:按下键盘,六个数码管流动显示按下的值。 连线:将片选CS0接到key_LED_CS上 1 #include reg52.h 2 #define LEDLen 6 3 4 xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口 5 xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口 6 xdata unsigned char IN _at_ 0x8001; // 键盘读入口 7 8 unsigned char LEDBuf ; // 显示缓冲 9 code unsigned char LEDMAP =
[单片机]
AVR单片机的DS18B20 C语言程序
#include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int // #define BIT_SET(a,b) a|=(1 b) //置位位a.b #define BIT_CLR(a,b) a&=~(1 b) //清零位a.b
[单片机]
基于AVR单片机及MODEM芯片的MTU、RTU无线电遥测系统
一、引言 基于AVR单片机及专用MODEM芯片的MTU(Master Terminal Unit中心调度机)、RTU无线电遥测系统。 分散地分布在全市的管网监测点上的远端RTU(系统可带256个RTU)采集数据,进行数据处理后通过无线电台向中心调度端发送数据,中心调度端接收到数据后进行数据处理,数据存储,并送给模拟屏显示。 二、设计思想 原有系统的使用中,主要存在以下几个问题:1. 无线通信波特率低(300bps),误码率高,巡测速度慢,最多带32个RTU终端;2. 当某一远程RTU端的无线电台一直处于长时间误发射状态时(简称“长发” )一直占用系统频点,由于系统共用一组无线电频点,这将使系统其他所有电
[单片机]
AVR系列单片机的主要特性及选型
AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点: 在相同的系统时钟下AVR运行速度最快; 芯片内部的Flsah、EEPROM、SRAM容量较大; 所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP); 多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作; 每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强; 内部资源丰富,一般都集成AD、DA模数器;PWM;SPI、USART、TWI、I2C通信口;丰富的中断源等。 目前支持AVR单片机编译器的语言主要有汇编语言、C语言、BASI
[单片机]
AVR单片机电源管理_睡眠模式(低功耗模式)实验
先看芯片手册吧 这对电源及睡眠模式的一个简述,并介绍了进入模式时和唤醒之后的处理(第二段一定好好吸收哦)。 这是控制寄存器的设定进入不同模式的设定,根据需要进入不同的模式。 看到这里,也算了解了。 下面发段代码: /********************************************************** * 文 件 名 : main.c * 描 述 : 低功耗模式的探究 * 创 建 人 : 夏玉峰 * 单 位 : 佳木斯大学 信息电子技术学院 电子协会 * 日 期 : 2012.12.9 * 开 发 环 境: 开发环境:ICCAVR 7.22
[单片机]
按键计数器
知识要点:理解熟悉散转结构的程序 ;运行结果:按P3.2或3.3(低4位的任意一个键盘)第一位数码管加1直到9循环 ; 开始显示0把P3送OFH,判断有没有按键,没有则反复循环,有按R0加1,如到10 ;那么则清除, 最后根据R0的值散转. ORG 0000H; LJMP MAIN;程序开始 ORG 030H; MAIN: MOV P0,#028H;数码管显示0 clr p2.1 ;打开第一个数码管 MOV R0,#00H;r0送0fh ST: MOV P3,#0FH;p3 送0fh MOV A,P3;
[单片机]