《实验5-独立键盘和矩阵键盘.docx》由会员分享,可在线阅读,更多相关《实验5-独立键盘和矩阵键盘.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验5独立键盘和矩阵键盘一、实验目的1、学会用C语言进行独立按键应用程序的设计。2、学会用C语言进行矩阵按键应用程序的设计。二、实验内容1、独立按键:对四个独立按键编写程序:当按kl时,8个LED同时100ms闪 烁;当按k2时,8个LED从左到右流水灯显示;当按k3时,8个LED从右到 左流水灯显示;当按k4时,8各LED同时从两侧向中间逐步点亮,之后再从中 间向两侧逐渐熄灭;2、矩阵按键:采用键盘扫描方式,顺序按下矩阵键盘后,在一个数码管上顺序 显示0F,采用静态显示即可。3、提高部分(独立按键、定时器、数码管动态扫描):编写程序,实现下面的 功能。用数码管的两位显示一个十进制数,变化范围
2、为0059,开始时显示00,每按一 次kl,数值加1;每按一次k2,数值减1;每按一次k3,数值归零;按下k4, 利用定时器功能使数值开始自动每秒加1;再按一次k4,数值停止自动加1,保 持显示原数。三、实验步骤1、硬件连接(1)使用MicroUSB数据线,将实验开发板与微型计算机连接起来;(2)在实验开发板上,用数据线将相应接口连接起来;2、程序烧入软件的使用使用普中ISP软件将HEX文件下载至单片机芯片内。查看结果是否正确。四、实验结果一一源代码1. #include nreg52.hntypedef unsigned char u8;typedef unsigned int ul6;vo
3、id Time 1() interrupt 2THl=0Xd8;TLl=OXfO;t+;if(t=100)(t=0;sec+;if(sec=60)(sec=0;datapros();DigDisplayQ;五、实验体会一一结果分析1、独立按键:位定义四个按键keyl、key2、key3、key4,宏定义LED为P2 口, tab数组保存流水灯D0-D7依次点亮的数值,begMid数组保存流水灯同时从两侧 向中间逐步点亮,之后再从中间向两侧逐渐熄灭的赋值方式。现象:按下keyl, 8个LED同时100ms闪烁;按下key2,8个LED从左到右流水灯显示;按下key3, 触发外部中断0, 8个LE
4、D从右到左流水灯显示;按下key4,触发外部中断1, 8各LED同时从两侧向中间逐步点亮,之后再从中间向两侧逐渐熄灭。2、矩阵按键:宏定义GPIO_DIG为P0 口、GPIO_KEY为Pl 口,位定义 LSALSBLSC分别为P2.2/P2.3/P2.4 口,用来进行数码管位选,定义全局变量 KeyValue , smgduan数组保存数码管段选数据,打开第一个数码管 (LSA=LSB=LSC=O),执行按键处理函数,这里采用行列扫描方法,即先让P1 口高四位为0、低四位为1,判断有那一列为0;再让P1 口高四位为1、低四位 为0,判断哪一行被为0;这样由行和列可以确定出具体哪一个按键被按下,
5、按 键函数里的while循环是处理当按键持续按下并且超过5000ms时,强制退出按 键处理函数。之后给P0 口发送数码管段选数据。实验现象为:16个矩阵按键 S1-S16,假设按下S1,第一个数码管显示0,后面依次类推,到按下S16,显示 Fo3、提高部分(独立按键、定时器、数码管动态扫描):初始化定时器1,选择工作方式1,也就是16位定时/计数器,赋初值为10ms, 位定义独立按键keyl、key2、key3 key4,定义全局变量t自动初始化为0,当 t自增到100即计数100次每次10ms相当于1s时,使全局变量sec自增1,当 sec增加到第60s时,数码管重新以00开始计时,数码管段
6、选保存在数组里,位 选只有1和2位,因为只显示0-59s计数,通过循环选择。在主函数里,判断key4 是否按下,当按下时,重置定时器1中断标志位。实验现象为:当按下独立按键 key%数码管前两位开始从00开始计时到59,中间若再次按下key4,则计时停 止,只有再次按下key4,数码管才会在原来计时的基础上再次计时。计时满60 重新00开始,按下keyl,全局sec自增加1,秒数加1,;按下key2,全局sec 自减1,秒数减一;按下key3,全局sec初始为0,秒数重新初始为00。#define LED P2sbit keyl=P3Al;sbit key2=P3A0;sbit key3=P3
7、A2;sbit key4=P3 A3;const char tab= 0xfe90xfid,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;u8 code begMid=0x7e, 0xbd,0xdb,0xe75 Oxdb, Oxbd, 0x7e;void Delay(ul6 i) while(i-);void KeyDown()u8 i;if(key2=0)(Delay(lOOO);if(key2=0)(fbr(i=O;i8;i+)(LED=tabi;Delay(50000);while(!key2);)LED=0xff;else ififkeyl=O)fbr(i=0;i=0;i
8、)LED=tabi;Delay(50000);)void Intl() interrupt 2(u8 i;if(key4=0)Delay(lOOO);ififkey4=0)(fbr(i=0;i=6;i+)(LED=begMidi;Delay(50000);)2.#include)reg52.h typedef unsigned int ul6;typedef unsigned char u8;#define GPIO_DIG PO#define GPIO KEYP1sbit LSA=P2A2;sbit LSB=P2 A3;sbit LSC=P2A4;u8 Key Value;u8 code s
9、mgduan17=0x3f90x0650x5b50x4f,0x66,0x6d90x7d50x0790x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 ;/?0 F?void delay(ul6 i)(while(i-);)void KeyDown(void)(char a=0;GPIO_KEY=OxOf;if(GPIO_KEY!=OxOf)(delay(lOOO);if(GPIO_KEY!=OxOf)(GPIO_KEY=OXOF;switch(GPIO_KEY)(case(0X07): KeyValue=O;break;case(OXOb): KeyValue= 1
10、 ;break;case(OXOd): KeyValue=2;break;case(OXOe): KeyValue=3;break;GPIO_KEY=OXFO;switch(GPIO_KEY)case(0X70): KeyValue=KeyValue;break;case(OXbO): KeyValue=KeyValue+4;break;case(OXdO): KeyValue=KeyValue+8;break;case(OXeO): KeyValue=KeyValue+12;break;)while(a50)&(GPIO_KEY!=0xf0)(delay(lOOO);a+;)void mai
11、n()(LSA=0;LSB=O;LSC=O;while(l)(KeyDown();GPIO_DIG=smgduan Key Value;3.#include typedef unsigned int ul6;typedef unsigned char u8;#define KEYPORT P3sbit LSA=P2A2;sbit LSB=P2 A3;sbit LSC=P2A4;sbit keyl=P3Al;sbit key2=P3A0;sbit key3=P3A2;sbit key4=P3 A3;ul6 t;u8 sec;u8 DisplayData2;u8 code smgduan=0x3f
12、90x0650x5b50x4f90x6690x6d50x7d50x0790x7f50x6f; void Timellnit()(TMOD |= 0x10;THl=0Xd8;TLl=0XfD;EA=1;ET1=1;)void delay(ul6 i)while(i); void DigDisplay()(u8 i;fdr(i=0;i2;i+)switch(i)case O:LSA=O;LSB=O;LSC=O;break;case 1 :LSA=1 ;LSB=O;LSC=O;break;)PO=DisplayDatai;delay(lOO);P0=0x00;)void datapros()Disp
13、layDataO=smgduansec% 10;DisplayDatal =smgduansec/l 0;)void main()(Timellnit();while(l)(if(key4=0)(delay(lOOO);if(key4=0)TR1=!TR1;while(key4=0);)if(key3=0)delay(lOOO);if(key3=O)sec=O;while(key3=0);if(key2=0)(delay(lOOO);if(key2=0)(sec;while(key2=0);)if(keyl=O)(delay(lOOO);if(keyl=O)(sec+;while(keyl=O);)