蓝桥杯实验4--按键之独立键盘(proteus仿真)

开始试试按键的部分

首先说一下什么是按键

按键分为按结构可分为触点式和无触点式两类。开发板上用的是触点式的按键。按键在接口上分类可分为编码键盘和非编码键盘。按键通常使用机械式触点式按键开关,但是由于机械弹性作用的影响,通常触点伴随有一点时间的机械抖动,然后触点才稳定下来。抖动时间的长短与开关的机械特性有关,一般为3~10ms。除去抖动有软件与硬件两种方法。这篇文章是软件消抖,因为硬件不支持。

然后说一下什么是独立键盘

 独立式键盘是直接用I/O口线构成的单个按键电路,每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。蓝桥杯的开发板独立按键和矩阵键盘整合到一块儿了,所以注意上面图片的那个红框框,当j3跳线帽连接2、3时,为独立键盘模式。

最后就是查询键盘的信息了,有三种方式循环查询、定时查询,中断查询。因为这一章是独立按键,这几种区别不太大。但是我还是说一下他们

循环查询:顾名思义,在一个循环函数里要反复的查询键盘,这样的优点是简单,缺点是在扫描期间CPU是阻塞的。

定时查询:每隔多少时间查一次键值,然后做出动作,缺点就是用到定时器,编写比较复杂。

中断查询:这个就是利用中断,这个有很大的缺陷,中断是要停止正在执行的东西去执行中断服务的,如果正在执行重要任务然后触发了中断,将会引发严重的后果。

现在就开始写独立键盘的代码

完成的任务是有两个键,一个可以使数码管加一,一个可以使数码管减一

#include <STC89C5xRC.H>
typedef unsigned int u16;
typedef unsigned char u8;

u8 seg_ment[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80,
	0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; //定义段位
u8 led_buff[] = {0xff,0xff};

sbit KEY1 = P3^2;
sbit KEY2 = P3^3;

void close()
{
	P2 = (P2 & 0x1F) | 0XA0;
	P0 = 0XAF;
	P2 = P2 & 0X1F;
}

void delay_ms(u8 ms)
{
	u8 i, j;
	for(i = ms; i > 0; i --)
		for(j = 114; j > 0; j --);	
}

void led_scan()
{
	static u8 index = 0;
	P2 = (P2 & 0X1F) | 0XE0;
	P0 = 0xff;
	delay_ms(0);
	
	P2 = (P2 & 0X1F) | 0XC0;
	P0 = 0X80 >> index;
	P2 = 0X1F;
	
	P2 = (P2 & 0X1F) | 0XE0;
	P0 = led_buff[index];
	P2 = P2 & 0X1F;
	
	if(index < 1)
		index ++;
	else
		index = 0;
}

void show_number(u8 dat)
{
	char i;
	u8 buff[2];
	
	for(i = 0; i < 2; i ++)
	{
		buff[i] = dat % 10;
		dat = dat /10;
	}
	for(i = 1; i > 0; i --)
	{
		if(buff[i] == 0)
			led_buff[i] = 0xff;
		else
			break;
	}
	for( ; i >= 0; i --)
	{
		led_buff[i] = seg_ment[buff[i]];
	}
}

u8 key_scan()
{
	u8 return_var = 0; //定义一个返回值
	P3 = 0xff; //初始化端口
	if(!KEY1) //检测按键
	{
		delay_ms(15); //延时消抖
		if(!KEY1)
		{
			return_var = 1;
		}
		while(!KEY1);
	}
	if(!KEY2)
	{
		delay_ms(15);
		if(!KEY2)
		{
			return_var = 2;
		}
		while(!KEY2);
	}
	return return_var;
}
void main()
{
	u8 sum = 0, flag;
	close();
	while(1)
	{
		flag = key_scan();
		if(1 == flag)
		{
			sum = sum + 1;
			if(99 == sum)
			{
				sum = 0;
			}
		}
		if(2 == flag)
		{
			sum = sum - 1;
			if(0 == sum)
			{
				sum = 0;
			}
		}
		show_number(sum);
		led_scan();
	}
}
发布了25 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/little_engineer/article/details/86595287