AVR单片机(C语言)项目开发实践教程项目6 按键识别应用
- 格式:ppt
- 大小:4.09 MB
- 文档页数:40
动手学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编译环境已经基本符合我们的使用习惯了。
电子信息学院实验报告书课程名:《单片机原理及应用实验》题目:实验六按键识别数码管显示实验软件+硬件实验实验类别:【设计】班级:电子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语言编程与应用第一章:引言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等。
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 硬件原理图。