【独立按键】状态机法

        在IAP15f261S单片机中,独立按键属于矩阵键盘中的一部分,如下图:

        可以看到,当跳线帽接在J5的2,3口上时只有S4~S7起作用,此时为独立按键状态,由P33~P30低四位控制。

        我们可以通过这个函数来判断按键的IO情况:

u8 vBTN_Read(void) 				//10ms执行一次
{ 
	static u8 key_state = 0; 	//定义key_state为静态变量,用于保存每次按键的状态
	u8 key_io = 0, key_val = 0; //key_io:读取的IO状态; key_val:返回的键值;
	
	key_io = P3 & 0x0f; 		//对P3读回来的高4位IO清零,屏蔽不关心的IO状态
	switch(key_state) 
	{ 	
		case KEY_NO:     								//无按键状态,用于判断是否按下
			if(key_io!=0x0f) key_state = KEY_DOWN; 
		break; 

		case KEY_DOWN:    								//有按键按下状态,判断是否为抖动
			if(key_io!=0x0f)
			{ 
				if(key_io==0x0e) key_val = 7;  	//S7
				if(key_io==0x0d) key_val = 6;  	//S6
				if(key_io==0x0b) key_val = 5;  	//S5
				if(key_io==0x07) key_val = 4;  	//S4
				key_state = KEY_UP;  
			} 
			else 
				key_state = KEY_NO;  
		break;  
		
		case KEY_UP: 									//等待松手状态,判断是否弹起
			if(key_io==0x0f) key_state = KEY_NO; 
		break; 
	} 
	return key_val; 
} 

        接着我们来实现一个效果:

        Description: 
            统计S4按下的次数:每按下一次S4,数码管的数字+1 (默认数字是0)
Attention:
            一个好的按键程序,必须有:
            (1)消抖;
            (2)按键状态的判断,包括判断按键按下,判断按键弹起;
            (3)不阻塞程序,不用delay消抖

 源代码:

/*************************************************
File name: 	 【独立按键】状态机法
Description: 
			统计S4按下的次数:每按下一次S4,数码管的数字+1 (默认数字是0)
Attention:
			一个好的按键程序,必须有:
			(1)消抖;
			(2)按键状态的判断,包括判断按键按下,判断按键弹起;
			(3)不阻塞程序,不用delay消抖
			
Copyright (c) 电子设计工坊 dianshe.taobao.com
All rights reserved
*************************************************/
#include "system.h"
#include <intrins.h>
#include "Delay.h"
#include "Device.h"
u8 code smg_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x76,0x79,0x38};	//共阴数码管码表
																//	  H  ,  E ,  L


HexToBin led_ctrl,uln_ctrl;
/**
  * @brief  系统初始化函数:关闭继电器、蜂鸣器
  * @param  None
  * @retval None
  * @author dianshe.taobao.com
  */
void vSystem_Init(void)
{
	vDevice_Ctrl(0xa0,0); 				/* 关闭蜂鸣器、继电器*/
	led_ctrl.hex=0xff;
	vDevice_Ctrl(0x80,led_ctrl.hex); 	/* 关闭LED*/
}

void vTimer2_Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0x18;			//设置定时初值
	T2H = 0xFC;			//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	IE2 |= 0x04;        //开定时器2中断
	EA = 1;				//开启总中断
}


//独立按键状态机法
#define KEY_NO   0  //无按键状态,用于判断是否按下
#define KEY_DOWN 1  //有按键按下状态,判断是否为抖动
#define KEY_UP   2  //等待松手状态,判断是否弹起
   
u8 vBTN_Read(void) 				//10ms执行一次
{ 
	static u8 key_state = 0; 	//定义key_state为静态变量,用于保存每次按键的状态
	u8 key_io = 0, key_val = 0; //key_io:读取的IO状态; key_val:返回的键值;
	
	key_io = P3 & 0x0f; 		//对P3读回来的高4位IO清零,屏蔽不关心的IO状态
	switch(key_state) 
	{ 	
		case KEY_NO:     								//无按键状态,用于判断是否按下
			if(key_io!=0x0f) key_state = KEY_DOWN; 
		break; 

		case KEY_DOWN:    								//有按键按下状态,判断是否为抖动
			if(key_io!=0x0f)
			{ 
				if(key_io==0x0e) key_val = 7;  	//S7
				if(key_io==0x0d) key_val = 6;  	//S6
				if(key_io==0x0b) key_val = 5;  	//S5
				if(key_io==0x07) key_val = 4;  	//S4
				key_state = KEY_UP;  
			} 
			else 
				key_state = KEY_NO;  
		break;  
		
		case KEY_UP: 									//等待松手状态,判断是否弹起
			if(key_io==0x0f) key_state = KEY_NO; 
		break; 
	} 
	return key_val; 
} 

//按键处理函数
u8 cnt_key;
u8 s4_number;
void vBTN_Process(void)
{
	u8 key_val;
	if(cnt_key>=10)
	{
		cnt_key=0;
		key_val = vBTN_Read();
		if(key_val==4)
		{
			s4_number++;
		}
	}
}

//数码管操作函数
u8 smg_buf[8];
void vSMG_Process()
{
	smg_buf[0]=smg_code[s4_number/100];
	smg_buf[1]=smg_code[s4_number/10%10];
	smg_buf[2]=smg_code[s4_number%10];
	smg_buf[3]=0x00;
	smg_buf[4]=0x00;
	smg_buf[5]=0x00;
	smg_buf[6]=0x00;
	smg_buf[7]=0x00;
}

void main(void)
{
	vSystem_Init();
	vTimer2_Init();
	while(1)
	{
		vBTN_Process();
		vSMG_Process();
		
	}
}


//数码管显示函数
void vSMG_Display()
{
	static u8 i=0;
	vDevice_Ctrl(0xc0,0);
	vDevice_Ctrl(0xe0,~smg_buf[i]);
	vDevice_Ctrl(0xc0,0x01<<i);
	i = (i + 1) % 8;
}

//中断服务程序
void vTimer2_ISR() interrupt 12     	//中断入口
{
	cnt_key++;
	vSMG_Display();
}

 头文件:

#ifndef __SYSTEM_H_
#define __SYSTEM_H_

#include <STC15F2K60S2.H>

typedef char s8;
typedef unsigned char u8;
typedef int s16;
typedef unsigned int  u16;
typedef unsigned long u32;

/* 用typedef定义一个叫bits的结构体“数据类型”, 从而可以用 bits b; 定义b为结构体的“变量”*/
typedef struct
{
	u8 b0 : 1;
	unsigned char b1 : 1;
	unsigned char b2 : 1;
	unsigned char b3 : 1;
	unsigned char b4 : 1;
	unsigned char b5 : 1;
	unsigned char b6 : 1;
	unsigned char b7 : 1;
}bits;

/* 用typedef定义一个叫HexToBin的共用体“数据类型”, 从而可以用 HexToBin led_ctrl; 定义led_ctrl为共用体的“变量”*/
typedef union
{
	unsigned char hex;		
	bits b;
}HexToBin;


#endif

 

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学习单片机100例目录 目录 1 ************************************************************函数的使用和熟悉*************** ************************************************/ 4 实例3:用单片机控制第一个灯亮 4 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 4 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 5 实例6:使用P3口流水点亮8位LED 5 实例7:通过对P3口地址的操作流水点亮8位LED 6 实例8:用不同数据类型控制灯闪烁时间 7 实例9:用P0口、P1 口分别显示加和减运算结果 8 实例10:用P0、P1口显示乘运算结果 9 实例11:用P1、P0口显示除运算结果 9 实例12:用自增运算控制P0口8位LED流水花样 10 实例13:用P0口显示逻辑"与"运算结果 10 实例14:用P0口显示条件运算结果 11 实例15:用P0口显示按位"异或"运算结果 11 实例16:用P0显示左移运算结果 11 实例17:"万能逻辑电路"实验 11 实例18:用右移运算流水点亮P1口8位LED 12 实例19:用if语句控制P0口8位LED的流水方向 13 实例20:用swtich语句的控制P0口8位LED的点亮状态 13 实例21:用for语句控制蜂鸣器鸣笛次数 14 实例22:用while语句控制LED 16 实例23:用do-while语句控制P0口8位LED流水点亮 16 实例24:用字符型数组控制P0口8位LED流水点亮 17 实例25: 用P0口显示字符串常量 18 实例26:用P0 口显示指针运算结果 19 实例27:用指针数组控制P0口8位LED流水点亮 19 实例28:用数组的指针控制P0 口8 位LED流水点亮 20 实例29:用P0 、P1口显示整型函数返回值 21 实例30:用有参函数控制P0口8位LED流水速度 22 实例31:用数组作函数参数控制流水花样 23 实例32:用指针作函数参数控制P0口8位LED流水点亮 23 实例33:用函数型指针控制P1口灯花样 25 实例34:用指针数组作为函数的参数显示多个字符串 26 实例35:字符函数ctype.h应用举例 27 实例36:内部函数intrins.h应用举例 27 实例37:标准函数stdlib.h应用举例 28 实例38:字符串函数string.h应用举例 29 实例39:宏定义应用举例2 29 实例40:宏定义应用举例2 30 实例41:宏定义应用举例3 30 *************************************************************** **中断、定时器********中断、定时器************ *********中断、定时器*********中断、定时器******** **** ********************************************************/ 31 实例42:用定时器T0查询方式P2口8位控制LED闪烁 31 实例43:用定时器T1查询方式控制单片机发出1KHz音频 31 实例44:将计数器T0计数的结果送P1口8位LED显示 32 实例45:用定时器T0的中断控制1位LED闪烁 33 实例46:用定时器T0的中断实现长时间定时 34 实例47:用定时器T1中断控制两个LED以不同周期闪烁 34 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 36 实例49:用定时器T0的中断实现"渴望"主题曲的播放 36 实例50-1:输出50个矩形脉冲 39 实例50-2:计数器T0统计外部脉冲数 40 实例51-2:定时器T0的模式2测量正脉冲宽度 40 实例52:用定时器T0控制输出高低宽度不同的矩形波 41 实例53:用外中断0的中断方式进行数据采集 42 实例54-1:输出负脉宽为200微秒的方波 43 实例54-2:测量负脉冲宽度 43 实例55:方式0控制流水灯循环点亮 44 实例56-1:数据发送程序 45 实例56-2:数据接收程序 47 实例57-1:数据发送程序 47 实例57-2:数据接收程序 49 实例58:单片机向PC发送数据 50 实例59:单片机接收PC发出的数据 51 *****************************************************************数码管显示*****数码管显示******************** 数码管显示****************数码管显示***************************************************/ 52 实例60:用LED数码显示数字5 52 实例61:用LED数码显示器循环显示数字0~9 52 实例62:用数码管慢速动态扫描显示数字"1234" 53 实例63:用LED数码显示器伪静态显示数字1234 54 实例64:用数码管显示动态检测结果 54 实例65:数码秒表设计 56 实例66:数码时钟设计 58 实例67:用LED数码管显示计数器T0的计数值 62 实例68:静态显示数字“59” 63 ******************************************************************** **键盘控制*********键盘控制*************** ***************键盘控制**** *****键盘控制**** ****** *****************************************************/ 63 实例69:无软件消抖的独立式键盘输入实验 64 实例70:软件消抖的独立式键盘输入实验 64 实例71:CPU控制的独立式键盘扫描实验 65 实例72:定时器中断控制的独立式键盘扫描实验 68 实例73:独立式键盘控制的4级变速流水灯 71 实例74:独立式键盘的按键功能扩展:"以一当四" 73 实例75:独立式键盘调时的数码时钟实验 75 实例76:独立式键盘控制步进电机实验 79 实例77:矩阵式键盘按键值的数码管显示实验 82 //实例78:矩阵式键盘按键音 85 实例79:简易电子琴 86 实例80:矩阵式键盘实现的电子密码锁 92 ************************************************************************ **液晶显示LCD*********液晶显示LCD *****液晶显示LCD ************* *******液晶显示LCD*********液晶显示LCD *****液晶显示LCD **** ****** ***********************************************************/ 95 实例81:用LCD显示字符'A' 96 实例82:用LCD循环右移显示"Welcome to China" 99 实例83:用LCD显示适时检测结果 102 实例84:液晶时钟设计 106 *******************************************************************一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控**********************************************/ 112 实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 112 实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 117 实例87:对I2C总线上挂接多个AT24C02的读写操作 124 实例88:基于AT24C02的多机通信 读取程序 129 实例88:基于AT24C02的多机通信 写入程序 133 实例90:DS18B20温度检测及其液晶显示 144 实例91:将数据"0xaa"写入X5045再读出送P1口显示 153 实例92:将流水灯控制码写入X5045并读出送P1口显示 157 实例93:对SPI总线上挂接多个X5045的读写操作 161 实例94:基于ADC0832的数字电压表 165 实例95:用DAC0832产生锯齿波电压 171 实例96:用P1口显示红外遥控器的按键值 171 实例97:用红外遥控器控制继电器 174 实例98:基于DS1302的日历时钟 177 实例99:单片机数据发送程序 185 实例100:电机转速表设计 186 模拟霍尔脉冲 192
目录 1 引言 2 4×4矩阵键盘控制LED工作原理及软硬件设计、 仿真调试 2.1 4×4矩阵式键盘识别显示系统概述 2.2 4×4矩阵式键盘原理 2.3 4×4矩阵式键盘控制LED显示方 2.4 电路设计及电路图 2.5 4×4矩阵式键盘软件编程 2.6 4×4矩阵式键盘软件仿真调试分析 3 结论 4参考文献 1 引言 随着现代科技日新月异的发展,作为新兴产业,单片机的 应用越来越广。单片机以其体积小、重量轻、功能强大、功耗 低等特点而备受青睐。键盘作为一种最为普遍的输入工具在单 片机项目应用上显得尤为重要。 用MCS51系列的单片机并行口P1接4×4矩阵键盘,以 P1.0-P1.3 作输入线,以P1.4-P1.7作输出线;在数码管上显示 每个按键的0-F序号。 2 4×4矩阵键盘控制LED工作原理及软硬件 设计、仿真调试 2.1 4×4矩阵式键盘识别显示系统概述 矩阵式键盘模式以4个端口连接控制4*4个按键,实时在LED数 码管上显示按键信息。显示按键信息,省下了很多的I/O端口 为他用,相反,独立式按键虽编程简单,但占用I/O口资源较 多,不适合在按键较多的场合应用。矩阵式键盘简介:矩阵式 键盘又称行列键盘,它是用4条I/O线作为行线,4条I/O线作为 列线组成的键盘。在行线和列线的每个交叉点上设置一个按 键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构 能有效地提高单片机系统中I/O口的利用率。 最常见的键盘布局如图1所示。一般由16个按键组成,在单片 机中正好可以用一个P口实现16个按键功能,这也是在单片机 系统中最常用的形式,本设计就采用这个键盘模式。 2.2 4×4矩阵式键盘原理 在占用相同的I/O端口的情况下,行列式键盘的接会比 独立式接允许的按键数量多。   行列式键盘的工作方式是先用列线发送扫描字,然后读取 行线的状态,查看是否有按键按下。键盘部分提供一种扫描的 工作方式,可以和具有64个按键的矩阵键盘相连接,能对键盘 不断扫描、自动消抖、自动识别按下的键,并给出编码,能对 双键或n个键同时按下的情况实行保护。   在显示部分,它可以为发光二极管、荧光管及其他显示器 提供按扫描方式工作的显示接口,而且为显示器提供多路复用 信号,可以显示多达16位的字符或数字。   键盘中有无按键按下是由列线送入全扫描字、行线读入行 线状态来判断的,其方是将列线的所有I/O线均置成低电 平,然后将行线电平状态读入累加器A中,如果有键按下,总 会有一根行线被拉至低电平,从而使行输入不全为1。   键盘中哪一个键按下可由列线逐列置低电平后,检查行输 入状态来判断,其方是依次给列线送低电平,然后检查所有 行线状态,如果全为1,则所按下的键不在此列,如果不全为 1,则所按下的键必在此列,而且是在与0电平线相交的交点上 的那个键。 2.3 4×4矩阵式键盘控制LED显示方 (1)在"单片机系统"区域中,把单片机的P1.0-P1.7端 口通过8联拨动拨码开关JP3连接到"4*4行列式键盘"区域中 的M1-M4,N1-N4端口上。即将P1口作为整个系统的输入接口 电路 。 (2)在"单片机系统"区域中,把单片机的P0.0-P0.6端 口通过上拉电阻连接到"静态数码显示模块"区域中的任何一 个a-g端口上。 (3)此实验采用的是共阴极LED显示块,只有当a-g端口输 入高电平时才有效,即显示块中的对应的发光二极管才发光, 低电平时不显示,通过a-g端口的不同输入使显示器显示不同 的字符。 2.4 电路设计及电路图 把89C51单片机的P1.0-P1.7端口通过8联拨动拨码开关连 接到"4*4行列式键盘",其中P1.0-P1.3作为列线,P1.4- P1.7作为行线,把单片机的P0.0-P0.6端口连接到共阴极"静 态数码显示模块"区域中对应的a-g端口上;系统首先通过CPU 对全部键盘进行扫描,即把第一根行线置为"0"状态,其余 行线置于"1"状态,读入输入缓冲器的状态,若其状态全 为"1"表明该行无键按下,再将第二根行线置为"0"状态, 同样读入输入缓冲器的状态,如其状态也全为"1",则置第 一根行线置为"0"状态,以此类推。如读入输入缓冲器的状 态不全为"1",确定哪一根列线为"0"状态,当某个键的行 线和列线都为"0"状态时,表明该键按下。最后通过显示程 序将该键的序号显示出来。(如下图2) 图2 4×4矩阵式键盘电路图 2.5 4×4矩阵式键盘软件编程 KEY EQU 30H ORG 0000H ;入口地址 SJMP START START:MOV P0,#00H JIXU:MOV P1,#0FFH ;判第0行是否有键按下 CLR P1.4 ;将P1.4清零 MOV A,P1 ANL A,#0FH ;屏蔽高4位
单片机c语言编程100个实例目录1 函数的使用和熟悉 实例3:用单片机控制第一个灯亮 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 实例6:使用P3口流水点亮8位LED 实例7:通过对P3口地址的操作流水点亮8位LED 实例8:用不同数据类型控制灯闪烁时间 实例9:用P0口、P1 口分别显示加和减运算结果 实例10:用P0、P1口显示乘运算结果 实例11:用P1、P0口显示除运算结果 实例12:用自增运算控制P0口8位LED流水花样 实例13:用P0口显示逻辑"与"运算结果 实例14:用P0口显示条件运算结果 实例15:用P0口显示按位"异或"运算结果 实例16:用P0显示左移运算结果 实例17:"万能逻辑电路"实验 实例18:用右移运算流水点亮P1口8位LED 实例19:用if语句控制P0口8位LED的流水方向 实例20:用swtich语句的控制P0口8位LED的点亮状态 实例21:用for语句控制蜂鸣器鸣笛次数 实例22:用while语句控制LED 实例23:用do-while语句控制P0口8位LED流水点亮 实例24:用字符型数组控制P0口8位LED流水点亮 实例25: 用P0口显示字符串常量 实例26:用P0 口显示指针运算结果 实例27:用指针数组控制P0口8位LED流水点亮 实例28:用数组的指针控制P0 口8 位LED流水点亮 实例29:用P0 、P1口显示整型函数返回值 实例30:用有参函数控制P0口8位LED流水速度 实例31:用数组作函数参数控制流水花样 实例32:用指针作函数参数控制P0口8位LED流水点亮 实例33:用函数型指针控制P1口灯花样 实例34:用指针数组作为函数的参数显示多个字符串 单片机c语言编程100个实例目录2 实例35:字符函数ctype.h应用举例 实例36:内部函数intrins.h应用举例 实例37:标准函数stdlib.h应用举例 实例38:字符串函数string.h应用举例 实例39:宏定义应用举例2 实例40:宏定义应用举例2 实例41:宏定义应用举例3 * 中断、定时器中断、定时器 *中断、定时器*中断、定时器 / 实例42:用定时器T0查询方式P2口8位控制LED闪烁 实例43:用定时器T1查询方式控制单片机发出1KHz音频 实例44:将计数器T0计数的结果送P1口8位LED显示 实例45:用定时器T0的中断控制1位LED闪烁 实例46:用定时器T0的中断实现长时间定时 实例47:用定时器T1中断控制两个LED以不同周期闪烁 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 实例49:用定时器T0的中断实现"渴望"主题曲的播放 实例50-1:输出50个矩形脉冲 实例50-2:计数器T0统计外部脉冲数 实例51-2:定时器T0的模式2测量正脉冲宽度 实例52:用定时器T0控制输出高低宽度不同的矩形波 实例53:用外中断0的中断方式进行数据采集 实例54-1:输出负脉宽为200微秒的方波 实例54-2:测量负脉冲宽度 实例55:方式0控制流水灯循环点亮 实例56-1:数据发送程序 实例56-2:数据接收程序 实例57-1:数据发送程序 实例57-2:数据接收程序 实例58:单片机向PC发送数据 实例59:单片机接收PC发出的数据 *数码管显示*数码管显示 数码管显示数码管显示*/ 实例60:用LED数码显示数字5 实例61:用LED数码显示器循环显示数字0~9 实例62:用数码管慢速动态扫描显示数字"1234" 实例63:用LED数码显示器伪静态显示数字1234 实例64:用数码管显示动态检测结果 实例65:数码秒表设计 实例66:数码时钟设计 实例67:用LED数码管显示计数器T0的计数值 实例68:静态显示数字“59” 单片机c语言编程100个实例目录3 键盘控制*键盘控制* *键盘控制 *键盘控制 */ 实例69:无软件消抖的独立式键盘输入实验 实例70:软件消抖的独立式键盘输入实验 实例71:CPU控制的独立式键盘扫描实验 实例72:定时器中断控制的独立式键盘扫描实验 实例73:独立式键盘控制的4级变速流水灯 实例74:独立式键盘的按键功能扩展:"以一当四" 实例75:独立式键盘调时的数码时钟实验 实例76:独立式键盘控制步进电机实验 实例77:矩阵式键盘按键值的数码管显示实验 //实例78:矩阵式键盘按键音 实例79:简易电子琴 实例80:矩阵式键盘实现的电子密码锁 液晶显示LCD*液晶显示LCD *液晶显示LCD * *液晶显示LCD*液晶显示LCD *液晶显示LCD */ 实例81:用LCD显示字符'A' 实例82:用LCD循环右移显示"Welcome to China" 实例83:用LCD显示适时检测结果 实例84:液晶时钟设计 *一些芯片的使用*24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控/ 实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 实例87:对I2C总线上挂接多个AT24C02的读写操作 实例88:基于AT24C02的多机通信 读取程序 实例89:基于AT24C02的多机通信 写入程序 实例90:DS18B20温度检测及其液晶显示 实例91:将数据"0xaa"写入X5045再读出送P1口显示 实例92:将流水灯控制码写入X5045并读出送P1口显示 实例93:对SPI总线上挂接多个X5045的读写操作 实例94:基于ADC0832的数字电压表 实例95:用DAC0832产生锯齿波电压 实例96:用P1口显示红外遥控器的按键值 实例97:用红外遥控器控制继电器 实例98:基于DS1302的日历时钟 实例99:单片机数据发送程序 实例100:电机转速表设计 模拟霍尔脉冲
<<单片机原理及应用课程设计报告>> 题 目:键盘按键识别及LED数码显示 学 院: 工程学院 专 业: 自动化 班 级: 1101班 姓 名: 指导教师: 2013年12月19日 目 录 1课程设计的任务与要求....................................1 2课程设计总体分析介绍....................................1 3各部分工作电路的详细介绍................................3 参考书目................................................11 附录....................................................12 第1节 课程设计的任务与要求 1.1 课程设计题目与要求 1.课程设计题目:键盘按键识别及LED数码显示 2.课程设计要求:(1)画出组成部分电路图 (2)画出程序流程图,设计程序并通过检查 (3)用语言表达工作原理,连接方式及用途等 1.2 课程设计目的及内容 1.目的: 按键是单片机常用的输入设备,操作人员可以通过按键输入指令和数据。在使用按键是 单片机要正确识别按键是否被按下和按下的次数等状态,才能正确执行相关操作。本实 验要实现对按键状态的正确检测并显示相关内容。 2.内容:(1)根据独立式键盘的特点,进行键盘控制系统的整体研究与设计。 (2)LED实时显示按键信息(显示按键号)。 (3)通过编写程序实现按键信息的提取和显示。 课程设计系统总体分析介绍 2.1 显示部分 本设计显示部分是利用动态显示实现的,LED数码管采用共阳极接。LED数码管动态 显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个 显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极三极管增 加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,单片机对 位选通COM端电路的控制,所以数码管的选通控制打开,该位就显示出字形,没有选通的 数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显 示,这就是动态驱动。 在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光 二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快, 给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一 样的,能够节省大量的I/O端口,而且功耗更低。 2.2 键盘模块设计 本设计键盘部分我是利用4按键的独立式键盘与8155芯片PC口直接相连实现的,即键盘由 8155的PC口扩展出来的。设计电路时,将4个按键与和8155PC口连接,按下按键通过815 5芯片传送给CPU,CPU存运算处理键盘信息由8位LED显示屏显示出来。键盘是计算机系统 中最常用的输入设备对于一些需要人为干预的单片机应用系统,键盘成为人机交互联系 的必要手段。 1.按键的分类 按键按照结构原理可分为两类:一类是触点式开关按键,如机械开关、导电橡胶开关等 ;另一类是无触点式开关按键、磁感应按键等。但单片机应用系统中大多采用机械式。 2.键输入原理 对于一个键盘或一组按键,单片机系统中总有一个接口电路与CPU相连。CPU可以采用查 询或中断方式了解有无按键输入并检查是哪一个键按下,将该键号送入累加器ACC,然后 通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。 3.键抖动和消抖方 机械式按键在按下或释放时,由于弹性作用也影响,通常伴随较短时间的触点机械抖动 ,抖动的时间一般是5- 10ms,这种现象称为键抖动。在理想和实际状态下按键产生的电压波形如下所示。 理想按键电压波形 实际按键电压波形 键抖动使按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的, 所以要采用一些方来消除抖动。一是硬件方:可采用在键输出端加R- S触发器(双稳态触发器)或单稳态触发器构成去抖动电路;二是软件方:在按键的按 下和释放时采用软件延时的方来消除。 4.键码识别 常用两种方:一是用专用硬件电路来识别,把这种键盘成为编码键盘;另一种方是 利用软件方来识别,把这种键盘成为非编码键盘。键码的识别可采用随机扫描、定时 扫描,或中断扫描方式来完成。 2.3电路设计总框图 根据上述工作原理,我画出该系统的总框图,设计总框图如下: 电路设计总框图 各部分电路详细的介绍 3.1单片机显示电路 1. 工作原理:显示部分的设计我是利用LED数码管动态显示实现的,LED数码管采用共阳极接 。LED数码管与8155芯片PA口、PB口直接连接。将键盘输入信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值