矩阵键盘控制数码管
4X4矩阵键盘控制数码管显示按键值

4X4矩阵键盘控制数码管显示按键值4X4矩阵键盘控制数码管显示按键值一、设计内容与要求用80C51单片机控制系统显示按键值0~F。
二、设计目的意义2.1 设计目的1、了解单片机系统中实现LED动态显示的原理及方法;2、详细了解8051芯片的性能及编程方法;3、了解单片机系统基本原理,了解单片机控制原理;4、掌握AT89C51输入/输出接口电路设计方法;5、掌握AT89C51程序控制方法;6、掌握单片机汇编编程技术中的设计和分析方法;7、掌握使用PROTEUS软件进行仿真的方法。
8、学会使用并熟练掌握电路绘制软件Protel99SE;9、掌握电路图绘制及PCB图布线技巧。
2.2 设计意义1、在系统掌握单片机相应基础知识的前提下,熟悉单片机应用系统的设计方法及系统设计的基本步骤。
2、完成所需单片机应用系统原理图设计绘制的基础上完成系统的电路图设计。
3、完成系统所需的硬件设计制作,在提高实际动手能力的基础上进一步巩固所学知识。
4、进行题目要求功能基础上的软件程序编程,会用相应软件进行程序调试和测试工作。
5、用AT89C51设计出题目所要求的数码管动态循环显示,并针对实际设计过程中软、硬件设计方面出现的问题提出相应解决办法。
6、通过单片机应用系统的设计将所学的知识融会贯通,锻炼独立设计、制作和调试单片机应用系统的能力;领会单片机应用系统的软、硬件调试方法和系统的研制开发过程,为进一步的科研实践活动打下坚实的基础。
三、系统硬件电路图3.1 Proteus软件简介以及仿真电路图Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、1ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
单片机入门-矩阵键盘控制数码管显示

} } }
t=P2; t=t&0xf0;
单片机晶振复位电路:
锁存器、上拉电阻:
4x4矩阵键盘:
代码实现:
void key44scan(void)//键盘扫描函数 {
uint t; P2=0xfe; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xee:keynum=1; break; case 0xde:keynum=5; break; case 0xbe:keynum=9; break; case 0x7e:keynum=13; break; } P0=table[keynum]; while(t!=0xf0) { t=P2; t=t&0xf0; } }
t=P2; t=t&0xf0; } }
P2=0xf7; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xe7:keynum=4; break; case 0xd7:keynum=8; break; case 0xb7:keynum=12; break; case 0x77:keynum=0; break; } P0=table[keynum]; while(t!=0xf0) {
} P0=table[keynum]; while(t!=0xf0) {
t=P2; t=t&0xf0; } }
P2=0xfb; t=P2; t=t&0xf0; if(t!=0xf0) {
delay(); t=P2;
switch(t) {
case 0xeb:keynum=3; break; case 0xdb:keynum=7; break; case 0xbb:keynum=11; break; case 0x7b:keynum=15; break; } P0=table[keynum]; while(t!=0xf0) {
单片机实验报告——矩阵键盘数码管显示

单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日矩阵键盘一、实验内容1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。
按其它键没有结果。
二、实验目的1、学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
5、掌握利用Keil51软件对程序进行编译。
6、会根据实际功能,正确选择单片机功能接线,编制正确程序。
对实验结果能做出分析和解释,能写出符合规格的实验报告。
三、实验原理1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
单片机12 矩阵键盘控制数码管

(一)复习引入
复习按键控制单个数码管的显示
(二)新课内容
1、电路原理图设计
矩阵式键盘由P3口控制,P3.0、P3.1、P3.2、P3.3引脚分别控制第一、二、三、四行(从上到下),P3.4、P3.5、P3.6、P3.7引脚分别控制第一、二、三、四列(从左到右)。动态数码管由P0口和P2口控制,P0口控制数码管的数值,P2口控制数码管的位码。
P1.41 1 1 00 0 0 0 第一行有按钮按下0xe0;
P1.51 1 0 10 0 0 0第二行有按钮按下0xd0;
P1.61 0 1 10 0 0 0第三行有按钮按下0xb0;
P1.70 1 1 10 0 0 0第四行有按钮按下0x70;
(4)确定了按钮的行与列,就能确定被按下按钮的位置,将按钮行与列的信息存于同一变量中(c=a|b),此时c变量中存储的就是被按下按键的键码,从键码就能判断按钮的位置,
情感态度价值观:培养学生分析问题、解决问题的能力
重点
能够读懂电路原理图,理解程序含义及步骤
难点
能够根据简单要求学会修改程序,达到教师要求
学情分析
学生思维灵活,课堂气氛活跃,喜欢动手操作
教学方法
一体化教学,着重实操教学
教学准备
根据教学要求做好PPT和演示程序,深入讲解程序
教学过程与内容
设计意图
教学方法
(2)若P1.0至P1.3有引脚产生了电平变化,则说明被拉低电平那一列有按钮被按下,用变量(这里假设是变量a)将IO口的二进制信息存储起来(a=P0;),其中高四位为行信息,所以一定为0,低四位为有效信息(反应出那一列有按钮按下),一共有以下四种情况:
P1.00 0 0 01 1 1 0第一列有按钮按下0x0e;
阐述数码管显示对应矩阵键盘值

阐述数码管显示对应矩阵键盘值
数码管显示和矩阵键盘值之间的关系是通过数字信号的传递和编码来实现的。
在数码管显示中,每个数码管都有七个LED灯,可以分别控
制其显示数字的不同部分。
这七个LED灯对应的位置被编码
为数字的七位二进制数。
例如,数字“0”的编码为“00111111”,其中每个1代表一个LED灯亮起来,每个0代表一个LED灯
灭掉。
在矩阵键盘中,每个按键都与一个特定的行和列相连。
当用户按下一个按键时,该按键所在的行和列的电路之间会形成一个连接,并产生一个特定的数字信号,该信号代表了该按键所对应的数值。
因此,通过将数码管和矩阵键盘连接起来,可以根据按键的行列位置,将相应的数字信号解码并显示在数码管上。
这使得用户可以直接通过矩阵键盘输入数字,并看到其相应的显示和输出。
89C52矩阵键盘控制数码管

}
void init() //初始化函数
{
TMOD=0x01;//设置定时器0为工作方式1(0000 0001)
TH0=(65536-45872)/256;//装初值50ms一次中断
TL0=(65536-45872)%256;
EA=1; //开总中断
dula=1;
P0=table[ge]; //送个位段选数据
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
sbit dula=P2^6; //申明U1锁存器的锁存端
sbit wela=P2^7; //申明U2锁存器的锁存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
if(key3==0)
{
num=0; //清0
while(!key3);
}
}
if(key4==0)
{
delayms(10);
if(key4==0)
{
while(!key4);
TR0=~TR0;//启动或停止定时器0
void delayms(uint);
MSP430单片机 矩阵键盘与数码管实验(附原理图)

MSP430单片机矩阵键盘与数码管实验(附原理图)/************************************************************* *MSP430单片机矩阵键盘与数码管实验*功能:用共阳极数码管显示按键的键值*适用:MSP430各系列单片机*by:duyunfu1987*************************************************************/ #include "msp430x44x.h"#define ROW P2OUT //矩阵键盘的行宏定义#define COL P2IN //矩阵键盘的列宏定义#define DPYOUT P3OUT //数码管输出口宏定义unsigned char keyval; //键值//共“阳”极数码管的码表unsigned char LED7CA[] ={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71,0xff};/********************************************************函数名称:keyscan()*功能:扫描4*3矩阵键盘,并返回键值*出口参数:若有按键则返回键值,若无按键返回15*4*3矩阵键盘:0 1 2 3* 4 5 6 7* 8 9 A b*******************************************************/ unsigned char keyscan(){int i=0;unsigned char key=0;ROW = 0x8f; //先置三行输出低电平if((COL & 0x0f)!= 0x0f) //是否有按键{do i++;while(i<3000); //消抖动延时ROW = 0xbf; //扫描第一行if((COL & 0x0f)== 0x0f){ ROW = 0xdf; //扫描第二行if((COL & 0x0f)== 0x0f){ ROW = 0xef; //扫描第三行if((COL & 0x0f)== 0x0f)key = 15;else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));if(key != 15)switch(key) //获取有效地键值{ case 0x48: key=0; break;case 0x44: key=1; break;case 0x42: key=2; break;case 0x41: key=3; break;case 0x28: key=4; break;case 0x24: key=5; break;case 0x22: key=6; break;case 0x21: key=7; break;case 0x18: key=8; break;case 0x14: key=9; break;case 0x12: key=10;break;case 0x11: key=11;break;default: key=15;}}else key = 15;keyval=key;return key;}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P3DIR |= 0xff;P3OUT = 0xff; //共阳极数码管输出口初始化P2DIR |= BIT4 +BIT5+BIT6; //先配置矩阵键盘的行(输出)//P2.6 第一行,P2.5 第二行,P2.4 第三行//P2.3 第一列,P2.2 第二列,P2.1 第三列,P2.0 第四列keyval=16;while(1){ keyscan();if(keyval != 15 && keyval<17)DPYOUT = LED7CA[keyval];//数码管显示键值}}。
实验五 矩阵式键盘按键值的数码管显示

实验五矩阵式键盘按键值的数码管显示一实验目的将矩阵键盘的键值采用LED数码管显示出来(分别考虑用动态显示、静态显示)二实验内容与具体任务描述任务1:行列式键盘接口,扫描实现LED动态显示键盘被按下。
将图中的动态显示改成静态显示。
:修改代码及图,2任务三设计的电路图与描述P1口控制键盘,P0口控制LED显示器。
四程序清单任务1:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字的段码0~9.unsigned char keyval; //定义变量储存按键值/**************************************************************函数功能:数码管动态扫描延时**************************************************************/ void led_delay(void){unsigned char j;for(j=0;j<200;j++);}/************************************************************** 函数功能:按键值的数码管显示子程序**************************************************************/ void display(unsigned char k){P2=0xbf; //点亮数码管DS6P0=Tab[k/10]; //显示十位led_delay(); //动态扫描延时P2=0x7f; //点亮数码管DS7P0=Tab[k_x0010_]; //显示个位led_delay(); //动态扫描延时}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值TR0=1; //启动定时器T0按键值初始化为// keyval=0x00;while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1出低电平“0”)if(P14==0) keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;if(P14==0) keyval=13; //可判断是S13键被按下if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}任务2:#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 数字// 0~9的段码//定义变量储存按键值unsigned char keyval;/**************************************************************函数功能:数码管动态扫描延时**************************************************************//*void led_delay(void){unsigned char j;for(j=0;j<20;j++);}/**************************************************************函数功能:按键值的数码管显示子程序**************************************************************/void display(unsigned char k){DS6 点亮数码管// P2=0x3f;P0=Tab[k/10]; //显示十位//动态扫描延时//led_delay();DS7 //点亮数码管//P2=0x7f;显示个位// P3=Tab[k_x0010_];//led_delay(); //动态扫描延时}/**************************************************************函数功能:软件延时子程序**************************************************************/void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/**************************************************************函数功能:主函数**************************************************************/void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0 的高8位赋初值TR0=1; //启动定时器T0keyval=0x00; //按键值初始化为0while(1) //无限循环{display(keyval); //调用按键值的数码管显示子程序}}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1{TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平ぜ,所有列线置为高电平if((P1&0xf0)!=0xf0) //列线中有一位为低电平ぜ,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平ぜ(P1.1 出低电平ぜ)if(P14==0) keyval=1; //可判断是S1键被按下if(P15==0) keyval=2; //可判断是S2键被按下if(P16==0) keyval=3; //可判断是S3键被按下if(P17==0) keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平ぜ(P1.1出低电平ぜ)if(P14==0)keyval=5; //可判断是S5键被按下if(P15==0) keyval=6; //可判断是S6键被按下if(P16==0) keyval=7; //可判断是S7键被按下if(P17==0) keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平ぜ(P1.2输出低电平ぜ)if(P14==0) keyval=9; //可判断是S9键被按下if(P15==0) keyval=10; //可判断是S10键被按下if(P16==0) keyval=11; //可判断是S11键被按下if(P17==0) keyval=12; //可判断是S12键被按下P1=0xf7;键被按下S13可判断是// keyval=13; if(P14==0)if(P15==0) keyval=14; //可判断是S14键被按下if(P16==0) keyval=15; //可判断是S15键被按下if(P17==0) keyval=16; //可判断是S16键被按下}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%6; //定时器T0的高8位赋初值}五运行结果任务1:两个LED显示器动态显示被按下键盘号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业综合设计报告项目名称:基于矩阵键盘和LED数码管显示器的简易人机界面设计学生姓名:同组同学:专业名称:班级:指导教师:项目起止日期:2012年03月12日至2012年03月30日目录摘要 (3)1、概述 (3)2、总体设计方案 (3)2.1总体设计要求 (3)2.2系统框图 (4)3、系统硬件设计 (4)3.1单片机的最小系统 (5)3.1.1电源电路 (5)3.1.2复位电路 (5)3.1.3晶振电路 (6)3.2 LED数码管显示部分 (6)3.3矩阵键盘 (7)3.3.1键盘的工作原理 (7)3.3.2键盘检测原理 (7)4、系统软件设计 (9)4.1 软件设计思想 (9)4.2 主程序设计 (10)4.3 子程序设计 (11)4.3.1 数码管显示程序设计 (11)4.3.2 键盘检测程序设计 (11)4.3.3延时函数程序设计 (14)5、系统调试 (14)6.设计体会 (15)参考文献 (15)摘要单片机自20世纪70年代以来,以其极高的性价比,以及方便小巧受到人们极大的重视和关注。
本设计选用AT89S52芯片作为控制芯片,来实现矩阵键盘对LED数码管显示的控制。
通过单片机的内部控制实现对硬件电路的设计,从而实现对4*4矩阵键盘的检测识别。
用单片机的P3口连接4×4矩阵键盘,并以单片机的P3.0-P3.3口作键盘输入的列线,以单片机的P3.4-P3.7口作为键盘输入的行线,然后用P0.0-P0.7作输出线,通过上拉电阻在显示器上显示不同的字符“0-F”。
在硬件电路的基础上加上软件程序的控制来实现本设计。
其工作过程为:先判断是否有键按下,如果没有键按下,则继续检测整个程序,如果有键按下,则识别是哪一个键按下,最后通过LED数码管显示该按键所对应的序号。
关键词:AT89S52芯片;4*4矩阵键盘;键盘识别;LED数码管1、概述随着单片机系统的日益更新,以及人们对产品的人机交互能力的不断提高;使得单片机系统的人机界面设计能力成为学习单片机的一项重要的基础内容。
而4*4键盘的操作和LED数码管的动态显示是人机界面设计中最基础的内容,掌握这些基础的设计能力对以后的学习研究是非常必要的。
2、总体设计方案2.1总体设计要求本系统采用单片机AT89S52为数码管的控制核心,制造一种简单的4*4键盘检测显示,能够在目测条件下四位数码管各段亮度均匀、充足,本系统具有硬件少,结构简单,容易实现,性能稳定可靠,成本低等特点。
根据设计要求,确定的设计方案如下:2.1.1 选择AT89S52单片机作为整个系统的核心器件,对整个系统进行总体控制,发送并实时处理系统信息。
2.1.2通过编程显示字符: 0-F。
2.1.3当检测有按键按下时数码管显示与该按键相对应的字符。
2.1.4 键盘检测信号连接到单片机的P3口,显示信号连接到单片机的P0口。
2.1.5数码管点亮过程有程序控制,P2.4,P2.5, P2.6,P2.7分别作为四位数码管的位选,数码管采用直接驱动方式,共阳极接法。
2.2系统框图本设计行、列驱动电路,显示屏电路,运用单片机的智能化,系统将每个功能电路模块连接在一起,总体结构设计如下图2-1所示:图2-1系统框图3、系统硬件设计本系统的硬件电路是由单片机最小系统、按键电路、数码管显示电路三部分组成。
其中,单片机最小系统包括电源电路、复位电路和晶振电路构成;按键电路采用独立编码方式;显示部分使用共阳型高台扫描、高态显示信号驱动电路,完成数字效果。
3.1单片机的最小系统3.1.1电源电路电源是一切器件工作的根本,有一个稳定的电源是很重要的。
由于单片机和数码管的功耗都很小,所以本设计选用单片机下载线直接供电,实验证明单片机和数码管的工作正常。
如图3-1所示,电源模块。
图3-13.1.2复位电路为了确保系统中电路稳定可靠地工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。
一般单片机电路正常工作需要供电5V±5%,即4.75~5.25V。
由于系统电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,系统电路开始正常工作。
复位电路如图3-2所示。
图3-23.1.3晶振电路晶振是为电路提供频率基准的元器件,通常分成有源晶振和无源晶振两个大类,无源晶振通常信号质量和精度较差,需要精确匹配外围电路(电感、电容、电阻等),如需更换晶振时要同时更换外围的电路。
有源晶振不需要芯片的内部振荡器,可以提供高精度的频率基准,信号质量也较无源晶振要好。
本设计选用有源晶振,晶振电路如图3-3所示。
图3-33.2 LED数码管显示部分数码管采用的是共阳极的四位数码管,由P2端口的4,5,6,7口分别作为四位数码管的位选,P0端口作为四位数码管的位选。
数码管电路图如图3-4所示。
图3-43.3矩阵键盘3.3.1键盘的工作原理按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
无按键按下时,行线处于高电平的状态,当有按键按下时,行线电平由此行线相连的列线电平决定。
3.3.2键盘检测原理键盘的检测,首先要解决的问题是键盘抖动现象。
(如图3-5所示)消抖的方法有两种,软件消抖和硬件消抖。
由于硬件消抖结构比软件复杂,所以本设计采用的是软件消抖的方法,既在程序中加入5毫秒的延时,延时后再次返回P3的值二次判断是否有键盘按下。
图3-5首先,将0xfe 赋于P3口(此值是用于检测矩阵键盘的第一行按键),然后看P3&0xf0是否等于0xf0,如果等于则键盘第一行无按键按下,反之则键盘第一行有按键按下。
具体是哪个键按下要根据P3&0xf0的值确定。
例如:P3&0xf0=0xe0,则表示键盘第一行的第一个键按下。
将键盘检测函数的值返回table[]中,这样数码管就能显示与按键一相对应的字符了。
P3等于0xfd ,0xfb ,0xf7分别用于检测按键的二,三,四行的,如果第一行检测无按键按下,则跳到其他行进行检测,如此循环。
键盘连接图如图3-6所示。
图3-64、系统软件设计4.1 软件设计思想主程序先进行设置数码管闲时显示‘- - - -’,并启动,再进行键盘检测载入0-F 字符,然后判断是否有按键按下,按不同情况进行循环调用子程序。
进入子程序后,首先设置相应的程序,反复调用显示子程序,并在显示过程中反复调用键盘扫描子程序进行延时,判断是否退出相应的显示子程序。
设计过程中,很好地提高了按键响应速度。
如图4-1所示为软件系统框图。
显示编码:因为该数码管为共阳极显示,可以把I/O 口输出位对应每段数码管显示段,因此若要使数码管一段点亮,则该位为“0”;该段不亮,则该位为“1”。
所以对“0-F ”的编码,并将编码写入数组中便于查表操作。
“0-F ”对应的十六进制数如下表4-2:表4-2图 4-1 软件设计框图4.2 主程序设计程序开始后只有一个不断执行键盘检测函数的循环。
图4-3为主程序的流程图。
图4-3 主程序流程图主程序如下:void main()//主函数{num=17;P2=0x0f;//数码管位选,让四个数码管都亮P0=0xbf;//数码管段选,程序刚开始数码管显示‘- - - -’while(1)//死循环,始终执行键盘检测和数码管的显示{P0=table[keyscan()-1];//数码管的显示,调用键盘检测函数}}4.3 子程序设计本设计的子程序包括数码管显示程序、按键检测程序、延时程序三种,下面依次详细介绍。
4.3.1 数码管显示程序设计将0-F字符的十六进制码编好,放入数组table[]中。
在程序开始时数码管显示‘- - - - ’。
当有按键按下时,则数码管显示与该按键相对应的字符。
数码管显示子程序如下:Uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};P2=0x0f;//数码管位选,让四个数码管都亮P0=table[keyscan()-1];//调用键盘检测函数4.3.2 键盘检测程序设计系统中采用4*4矩阵键盘,在P3口接按键,P0端口控制数码管显示。
在键盘检测函数里,依次送出列检测信号,而每组列检测信号输出后,即读取按键状态,若有按下按键,则进行键值的判断与计算,再将其对应的字符信号送入数码管显示。
部分键盘检测子程序如下:uchar keyscan()//键盘检测部分{P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);//延时5毫秒,消抖temp=P3;temp=temp&0xf0;while(temp!=0xf0)//再次确认是否有按键按下{temp=P3;switch(temp){case 0xee:num=1;//如果P3=0xee,则检测到键盘第一个键按下,以下同理break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5); //延时5毫秒,消抖temp=P3;temp=temp&0xf0;while(temp!=0xf0) //再次确认是否有按键按下{temp=P3;switch(temp){case 0xed:num=5;//如果P3=0xed,则检测到键盘第五个键按下,以下同理break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return num;}4.3.3延时函数程序设计本设计采用有返回值的延时函数,延时函数如下:void delay(uint z)//有返回值的延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}5、系统调试此次系统设计的结果很好,数码管和键盘都能按原先设想的工作。
这个方案设计的4*4键盘检测显示字符,电路简单,成本较低,且较容易扩展;数码管各段亮度均匀、充足;显示字符稳定、清晰无串扰.在KEIL软件中的仿真如图5-1所示。