这是从
http://www.51hei.com/bbs/dpj-19294-1.html 这个单片机做的收音机里面截取出来的一个子程序,完整的代码和
原理图可从原帖下载.
/*-----------状态机方式按键扫描-----------*/
/*------------外部晶振为 12MHz-----------*/
/*--------最后修改2011.02.26--------------*/
#include "STC12C5620AD.H"
#include "Key_Scan.H"
#define Key_Mask 0x0f //屏蔽不用的按键,不用的按键用0屏蔽
/********************** 声明外部变量**************************/
extern uchar Work_Mode; //From Main.c
/********************** 按键扫描读取**************************/
uchar Key_Scan(void)
{
static uchar Key_State=0; //定义按键状态
uchar Key_Press;
uchar Key_Return=0x00; //定义按键返回的键值
Key_Press=Key_Input&Key_Mask; //读按键I/O电平
switch(Key_State)
{
case 0: // 按键初始态
if (Key_Press!=Key_Mask)
Key_State=1; // 键被按下,状态转换到键确认态
break;
case 1: // 按键确认态
if (Key_Press==Key_Input&Key_Mask)
{
Key_Return=Key_Press; // 按键仍按下且键值键值,按键确认输出
BEEP_DRV=1; // 驱动蜂鸣器
Key_State=2; // 状态转换到键释放态
}
else
Key_State=0; // 按键已抬起或改变,并转换到按键初始态
break;
case 2:
if (Key_Press==Key_Mask)
{
Key_State=0; // 按键已释放,转换到按键初始态
BEEP_DRV=0; // 关闭蜂鸣器
}
else
if(Work_Mode==1)
{
Key_Return=Key_Press|0x09; // 只有调台模式并且只有>>| 和 |<< 才能连按
BEEP_DRV=0; // 关闭蜂鸣器
}
else
BEEP_DRV=0; // 关闭蜂鸣器
break;
}
return Key_Return;
}
关键字:状态机方式 按键扫描 单片机
引用地址:
状态机方式按键扫描单片机程序
推荐阅读最新更新时间:2024-03-16 14:23
全面解析STC89C52单片机的LED调光系统电路
摘要: 在场效应管关断后让LED的负极电压升高,使得LED关闭。当场效应管导通时,LED的负极电压被拉低,使得LED发光。PWM调节方式使得驱动电路更简单,降低了制造成本。 LED 的排列方式及LED 光源的规范决定着基本的驱动器要求。 LED驱动器的主要功能就是在一定的工作条件范围下限制流过LED的电流,而无论输入及输出电压如何变化。最常用的是采用变压器来进行电气隔离。下文论述了LED照明设计需要考虑的调光因素。 正是因为调光的要求所以驱动LED 面临着不少挑战,如正向电压会随着温度、电流的变化而变化,而不同个体、不同批次、不同供应商的LED 正向电压也会有差异;另外,LED 的“色点”也会随着电流及温度的变化而漂移。
[单片机]
单片机40个实验之广告灯的左移右移
1. 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出 0 时,发光二极管亮,开始时P1.0 P1.1 P1.2 P1.3 ┅ P1.7 P1.6 ┅ P1.0亮,重复循环。 2. 电路原理图 3. 系统板上硬件连线 把 单片机系统 区域中的P1.0-P1.7用8芯排线连接到 八路发光二极管指示模块 区域中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2, ,P1.7对应着L8。 4. 程序设计内容 我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输
[单片机]
DS18B20数字温度计单片机接口应用
1.DS18B20基本知识 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点 (1)、只要求一个端口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在-55。C到+125。C之间。 (5)、数字温度计的分辨率用户可以从9位到12位选择。 (6)、内部有温度上、下限告警设置。 2、DS18B20的引脚介绍
[单片机]
基于STPM01计量芯片和P89LPC9401微控制器实现防窃电电能表的设计
不论在发达国家还是在发展中国家,窃电都是一个非常棘手的问题,每年都给供电企业造成巨大损失。现在的防窃电方法多是从管理上采取措施,用这些方法即使查出了窃电行为,也往往由于缺乏依据而无法确定处罚额,甚至有时供电企业面临无法拿出窃电证据的尴尬。只有提高电能表本身的防窃电技术,才能从根本上杜绝窃电发生。由于窃电方法千变万化,防窃电电表设计一直是电表工程师面临的严峻挑战,数字式电表的发展为解决窃电问题提供了新途径。本文介绍的单相数字式防窃电电能表采用了计量芯片STPM01和微控制器P89LPC9401,可以有效防止多种窃电行为。 STPM01计量芯片简介 STPM01是ST公司推出的第一款电能计量专用芯片,有一个电压通道和两个电流通道,
[单片机]
基于单片机的具有通讯口的智能温控表
1 引言 温控表已广泛应用于工业控制等诸多领域,本文介绍的具有计算机通讯功能的智能温控表是一种新颖的自动化仪表,它以单片机AT89C52为核心,采用电压/频率转换技术和RS-485通信接口芯片MAX487,具有测量精度高、可靠性好、抗干扰性能强、可实现计算机网络控制等优点,可广泛应用于冶金、纺织、化工、医疗等行业。它具有-200~+500°C范围的温度测量和自动控制,是老式温控表的替代产品,市场前景广阔。 2 系统硬件设计 系统硬件框图如图1所示。 系统接通220V交流电源后,通过稳压电路(7805、7905)产生±5V直流工作电源,以满足本系统中集成电路工作需要,系统的遥测电路开始工作:在人
[单片机]
stc12单片机LED_PWM调光
本程序一共有3个文件下面分别列出: stc12c5a.h 头文件下载: http://www.51hei.com/mcu/3282.html main.c #include stc12c5a.h #include type.h #define FRE 22118400 #define TIME_FRE 10000 //计时1/10000=0.0001s=0.1ms (此时间是用来加快LED闪烁频率) #define T0RELOAD (65536 - (FRE / TIME_FRE)) //***************************************初始化变量 v
[单片机]
第17章 A/D和D/A的学习
从我们学到的知识了解到,我们的单片机是一个典型的数字系统。数字系统只能对输入的数字信号进行处理,其输出信号也是数字信号。但是在工业检测系统和日常生活中的许多物理量都是模拟量,比如温度、长度、压力、速度等等,这些模拟量可以通过传感器变成与之对应的电压、电流等电模拟量。为了实现数字系统对这些电模拟量的检测、运算和控制,就需要一个模拟量和数字量之间相互转换的过程。这节课我们就要学习这个相互转换过程。 17.1 A/D和D/A的基本概念 A/D是模拟量到数字量的转换,依靠的是模数转换器(Analog to Digital Converter),简称ADC;D/A是数字量到模拟量的转换,依靠的是数模转换器(Digital to Analo
[单片机]
Microchip推出集成微型FPGA的PIC16 微控制器,售价不到 50 美分
编译自EEJOURNAL Microchip 现在提供一款基于闪存的微控制器,集成可编程逻辑块,其售价不到50美分。 Microchip PIC16F13145 系列的九个新产品,与其他型号16F系列采用相同的 8 位 RISC 微处理器架构,但它们还集成了一个新的可编程逻辑块,称为可配置逻辑块 (CLB)。 PIC16F13145 微控制器系列中的器件采用 8、14 和 20 引脚封装,具有 3.5 至 14 KB 闪存和 256 至 1024 字节 RAM。 Microchip PIC1613145 微控制器系列的九个成员具有相同的内部架构,但具有不同数量的 RAM 和闪存,并提供不同的封装,具体取决于您应用的 I/O
[单片机]