按键扫描处理程序流程图代码

4.3.2 按键扫描处理程序流程图
(1)按键扫描处理代码
/* 功能实现参数,参数mode为Key_Menu按键选择的功能模块*/
void Display(unsigned char mode)
{
switch (mode)//显示模式,0为显示实时温度,1为显示温度上限,2为显示温度下限
{
case 0: if (temperature < 0)//温度小于0
{
temperature = -temperature;//换为正温度
DisplaySeg(0x40, temperature % 1000); //0x40为负号
}
else DisplaySeg(codeSeg[temperature % 10000 / 1000], temperature % 1000);
break;
case 1: DisplaySeg(0x76, alarm_temp_H * 10); break;//显示温度上限,0x76为H字符
case 2: DisplaySeg(0x38, alarm_temp_L * 10); break;//显示温度下限,0x38为L字符
default:break;
}
}
/* 按键扫描和处理函数*/
void KeyScan(void)
{
if (Key_Menu == 0)//判断按键是否被按下
{
DelayMs(10);//延时10毫秒,去抖动干扰
if (Key_Menu == 0)//再次确认按键是否被按下
{
while(Key_Menu == 0)Display(menu);//等待按键释放,器件扫描数码管
menu++;//功能键,功能切换
if (menu == 3)menu = 0;//三个功能切换完
}
}
if (Key_Add == 0)
{
DelayMs(10);
if (Key_Add == 0)
{
while(Key_Add == 0)Display(menu);
switch (menu)
{
case 1: if (alarm_temp_H < 50)alarm_temp_H++;break;//加温度上限
case 2: if (alarm_temp_L < 27)alarm_temp_L++;break;//加温度下限
default:break;
}
}
}
if (Key_Dec == 0)
{
DelayMs(10);
if (Key_Dec == 0)
{
while(Key_Dec == 0)Display(menu);
switch (menu)
{
case 1: if (alarm_temp_H > 30)alarm_temp_H--;break;//减温度上限
case 2: if (alarm_temp_L > 7)alarm_temp_L--;break;//减温度下限
default:break;
}
}。

合集下载

按键扫描实验报告

按键扫描实验报告

一、实验目的1. 理解按键扫描的基本原理,掌握按键扫描电路的设计方法。

2. 学习并运用单片机编程技术,实现按键的识别与处理。

3. 掌握按键防抖技术,提高按键识别的准确性。

4. 熟悉数码管显示电路的连接与编程,实现按键值的实时显示。

二、实验原理按键扫描是单片机应用中常见的一种输入方式,通过扫描电路检测按键状态,并转换为单片机可识别的信号。

本实验采用行列扫描法,通过单片机的I/O口输出低电平,逐行扫描按键,同时读取列线状态,判断是否有按键被按下。

三、实验设备1. 单片机实验板(如51单片机实验板)2. 按键(如按钮、触摸按键等)3. 数码管(如7段数码管)4. 电阻、电容等电子元件5. 编程软件(如Keil、IAR等)四、实验步骤1. 电路连接(1)将按键的行线连接到单片机的I/O口,列线连接到数码管的输入端。

(2)数码管的共阳极或共阴极连接到单片机的I/O口。

(3)在按键和数码管之间接入电阻和电容,实现防抖功能。

2. 编程实现(1)初始化单片机的I/O口,将行线设置为输出模式,列线设置为输入模式。

(2)编写按键扫描函数,逐行扫描按键,读取列线状态,判断是否有按键被按下。

(3)编写数码管显示函数,根据按键值显示对应的数字或字符。

(4)编写防抖函数,消除按键抖动干扰。

3. 实验测试(1)上电后,观察数码管显示是否正常。

(2)按下按键,观察数码管是否显示对应的数字或字符。

(3)多次按下按键,观察数码管显示是否稳定。

五、实验结果与分析1. 按键扫描结果实验结果表明,按键扫描电路能够正确识别按键状态,并转换为单片机可识别的信号。

按键按下时,数码管显示对应的数字或字符,按键释放时,数码管显示前一个数字或字符。

2. 防抖效果通过实验发现,防抖函数能够有效消除按键抖动干扰,提高按键识别的准确性。

在按键按下和释放过程中,数码管显示的数字或字符稳定,没有出现跳动现象。

3. 数码管显示实验结果表明,数码管显示电路能够正确显示按键值。

按键扫描程序(4)

按键扫描程序(4)
........//点亮A_LED,关闭B_LED和C_LED
else if(key == D_key)
........//点亮B_LED,关闭A_LED和C_LED
else if(key == S_key)
key_time_1 = 0; // 第1次单击,不返回,到下个状态判断后面是否出现双击
key_m = key_state_1;
}
else
特别操作情况定义:
1。短按操作和长按操作间隔<0.5s,以及,长按操作和短按操作间隔<0.5s,均不产生双击事件
2。连续n次(n为奇数)短按操作,且间隔均<0.5s,产生(n-1)/2次双击事件+1次单击事件
3。连续n次(n为偶数)短按操作,且间隔均<0.5s,产生n/2次双击事件
题目:多功能按键设计。利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按。
============================================================================
用户基本操作定义:
1。短按操作:按键按下,按下时间<1s,属于一次短按操作
if (!key_press)
{
key_time = 0; //
key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。

按键扫描处理程序流程图代码

按键扫描处理程序流程图代码

4.3.2 按键扫描处理程序流程图(1)按键扫描处理代码/* 功能实现参数,参数mode为Key_Menu按键选择的功能模块*/void Display(unsigned char mode){switch (mode)//显示模式,0为显示实时温度,1为显示温度上限,2为显示温度下限{case 0: if (temperature < 0)//温度小于0{temperature = -temperature;//换为正温度DisplaySeg(0x40, temperature % 1000); //0x40为负号}else DisplaySeg(codeSeg[temperature % 10000 / 1000], temperature % 1000);break;case 1: DisplaySeg(0x76, alarm_temp_H * 10); break;//显示温度上限,0x76为H字符case 2: DisplaySeg(0x38, alarm_temp_L * 10); break;//显示温度下限,0x38为L字符default:break;}}/* 按键扫描和处理函数*/void KeyScan(void){if (Key_Menu == 0)//判断按键是否被按下{DelayMs(10);//延时10毫秒,去抖动干扰if (Key_Menu == 0)//再次确认按键是否被按下{while(Key_Menu == 0)Display(menu);//等待按键释放,器件扫描数码管menu++;//功能键,功能切换if (menu == 3)menu = 0;//三个功能切换完}}if (Key_Add == 0){DelayMs(10);if (Key_Add == 0){while(Key_Add == 0)Display(menu);switch (menu){case 1: if (alarm_temp_H < 50)alarm_temp_H++;break;//加温度上限case 2: if (alarm_temp_L < 27)alarm_temp_L++;break;//加温度下限default:break;}}}if (Key_Dec == 0){DelayMs(10);if (Key_Dec == 0){while(Key_Dec == 0)Display(menu);switch (menu){case 1: if (alarm_temp_H > 30)alarm_temp_H--;break;//减温度上限case 2: if (alarm_temp_L > 7)alarm_temp_L--;break;//减温度下限default:break;}}。

2007全国电子设计大赛E题获奖论文报告

2007全国电子设计大赛E题获奖论文报告

题目:开关稳压电源(E题)摘要本设计综合考虑题目基本部分和发挥部分的指标要求,系统采用简单的boost 升压电路作为DC-DC变换器主电路;PWM控制器采用低压型专用集成芯片UC3843; 主开关管采用IRF540;由内置12位A/D、D/A的高性能、低功耗单片机C8051F021组成系统测控与显示单元,采用液晶显示器作为系统的状态和运行数据显示屏。

通过实际测试,作品的性能指标中,输出纹波完全达到了要求;电压调整率,整体效率,负载过流故障排除后自恢复功能,输出电压键控1V步进,电流、电压实时测量及数显功能等几项指标达均到了发挥部分要求;负载调整率也接近发挥部分指标要求。

另外,系统还增加了实时输出功率数据显示和负载过流状态下的声、光报警等实用功能。

一、引言为了满足题目发挥部分规定的电压调整率、负载调整率以及效率等几项指标要求,我们在设计中主要是尽量减少辅助控制电路的损耗。

通过单片机和脉宽调制电路来稳定输出电压,并通过单片机的控制实现对整个电路的过流保护功能,排除过流故障后,电源能自动恢复为正常工作状态。

同时,当输出电压与设定电压误差较大时,单片机能对输出电压进行一定调节,以提高负载调整率;通过单片机实现了输出电压的键盘设定和步进调整(步进为1V)。

系统具有测量和数字显示输出电压、电流的功能。

此外,还增加了实时输出功率测量与显示、在输出过流的时候系统发出声、光报警信号等功能。

二、方案论证与比较1.DC-DC主回路拓扑方案论证方案一:采用变压器升压的隔离型PWM直流-直流变换器电路,此电路效率较低,开关辐射/纹波较大,电路较复杂。

方案二:采用非隔离型BOOST升压电路,控制电路用专用集成芯片UC3843A,这种电路使用的外部原件最少、调试容易、成本低、效率高。

因此,采用此种方案。

2. 控制方法及实现方案方案一:采用电压型脉宽调制技术,产生频率固定,脉冲宽度可调整的方波脉冲,采用电压反馈环控制系统,它的反馈信息取自输出电压,用反馈电压调整控制器的输出脉冲宽度,改变脉冲占空比,实现开关电源的稳定。

极其简单好用的按键扫描程序(C语言)

极其简单好用的按键扫描程序(C语言)

不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~
好了,这个好用的按键处理算是说完了。可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。果然不能偷懒。下面谈谈这个问题,顺便也就非常简单的谈谈我自己用时间片轮办法,以及是如何消抖的。
}
完了。有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!
下面是程序解释:
Trg(triger) 代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
{
SysInit();
while(1) // 每20ms 执行一次大循环
{
KeyRead(); // 将每个子程序都扫描一遍
KeyProc();
Func1();
(1) 没有按键的时候
端口为0xff,ReadData读端口并且取反,很显然,就是 0x00 了。

按键扫描处理程序流程图代码

按键扫描处理程序流程图代码

4.3.2 按键扫描处‎理程序流程‎图(1)按键扫描处‎理代码/* 功能实现参‎数,参数mod‎e为Key‎_Menu‎按键选择的‎功能模块*/void Displ‎a y(unsig‎n ed char mode){switc‎h (mode)//显示模式,0为显示实‎时温度,1为显示温‎度上限,2为显示温‎度下限{case 0: if (tempe‎r atur‎e < 0)//温度小于0‎{tempe‎r atur‎e = -tempe‎r atur‎e;//换为正温度‎Displ‎a ySeg‎(0x40, tempe‎r atur‎e % 1000); //0x40为‎负号}else Displ‎a ySeg‎(codeS‎e g[tempe‎r atur‎e% 10000‎/ 1000], tempe‎r atur‎e % 1000);break‎;case 1: Displ‎a ySeg‎(0x76, alarm‎_temp‎_H * 10); break‎;//显示温度上‎限,0x76为‎H字符case 2: Displ‎a ySeg‎(0x38, alarm‎_temp‎_L * 10); break‎;//显示温度下‎限,0x38为‎L字符defau‎l t:break‎;}}/* 按键扫描和‎处理函数*/void KeySc‎an(void){if (Key_M‎enu == 0)//判断按键是‎否被按下{Delay‎M s(10);//延时10毫‎秒,去抖动干扰‎if (Key_M‎enu == 0)//再次确认按‎键是否被按‎下{while‎(Key_M‎enu == 0)Displ‎a y(menu);//等待按键释‎放,器件扫描数‎码管menu++;//功能键,功能切换if (menu == 3)menu = 0;//三个功能切‎换完}}if (Key_A‎d d == 0){Delay‎M s(10);if (Key_A‎d d == 0){while‎(Key_A‎d d == 0)Displ‎a y(menu);switc‎h (menu){case 1: if (alarm‎_temp‎_H < 50)alarm‎_temp‎_H++;break‎;//加温度上限‎case 2: if (alarm‎_temp‎_L< 27)alarm‎_temp‎_L++;break‎;//加温度下限‎defau‎l t:break‎;}}}if (Key_D‎e c == 0){Delay‎M s(10);if (Key_D‎e c == 0){while‎(Key_D‎e c == 0)Displ‎a y(menu);switc‎h (menu){case 1: if (alarm‎_temp‎_H > 30)alarm‎_temp‎_H--;break‎;//减温度上限‎case 2: if (alarm‎_temp‎_L > 7)alarm‎_temp‎_L--;break‎;//减温度下限‎defau‎l t:break‎;}}。

基于单片机的lcd1602电子时钟设计

基于单片机的LCD1602电子时钟设计一、设计任务和目的1.1、设计任务(1):用单片机设计基于LCD1602的电子时钟,显示时间和日期;(2):误差精度控制在1s/天;(3):具有时间和日期的校准功能;(4):能区分某年是闰年或平年,并对应显示2月份的天数;(5):根据月份的不同显示不同的最大日数;(6):搭建仿真电路图,模拟单片机要实现的功能;(7):焊接单片机开发板;(8):编写程序,下载并调试,实现要求的功能。

1.2、设计目的(1):熟练掌握KEIL软件的使用方法;(2):熟练掌握PROTEUS软件的使用方法;(3):掌握单片机I/O接口的工作原理;(4):掌握LCD显示器的工作原理及编程方法;(5):掌握独立式键盘的工作原理及编程使用方法;(6):掌握单片机的下载使用方法。

二、设计思路和方案论证2.1、设计思路电路总体上分为控制和显示部分。

以单片机最小系统作为核心控制电路,控制LCD显示,具体显示内容及方式由软件来完成;由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、减1键三个按键完成,共需四个按键;计时功能由固定频率的晶振完成(采用11.0592MHz);显示部分主要采用LCD1602作为显示。

2.2、方案论证(1):时钟芯片的选择和论证方案一:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、月、年以及闰年补偿的年进行计数,精度也较高,工作电压2.5V~5.5V范围内,功耗也较低,但价格比较贵。

方案二:直接采用单片机定时计数器提供秒信号,使用程序实现秒、分、时、日、月、年计数。

采用此方案实现虽然有一定的时间误差,但可减少芯片的使用,节约成本,易于实现,符合现实选用,所以采用此种作为时钟信号发生器。

(2):显示模块选择方案和论证:方案一:采用点阵式图形LCD12864液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用点阵式图形LCD12864液晶显示屏。

简单的按键扫描&读取程序

#define PA15_OUT (*(uint32_t *)0x422101bc)
/*GPIOA的置位复位定义*/
#define PA0_BSRR (*(uint32_t *)0x42010a00)
#define PA1_BSRR (*(uint32_t *)0x42010a04)
//
char get_key_riseedge(char keynum)
{
char val;
u32 mid = 0;
val = (key_riseedge >> keynum) & 0x01;//将该位上升沿取出送到val
mid = ~( 1 << keynum );
key_riseedge &= mid;//该上升沿清零
key_falledge &= ~(redge);//同上
key_riseedge |= redge;//将上升沿取到寄存器中待读
key_falledge |= fedge;//同上
}
//别的函数查询某个键的键值=========================================
#define PA3_OUT (*(uint32_t *)0x4221018c)
#define PA4_OUT (*(uint32_t *)0x42210190)
#define PA5_OUT (*(uint32_t *)0x42210194)
#define PA6_OUT (*(uint32_t *)0x42210198)
//
char get_key_val(char keynum)

新型键盘扫描程序(并附单片机原理图)

新型按键程序思想:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = P3^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}(1) 没有按键的时候ReadData =0x00;Trg =0x00;Cont =0x00;(2) 第一次按下按键的情况ReadData =0x01;Trg =0x01;Cont =0x01;(3) 按键按着不松(长按键)的情况ReadData =0x01;Trg =0x00;Cont =0x01;(4) 按键松开的情况ReadData =0x00;Trg =0x00;Cont =0x00;应用一:一次触发的按键处理——假设为蜂鸣器按键,按一下,蜂鸣器beep的响一声。

#define KEY_BEEP 0x01void KeyProc(void){if (Trg & KEY_BEEP) // 如果按下的是KEY_BEEP{Beep(); // 执行蜂鸣器处理函数}}应用2:长按键的处理#define KEY_MODE 0x01 // 模式按键#define KEY_PLUS 0x02 // 加void KeyProc(void){if (Trg & KEY_MODE) // 如果按下的是KEY_MODE,而且你常按这按键也没有用,{ //它是不会执行第二次的哦,必须先松开再按下Mode++; // 模式寄存器加1}if (Cont & KEY_PLUS) // 如果“加”按键被按着不放{cnt_plus++; // 计时if (cnt_plus > 100) // 20ms*100 = 2S 如果时间到{Func(); // 你需要的执行的程序}}}延时消抖问题?真正的单片机入门,是从学会处理多任务开始的。

极其简单好用的按键扫描程序C语言

极其简单好用的按键扫描程序(C语言)不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。

我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。

同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。

对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。

因为这是实际项目中总结出来的经验,学校里面学不到的东西。

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。

当然,我自己也是在多个项目用过,效果非常好的。

好了,工程人员的习惯,废话就应该少说,开始吧。

以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。

用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。

核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData &amp; (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。

有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。

1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。

2:算法1,用来计算触发变量的。

一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档