AVR单片机(C语言)项目开发实践教程项目6 按键识别应用

合集下载

AVR单片机C语言项目开发实践教程项目一 AVR单片机系统开发与设计工具

AVR单片机C语言项目开发实践教程项目一 AVR单片机系统开发与设计工具

图2-14 进入调试状态
二、程序编译及下载
1.工程文件的建立与编译
点击全速运行
图2-15 程序全速仿真
二、程序编译及下载
1.工程文件的建立与编译
单步运行查看 单口状态
程序指针
点击单步运行 执行每条语句
图2-16 单步执行后的IO状态
二、程序编译及下载
2.示例程序说明
程序使用芯片ATmega16,频率为8MHz。如使用其他 芯片,需修改模拟调试选项中的芯片型号,并修改程序中 的头文件包含。程序所完成的功能:PC0接一LED。以 2Hz的频率闪烁。
图2-20 程序下载界面
三、AVR单片机软件仿真
如果在没用硬件实训箱,也可以利用软件仿真的形式 进行学习。本书简单介绍Proteus软件。
在单片机学习过程中,同学们更应该实际动手设计、 制作、调试,才能从硬件上真正提高自己的水平。
Proteus软件使用方法参照课本演示步骤进行操作。
AVR单片机(C语 言)项目开发实践 教程项目一 AVR单 片机系统开发与设
计工具
目录
一、WinAVR+AVR Studio软件开发环境使用 二、程序编译及下载 三、AVR单片机软件仿真
一、WinAVR+AVR Studio软件开发环境使用
1.AVR单片机嵌入式系统的开发平台AVR Studio ATMEL公司为开发使用AVR单片机提供了一套免费的
1.工程文件的建立与单步执行语句 单步执行语句或函数 跳出当前函数 运行到光标处 自动单步运行 在当前位置添加断点 取消所有断点 快速查看变量
图2-13 运行工具栏
二、程序编译及下载
1.工程文件的建立与编译
3、MCU运行监视

AVR单片机(C语言)项目开发实践教程项目6 按键识别应用

AVR单片机(C语言)项目开发实践教程项目6 按键识别应用
while((PIND&0X10)==0); return key; break; } } key++;
if((PIND&0X20)==0) { delay(5); if((PIND&0X20)==0) {
while((PIND&0X20)==0); return key; break; } } key++; if((PIND&0X40)==0) { delay(5); if((PIND&0X40)==0) { while((PIND&0X40)==0); return key; break; } } key++;
图中的4输入与门用于产生按键中断,其输入端
与各列线相连,再通过上拉电阻接至+5V电源,输出
端接至16的外部中断输入端。具体工作如下:当键
PB0
盘无键按下时,与门各输入端均为高电平,保持输
PB1
PB2
出端为高电平;当有键按下时,端为低电平,向
PB3
PB4
CPU申请中断,若CPU开放外部中断,则会响应中
PB5
PB6
断请求,转去执行键盘扫描子程序。
PB7
五、矩阵键盘的接口实例
ATmega16单片机的PB口作为 键盘I/O口,键盘的列线接到PB口的 高4位,键盘的行线接到PB口的低4 位。作为输入时要打开内部上拉电阻 功能。在按键和I/O之间有一排限流 电阻。4根行线和4根列线形成16个 相交点,即:4*4键盘。
AVR单片机(C语言)项目开发实践 教程项目6 按键识别应用
项目六 按键识别应用
❖ 任务1 项目知识点学习 ❖ 任务2 多功能按键控制LED灯 ❖ 任务3 矩阵式键盘键值识别 ❖ 任务4 电话拨号显示控制

AVR教程第六课

AVR教程第六课

动手学AVR单片机六、流水灯实验---基于ATmega64CEPARK-AVR单片机教程.技术专家tiankai 原创专家技术博客地址: /space.php?uid=8160有技术类问题欢迎去给技术专家留言.推荐论坛:收集人:wang1jin 前面已经了解了AVR单片机的一些知识,另外我们也自制了avr单片机的开发工具,现在开始进入实战演练阶段了。

在正式开始之前,强烈建议手头准备一份ATmega64单片机的数据手册(中文和英文的最好都准备了),这个数据手册可以直接从网上下载。

在接下来的学习中,我们主要用到的开发工具是编程器,至于仿真器,可以少用或不用。

因为我们开始学习的都是一些比较简单、程序量也不大。

当程序中出现问题的时候,我们可以采用在程序可能出现问题的地方增加指示的方法来调试(比较常用的方法是在程序的特定地方点亮或者熄灭LED发光二极管,或者在程序中增加串口输出来提示程序的执行结果)。

一、编译软件的使用编译软件我们采用WINAVR,也就是俗称的GCC。

GCC支持项目开发(就是把项目中所有用到的程序、文件放置在一个文件夹中)。

在实际的开发过程中我们可以不必每次都创建新项目,可以直接编写源程序,然后保存为.c格式的文件后直接编译运行就可以了。

安装完GCC后,我们可以对编译器进行一些小小的设置,这样可以是我们编写出来的程序更加直观和便于查看。

1、打开WINAVR中的PN(Programmers NotePad),选择菜单“Tools”下面的“Options”选项,出现如下图所示的对话框、选择“Style”选项中的“Schemes”,开始设置程序中不同代码的显示颜色,首先设置预编译指令的颜色,如下图(颜色可以根据个人喜好设置)3、然后设置操作符(包括运算符)的颜色,如下图,4、接下来设置数字的颜色,如下图5、这些代码中不同代码设置成不同颜色可以帮助我们更加直观的分析程序,同时也便于我们查找错误,6、设置打印代码时最多打印列数,如下图7、设置新建文件的缺省类型(默认为.c文件),如下图8、编译快捷键设置,如下图9、经过以上设置以后,GCC编译环境已经基本符合我们的使用习惯了。

AVR单片机项目6 按键识别应用

AVR单片机项目6 按键识别应用

3.键盘的编码
4.键盘的工作方式
1.矩阵式键盘的结构与工作原理
用I/O口线组成行、列结构,行列线分别连在按键 开关的两端,按键处在行列线的交叉点上
K1 K5 K9 K13
K2 K6 K10 K14
K3 K7 K11 K15
K4 K8 K12 K16
2.矩阵式键盘按键的识别
a. 扫描法 b. 线反转法
3.按键开关的抖动问题
单片机系统中应用的一般是由机械触点构成的按键。当机械触点断 开、闭合时,会有抖动,如下图所示。在触点抖动期间检测按键的通与 断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多
次操作,这种情况是不允许出现的。
常用的去抖动方法有两种:
a.硬件方法
PD7
b.软件方法
a.硬件方法
《单片机应用技术》
项目六 按键识别应用
任务1 任务2 任务3 任务4
项目知识点学习 多功能按键控制LED灯 矩阵式键盘键值识别 电话拨号显示控制
【知识目标】
了解按键的确认与去抖原理以及方法
学会矩阵键盘的工作原理与内部连接 学会矩阵键盘的键值识别方法
【能力目标】
掌握按键的去抖方法 掌握矩阵键盘的应用系统的设计 掌握矩阵键盘的的程序编写、调试方法 。
二、按 键
键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件, 也就是说键盘是一组规则排列的开关。单片机使用的按键是一种常开型 的开关,平时按键的两个触点处于断开状态,按下键时它们才闭合。
1. 按键的分类
2. 按键输入原理 3. 按键开关的抖动问题
1.按键的分类
按键按照结构原理可分为两类:
1.触点式开关按键,如机械式开关、导电橡胶式开关等; 2.无触点开关按键,如电气式按键,磁感应按键等。 前者造价低,后者寿命长。目前单片机系统中最常见的是触点式 开关按键。

单片机原理及应用实验六--按键识别数码管显示实验

单片机原理及应用实验六--按键识别数码管显示实验

电子信息学院实验报告书课程名:《单片机原理及应用实验》题目:实验六按键识别数码管显示实验软件+硬件实验实验类别:【设计】班级:电子1313学号:26姓名:吴限评语:(1)电路连接调试:□正确□基本正确□不正确(2)实验程序编写:□正确□基本正确□不正确(3)数据测量分析:□准确□基本准确□不准确成绩:□A □B □C □D ,指导教师:王英赫1、实验内容或题目1)题目:按键识别数码管显示实验2)实验内容:数码管显示矩阵按键号。

2、实验目的与要求1)实验目的:掌握按键识别及数码管显示的实现方法。

2)实验要求:通过XL2000 的16 位矩阵按键,在数码管上分别显示0~9,A,B,C,D,E,F。

用Keil编译、Proteus仿真,代码下载到单片机实验箱上验证。

3、实验仪器(1)PC微机1台(2)实验箱 1台4、实验程序流程图5、实验程序 (实验程序清单作为附件放在最后)6、实验步骤1)keil 中C 语言程序实现。

2)在proteus 中完成电路图设计,并实现仿真。

开结初延显示有有判断N NY Y3)硬件实验部分:用一条8PIN 数据排线,把矩阵按键部份的JP50,接到CPU 部份的P1 口JP44;接8 位数码管的数据线。

将数码管部份的数据口JP5 接到CPU 部份的P0 口JP51;接8 位数码管的显示位线。

将数码管部份的显示位口JP8 接到CPU 部份的P2 口JP52.7、实验数据及结果8、思考题采用P3口控制矩阵按键输入,程序应该如何修改?答:本实验的程序中可以不用蜂鸣器驱动线,把以下程序的sbit BEEP = P3 ^ 7;及函数void beep()等删掉后;需要把扫描键值的函数改一下:unsigned char keyscan() {unsigned char scan1, scan2, keycode,j;P13= 0xf0;scan1 = P3;if (scan1 != 0xf0) //判键是否按下{delayms(10);scan1 = P3;if (scan1 != 0xf0) //二次判键是否按下{P1 = 0x0f;scan2 = P3;keycode = scan1 | scan2; //组合成键扫描编码for (j = 0; j < 16; j++){if (keycode == key_code[j]) //查表得键值{key = j;return (key); //返回有效键值}}}}elseP3 = 0xff;return (key = 16); //返回无效码} 即P1口换成P3口,而键编码数组是固定的,可以不变;此外主函数中的P1口也要改为P3口:void main(void) {P0 = 0xf7; //数码管初始显示"-"P2 = 0xfd;//数码管显示在第二位P3 = 0xff;while (1){keyscan();if (key < 16) //有效键值{P0 = disp_code[key]; //显示键值}}}<附件> 实验程序清单#include <reg52.h>#include <intrins.h>sbit BEEP = P3 ^ 7; //蜂鸣器驱动线unsigned char key;unsigned char code disp_code[] ={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xc0};unsigned char code key_code[] ={0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb,0xb7, 0x7e, 0x7d, 0x7b, 0x77 //键编码数组};char code SST516[3] _at_ 0x003b; //保留仿真器/********************延时子函数***************/void delayms(unsigned int ms){unsigned char t;while (ms--){for (t = 0; t < 114; t++);}}/*************x*0.14MS 延时子函数****************/void delayus(unsigned char x){unsigned char i;while (x--){for (i = 0; i < 14; i++){;}}}/******************蜂鸣器驱动子函数*****************/ void beep(){unsigned char i;for (i = 0; i < 250; i++){delayus(6);BEEP = !BEEP; //BEEP取反}BEEP = 1; //关闭蜂鸣器delayms(150); //延时}/******************键盘扫描子函数*********************/ unsigned char keyscan(){unsigned char scan1, scan2, keycode, j;P1 = 0xf0;scan1 = P1;if (scan1 != 0xf0) //判键是否按下{delayms(10); //延时10msscan1 = P1;if (scan1 != 0xf0) //二次判键是否按下{P1 = 0x0f;scan2 = P1;keycode = scan1 | scan2; //组合成键扫描编码for ( j = 0; j < 16; j++){if (keycode == key_code[ j]) //查表得键值{key = j;return (key); //返回有效键值}}}}elseP1 = 0xff;return (key = 16); //返回无效码}/*************************主函数***********************/void main(void){P0 = 0xf7; //数码管初始显示"-"P2 = 0xfd;//数码管显示在第二位P1 = 0xff;while (1){keyscan();if (key < 16) //有效键值{P0 = disp_code[key]; //显示键值beep(); //蜂鸣器响一声}}}。

单片机按键识别篇---单击---双击----长按

单片机按键识别篇---单击---双击----长按

单⽚机按键识别篇---单击---双击----长按 最近做⼀任务需要使⽤⼀个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复⽤情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,⼜上⽹看了些例程,算是对于按键的识别有点⼩⼩的了解,感觉这个功能挺实⽤,在此做个随笔。

⼀、思路 1.识别长按操作思路:我们使⽤系统定时器定时,然后让系统每过⼀段时间去扫描按键I/O⼝状态,当扫描到按键按下I/O⼝状态超过设定长按时间的阀值,就判定这次按键操作为“长按”操作; 2.识别单击操作思路:当系统扫描按键按下的I/O⼝时间⼩于我们设定的长按阀值,这时就可能出现两种情况,情况1.可能是单击;情况2.可能是双击;⾸先我们来说情况1,单击操作,这时我们可以检测按键按下后,按键弹起的时间到下次按键按下的时间间隔,当按键按下弹起到下次按键按下的时间超过某个值,则我们判定这次操作为“单击”操作; 3.识别双击操作思路:上⾯刚说的情况1,这次来说情况2,:双击操作,当我们检测按键按弹起后在⼀定时间阀值内,⼜检测到按键I/O⼝有电平变化,则我们判断这次操作为“双击”操作⼆、程序部分unsigned char scan_key(){/*值key_return如下:1---------单击2---------双击3---------长按*/static unsigned char key_state=0; //按键状态static unsigned char state=0;static unsigned char time,time1,time2;static unsigned char key_up_flag=0; //按键弹起标志位static unsigned char key_return;if(Key==0) //按键按下消抖{delay(50);if(Key==0){key_state=0;}}else{delay(50); //按键松开消抖if(Key==1){key_state=1;key_up_flag=0;}}if((state==0)&&(key_state==0)&&(key_up_flag==0)) //这⾥主要防⽌,按键在识别长按后,⼜会执⾏⼀遍单击操作{state=1;time=key_time; //记录按键按下的时间为多少,做标记}if(state==1){time1=key_time;time2=time1-time; //计算按键按下时长if(time2>50) //长按判断{state=2;}if(key_state==1) //按键弹起{state=3;time=key_time; //标志什么时间按键弹起的}}if(state==2) //长按{state=0; //重置状态key_up_flag=1;key_return=3;}if((state==3)&&(key_up_flag==0)){time1=key_time;time2=time1-time; //计算按键弹起后时间if(time2>6) //判断按键弹起后的时间,超过300ms,则说明为单击 {state=0;key_return=1;}else if(key_state==0) //按键弹起后,300ms内⼜有按键按下{state=4;}}if(state==4){if(key_state==1) //按键弹起{state=0;key_return=2;}}return key_return;}void timer0() interrupt 1//定时器T0中断函数⼊⼝{TH0=0X9E; //初值重载TL0=0X57; //定时50ms=50000us; 50000/2=25000key_time++; //50MS++}。

AVR单片机的c语言编程与应用

AVR单片机的c语言编程与应用

AVR单片机的c语言编程与应用第一章:引言1.1 研究背景AVR(Alf and Vegard's RISC)是一种低功耗、高性能的单片机系列,由Atmel 公司推出。

由于其优异的性能和广泛的应用领域,AVR单片机在工业控制、家用电器、通信设备等领域有着广泛的应用。

1.2 研究目的本章主要介绍AVR单片机的基本概念和特点,以及其在C语言编程和应用方面的优势。

同时,本章还将介绍AVR单片机的发展历程和应用领域,为后续章节的内容做铺垫。

第二章:AVR单片机的基本概念与特点2.1 AVR单片机的基本结构AVR单片机由中央处理器、存储器、输入输出设备和时钟电路组成。

其中,中央处理器是单片机的核心部件,负责执行程序和控制外设的工作。

存储器用于存储程序和数据,包括闪存、RAM和EEPROM等。

输入输出设备用于与外部世界进行通信,常见的有GPIO口、UART口、SPI口和I2C口等。

时钟电路用于提供时钟信号,控制单片机的工作节奏。

2.2 AVR单片机的特点AVR单片机具有以下几个特点:(1)低功耗:AVR单片机采用RISC架构,指令执行速度快,功耗低。

(2)高性能:AVR单片机的时钟频率高,能够实现高速的数据处理和通信。

(3)易编程:AVR单片机支持C语言编程,提供了丰富的库函数和开发工具,便于开发人员编写和调试程序。

(4)丰富的外设接口:AVR单片机提供了多个通用输入输出口和串口口,方便与外部设备进行通信。

(5)丰富的存储器:AVR单片机具有较大的闪存和RAM容量,能够存储更多的程序和数据。

第三章:AVR单片机的C语言编程基础3.1 C语言的基本语法C语言是一种结构化的高级程序设计语言,具有简洁、灵活、高效的特点。

本章将介绍C语言的基本语法,包括变量定义、数据类型、运算符和控制语句等。

3.2 AVR单片机的C语言编程环境AVR单片机的C语言编程环境主要包括编译器、开发工具和调试器。

编译器用于将C语言程序翻译成机器语言,常见的有AVR-GCC和IAR Embedded Workbench等。

任务二 多功能按键控制LED 灯_AVR单片机(C语言)项目开发实践教程_[共2页]

任务二 多功能按键控制LED 灯_AVR单片机(C语言)项目开发实践教程_[共2页]

AVR 单片机(C 语言)项目开发实践教程 72 第1步:将行线编程为输入线,列线编程为输出线,并使输出全为低电平。

则行线中电平由高到低变化的行为被按下键所在的行。

第2步:同第1步相反,将行线编程为输出线,列线编程为输入线,并使输出线输出全为低电平。

则列线中电平由高到低所在的列为按键所在的列。

综合这两步结果可确定按键所在的行和列,从而识别出所按下的键。

例如图6-5中第1行最后一个键被按下。

第1步列线输出行线输入,读入PB 口后得到0EH 。

第2步行线输出列线输入,再读入PB 口后得到E0H 。

综合第1、第2步,将两次得到的0EH 、E0H 合成为(相或)EEH ,则EEH 为被按下键3号键的键值。

照此分析,每个键的键值是唯一的。

这样我们通过查表方法就可圆满解决键识别的问题。

任务二 多功能按键控制LED 灯
一、任务要求
利用A Tmega16单片机数字I/O 口,实现对按键状态的读取,控制霓虹灯的不同显示花样。

例如:当按下开关按键K0,按下LED 进入可以点亮状态,K1有效,再按一下LED 进入熄灭状态,K1无效;连续按功能按键K1可以实现彩灯D1、D2、D3、D4的交替点亮,模拟家庭多功能彩灯功能。

二、硬件设计
多功能按键控制LED 电路原理图如图6-6所示,省略了ATmega16单片机外部应接的电源电路、复位电路等部分外围电路,PD7
、PD6分别接功能按键,PC0~PC3分别连接LED 。

图6-6 多功能按键控制LED 硬件原理图。

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用

【知识目标】
1. 了解LED发光二极管的驱动控制方法 2. 了解ATmega16单片机数字I/O口的结构 3. 了解ATmega16单片机数字I/O口的相关寄
存器功能
2021/8/3
【项目知识点与技能点】
1. 掌握单片机控制LED发光二极管驱动电 路的连接方法
2. 掌握ATmega16单片机数字I/O口的相关 寄存器功能的设置
位 PORTA.7 PORTA.6 PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0
复位值 0
0
0
0
0
0
0
0
2021/8/3
二、I/O接口的寄存器
• 端口输入寄存器:PINX(PINA)-----只读
位 PINA.7 PINA.6 PINA.5 PINA.4 PINA.3 PINA.2 PINA.1 PINA.0 复位值 N/A N/A N/A N/A N/A N/A N/A N/A
①DDRA为A口数据方向寄存器,用来定义A口的通讯方 向(输入/输出);
②PORTA为A口数据寄存器,用来输出数据(输入时, PORTX为高,打开上拉电阻);当PORTx=1时,I/O引脚高 电平,可提供输出20mA电流;当PORTx=0时,I/O引脚低电 平,可吸纳20mA电流。因此,AVR的I/O在输出方式下提供 了比较大驱动能力,可以直接驱动LED等小功率外围器件。
AVR单片机(C语言)项目开发实践 教程项目4 ATmega16单片机IO接口应

项目四 ATmega6单片机I/O口应用
• 任务一 项目知识点学习 • 任务二 LED闪烁灯控制 • 任务三 LED开关灯控制 • 任务四 汽车转向灯控制 • 任务五 霓虹灯控制 • 任务六 继电器控制照明设备

AVR单片机C语言编程

AVR单片机C语言编程
输入端口用于接收外部信号,而输出端口则用于 向外部设备发送信号。
输入输出端口的电压范围通常为0-5V。
输入输出端口的编程实例
• 以下是一个简单的AVR单片机输入输出端口的C语言编程示例
输入输出端口的编程实例
```c
int main(void)
输入输出端口的编程实例
{
DDRB |= (1 << DDB0); // 设置PB0为输出端口
串口发送数据
使用AVR单片机的发送缓冲寄存器,可以将数据发送到串口。
串口接收数据
使用AVR单片机的接收缓冲寄存器,可以接收来自串口的数据。
串口通信的扩展方法
扩展串口通信协议
根据实际需要,可以扩展串口通信协议,增加数据 传输的效率和可靠性。
多设备串口通信
通过多设备串口通信技术,可以实现多个设备之间 的数据传输和共享。
网络化串口通信
将串口通信与网络技术结合,可以实现远程控制和 数据传输。
06
AVR单片机的中断处理控 制
中断处理的工作原理
中断源
01
02
03
中断优先级
中断向量
AVR单片机具有多种中断源,包 括定时器/计数器中断、外部中 断、串行通信中断等。
多个中断同时发生时,需要根据 中断优先级来决定哪个中断先被 处理。
看门狗定时器控制
总结词
通过AVR单片机的C语言编程,可以实现看门狗定时器的控制。
详细描述
AVR单片机的看门狗定时器是一种用于系统恢复的机制。在C语言编程中,可 以使用内置的定时器/计数器或外部中断,实现对看门狗定时器的控制。
系统时钟设置控制
总结词
通过AVR单片机的C语言编程,可以实现对系统时钟 的设定和控制。

任务三 矩阵式键盘键值识别_AVR单片机(C语言)项目开发实践教程_[共3页]

任务三 矩阵式键盘键值识别_AVR单片机(C语言)项目开发实践教程_[共3页]

任务三 矩阵式键盘键值识别
一、任务要求
设计一个 4×4 的矩阵键盘识别显示系统,利用 ATmega16 单片机的 4 个数字 I/O 口作为行 线,4 个数字 I/O 端口作为列线,有按键按下数码管显示对应键值,并通过数码管显示按键的 键值。
二、硬件设计
将 16 个按键按照 4×4 的矩阵排列,按键两端按照图 6-8 所示分别接到 PD0~PD7,显示 部分采用了单个数码管。这里省略了 ATmega16 单片机外部应接的电源电路、复位电路等部分 外围电路。
74
}
switch(LED)
{
case 1:PORTC=0Xfe;break;
case 2:PORTC=0Xfd;break;
case 3:PORTC=0Xfb;break;
case 4:PORTC=0Xf7;break;
}
}
else PORTC=0XFF;
}
}
五、项目实施
1.根据元器件清单选择合适的元器件。 2.根据硬件设计原理图,在万能电路板进行元器件布局,并进行焊接工作。 3.焊接完成后,重复进行线路检查,防止短路、虚接现象。 4.在 AVR Studio 软件中创建项目,输入源代码并生成*.hex 文件。 5.在确认硬件电路正确的前提下,通过 JTAG 仿真器进行程序的下载与硬件在线调试。
AVR 单片机(C 语言)项目开发实践教程
if(LED_ON)
{ if(K1_ON())
//如果开关 K1ON())
LED++;
if(LED==5)
LED=1;
while(K1_ON());
do{_delay_ms(5);}while(K1_ON());

单片机原理-独立按键识别-单片机原理-实验报告

单片机原理-独立按键识别-单片机原理-实验报告
宁德师范学院计算机系
实验报告
(2014—2015学年 第2学期)
课程名称单片机原理
实验名称独立按键识别
专 业计算机科学与技术(非师)
年 级12级
学号B2012102147姓名王 秋
指导教师杨烈君
实验日期2015.5.27
实验目的:
1.掌握查询式按键的原理和编程方法
2.理解按键防抖技术
实验要求:一
1.在Proteus软件中画好51单片机最小核心 电路,包括复位电路和晶振电路
应的代码
if(Key==O)
{ delay(IOOO); if(Key==0) {
Mode=(Mode+1)%2; while(Key==O);
}}if(Mo来自e==0) Led 1=0;if(Mode==1)
{
Led仁〜Led1; delay(IOOO);
}
}
void mai n()
while⑴button_Cotrol();

2.
#i nclude"reg51.h"
#defi ne uchar un sig ned char
sbit Led仁P1A0;sbit Led2=P1A1;
sbit Led3=P1A2;sbit Led4=P1A3;
sbit Key=P3A2;
uchar Mode=0;
void delay(i nt x)II定义时间间隔
7.扩展要求:通过3个按键实现时钟的调整
(KEY1模式,KEY2+,KEY3-)
实验设备(环境):
计算机、Proteus ISIS7Professio nal应用程序、Keil应用程序
实验内容:

单片机按键矩阵识别(含程序、原理图)

单片机按键矩阵识别(含程序、原理图)

按键矩阵识别技术实验说明如图2所示,把P1端口的8条I/O口分成4条列线4条行线交叉但不接触构成4×4键盘阵列,16个按键放置交叉位置,这样在单片机复杂系统需要较多按键时,这种接法可以节省单片机的硬件资源。

1.结合给出的电路原理图试分析4*4键盘矩阵识别原理,及LED动态扫描原理。

(6分)2.根据分析的键盘矩阵识别原理设计程序实现一下功能:当按下某个按键时在2个七段数码管上显示该按键的编号(注意考虑同时按下多个按键时程序处理过程)、按下某个按键使其弹起时对于消抖情况程序的处理。

(9分)2.0相关原理图如下:3.0实验说明本试验给了1-8键判断方法。

按1-8键中任意键,则数码管显示该键编号。

想想怎样实现1-16个键的判断显示?参考程序见程序范例。

/************************************************************************ *******************描述: 按键距阵识别技术*编写: 秦立春*版本信息: V1.0 2008年4月20日*说明: sp1,sp2,SP3跳线向右;************************************************************************* *****************/#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define ON 0#define OFF 1uchar bdata OUT;sbit JDQ=OUT^0;sbit HF =OUT^1;sbit BZ =OUT^2;sbit AA =OUT^3;sbit BB =OUT^4;sbit CC =OUT^5;sbit DD =OUT^6;sbit X0=P2^0;sbit X1=P2^1;sbit X2=P2^2;sbit X3=P2^3;sbit Y0=P2^4;sbit Y1=P2^5;sbit Y2=P2^6;sbit Y3=P2^7;sbit RS=P1^7;sbit RW=P3^4;sbit E =P3^5;sbit HC574_LE=P3^3;//-----------------------------------------------------void delay(unsigned int t) // 延时函数{for(;t!=0;t--) ;}//------------------------------------------------------ void HC574(void) // 74HC574控制输出;{P0=OUT;HC574_LE=1;delay(2);HC574_LE=0;}//================================================== unsigned char Key_Scan(void){uchar a, key;P2=0xf0;if(!(Y0&&Y1&&Y2&&Y3)){P2=0xf0;delay(200);if(!(Y0&&Y1&&Y2&&Y3)){P2=0xff;X0=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0e);goto pp1;}P2=0xff;X1=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0d);goto pp1;} P2=0xff;X2=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0b);goto pp1;} P2=0xff;X3=0;if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x07);goto pp1;} }else a=0xff;}else a=0xff;pp1: key=a;return key;}//-----------------------------------------------------------uchar key(void){uchar k, KEY;KEY=0xff;k=Key_Scan();if(k!=0xff){while(k==Key_Scan());switch(k) // 键码{case 0x7e: KEY=0x04;break; // 4case 0x7d: KEY=0x08;break; // 8case 0x7b: KEY=0x0b;break; //case 0x77: KEY=0x0f;break; //case 0xbe: KEY=0x03;break; // 3case 0xbd: KEY=0x07;break; // 7case 0xbb: KEY=0x0a;break; //case 0xb7: KEY=0x0e;break; //case 0xde: KEY=0x02;break; // 2case 0xdd: KEY=0x06;break; // 6case 0xdb: KEY=0x00;break; // 0case 0xd7: KEY=0x0d;break; //case 0xee: KEY=0x01;break; // 1case 0xed: KEY=0x05;break; // 5case 0xeb: KEY=0x09;break; // 9case 0xe7: KEY=0x0c;break; //default: KEY=0xff;break; // 无键按下}}return KEY;}main(){uchar code shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4,0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,0x00,0xff}; //灭共阳极数码管显示段码 uchar i,k;uchar display[2]={0xff,0xff};RS=0; RW=0; E=0;OUT=0;HC574();delay(60000);while(1){k=key();if(k<=0x0f){display[0]=k/10;display[1]=k%10;}for(i=0;i<2;i++){P1=(~(0X01<<i))&0X7F; P0=shu[display[i]]; delay(100);}}}。

单片机原理(按键识别 )实验报告

单片机原理(按键识别 )实验报告
while(x--); } void main() {
教育资料
.
while (1) {
if(key==0) {
delay(1000); if(key==0) {
led=~led; while(key==0); }
} } } (2)按键识别 ( 按下灭,再按闪) #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit led=P2^6; sbit key=P2^7;
.
switch(j) { case 0 : led=0;break; case 1 : led=~led;delay(100);break; default:break; }
}
}
(3)按键识别 ( 按下数码管数值加 1) #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code LedCode[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar DispBuf[8]; sbit led=P2^6;
教育资料
.
if(hour>=24) {
hour=0; }
}
void main() {
uint i=2; while (1) {
if(key==0) {
delay(1000); if(key==0) {
i++; while(key==0); i=i%3;
教育资料
.
} } switch(i)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AVR单片机(C语言)项目开发实践 教程项目6 按键识别应用
项目六 按键识别应用
❖ 任务1 项目知识点学习 ❖ 任务2 多功能按键控制LED灯 ❖ 任务3 矩阵式键盘键值识别 ❖ 任务4 电话拨号显示控制
【知识目标】
❖ 了解按键的确认与去抖原理以及方法 ❖ 学会矩阵键盘的工作原理与内部连接 ❖ 学会矩阵键盘的键值识别方法
单片机I/O接口的逻辑是数字逻辑电平,即以电压的高和低作为逻辑 “1”和“0”,因此进入单片机的信号要求是电压信号。这些电压信号 又可分为单次信号和连续信号。
二、按 键
键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件, 也就是说键盘是一组规则排列的开关。单片机使用的按键是一种常开型 的开关,平时按键的两个触点处于断开状态,按下键时它们才闭合。
【能力目标】
❖ 掌握按键的去抖方法 ❖ 掌握矩阵键盘的应用系统的设计 ❖ 掌握矩阵键盘的的程序编写、调试方法 。
任务1 项目知识点学习
一、单片机的IO输入接口 二、按键 三、简单键盘接口 四、矩阵式键盘接口
一、单片机的IO输入接口
假如把一个单片机嵌入式系统比做一个人的话,那么单片机就相当 于人的心脏和大脑,而输入接口就好似人的感官系统,用于获取外部世 界的变化、状态等各种信息,并把这些信息输送进人的大脑。嵌入式系 统的人机交互通道、前向通道、数据交换和通信通道的各种功能都是由 单片机的输入接口及相应的外围接口电路实现的。 对于一个电子系统来讲,外部现实世界各种类型和形态的变化和状态都 需要一个变换器将其转换成电信号,而且这个电信号有时还需要经过处 理,使其成为能被MCU容易识别和处理的数字逻辑信号,这是因为单片 机常用的输入接口通常都是数字接口。
常用的去抖动方法有两种:
a.硬件方法
PD7
b.软件方法
a.硬件方法
在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态 触发器构成去抖动电路,如图所示 。
电路工作过程
电路工作过程:
按键未按下时,a = 0,b = 1,输出Q = 1,按键按下时,因按键的机 械弹性作用的影响,使按键产生抖动,当开关没有稳定到达b端时,因与 非门2输出为0反馈到与非门1的输入端,封锁了与非门1,双稳态电路的状 态不会改变,输出保持为1,输出Q不会产生抖动的波形。当开关稳定到 达b端时,因a = 1,b = 0,使Q = 0,双稳态电路状态发生翻转。当释放 按键时,在开关未稳定到达a端时,因Q = 0,封锁了与非门2,双稳态电 路的状态不变,输出Q保持不变,消除了后沿的抖动波形。当开关稳定到 达a端时,因a = 0,b = 1,使Q = 1,双稳态电路状态发生翻转,输出Q 重新返回原状态。由此可见,键盘输出经双稳态电路之后,输出已变为规 范的矩形方波。
b.软件方法
软件方法其实很简单,就是在单片机获得P1.0口为低电平的信息 后,不是立即认定S已被按下,而是延时10ms或更长一些时间后再次 检测P1.0口,如果仍为低电平,说明S的确按下了,这实际上是避开 了按键按下时的抖动时间。而在检测到按键释放后(P1.0为高电平) 再延时5~10ms,消除后沿的抖动,然后再对键值处理。当然,在实 际应用中,对按键的要求也是千差万别的,要根据不同的需要来编制 处理程序,但以上是消除按键抖动的原则。
场合。
三、键盘与单片机的连接
四、矩阵式键盘 ❖ 1.矩阵式键盘的结构与工作原理 ❖ 2.矩阵式键盘按键的识别 ❖ 3.键盘的编码 ❖ 4.键盘的工作方式
1.矩阵式键盘的结构与工作原理
用I/O口线组成行、列结构,行列线分别连在按键 开关的两端,按键处在行列线的交叉点上
K1
K2
K3
K4
K5
K6
K7
三、键盘与单片机的连接
如果系统只需几个按键,可直接采用I/O线构成单个按键电路,各个按
键之间相互独立,一根线上的按键状态不会影响其他输入线上的工作状态,
又称独立式键盘接口电路。
这种电路每个按键需要
占用一根I/O线,在按
键数量较多时,输入口
PD4
PD5
PD5
PD6
PD6
PD7
PD7
INT0
浪费大且电路结构很烦 琐,因此这种键盘接口 电路只适用于按键较少 或要求较高操作速度的
K8
K9
K10
K11
K12
K13
K14
K1扫描法 b. 线反转法
a.扫描法
以4×4键盘为例: (1)判断是否有键按下:使行线都输出0,检测列线的电平。如果列线上的
电平全为高,则表示没有键被按下。如果列线上的电平不全为高,则表示 有键被按下。 (2)按键键值:如果没有键闭合,就返回扫描。如果有键闭合,再进行逐 行扫描,找出闭合键的键号。先使D0=0,D1~D3=1,检测D4~D7上的 电平,如果D4=0,表示K1键被按下;同理,如果D5~D7=0,分别表示 K2、K3、K4键被按下;如果D4~D7=1,则表示这一行没有键被按下。 再使D1=0,D0、D2、D3为1,对第二行进行扫描,这样依次进行下去, 直到把闭合的键找到为止。
1. 按键的分类 2. 按键输入原理 3. 按键开关的抖动问题
1.按键的分类
按键按照结构原理可分为两类:
1.触点式开关按键,如机械式开关、导电橡胶式开关等; 2.无触点开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长。目前单片机系统中最常见的是触点式 开关按键。
按键按照接口原理可分为: 编码键盘主要是用硬件来实现
对于一个键盘或一组按键,单片机系统中总有一个接口电路与 CPU相连。CPU可以采用查询或中断方式了解有无按键输入并检查是 哪一个键按下,然后转入执行该键的功能程序,执行完后再返回主程 序。
3.按键开关的抖动问题
单片机系统中应用的一般是由机械触点构成的按键。当机械触点断 开、闭合时,会有抖动,如下图所示。在触点抖动期间检测按键的通与 断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多 次操作,这种情况是不允许出现的。
1.编码键盘
对键的识别,非编码键盘主要是由
2.非编码键盘
软件来实现键盘的定义与识别。
2.按键输入原理
在单片机应用系统中,除了复位按键有专门的复位电路及专一的 复位功能外,其他按键都是以开关状态来设置控制功能或输入数据。 当所设置的功能键或数字键按下时,单片机系统应完成该按键所设定 的功能,按键信息输入是与软件结构密切相关的过程。
相关文档
最新文档