蓝桥杯单片机必备知识—–(5)独立按键

蓝桥杯单片机必备知识—–(5)独立按键

蓝桥杯单片机必备知识—–(5)独立按键

独立按键

在这里插入图片描述
注:在使用独立按键部分时,需将跳线帽放置BIT端

代码逻辑:

1.放在while(1)一直扫描按键是否按下
2.放在中断中 中断一次扫描按键是否按下
注:大型项目会放在中断中进行,一直扫描会占用过多资源,如果参加比赛则可以在while中一直使用循环

按键扫描函数

void read_key()
{
   
	uchar temp;  
	static unsigned state = 0;		//状态
	temp = P3 & 0x0f; 	//临时存储P3的状态
	switch(state)
	{
   
		case 0:{
   if(P3 != 0x0f) state = 1;}break;	//状态0,检测到有按键按下
		case 1:										//再次检测是否有按键按下,消抖
		{
   
			if(P3 != 0x0f){
   
			switch(temp)
			{
   
				case 0x0e:{
   s7++;state = 2;}break;	//如果S7按键对应的状态改变,则s7++
				case 0x0d:{
   s6++;state = 2;}break;	//如果S6按键对应的状态改变,则s7++
				case 0x0b:{
   s5++;state = 2;}break;	//如果S5按键对应的状态改变,则s7++
				case 0x07:{
   s4++;state = 2;}break;	//如果S4按键对应的状态改变,则s7++
			}
			}
			else state = 0;
		}break;
		case 2:{
   if(P3 == 0xff) state = 0;}break;	//检测按键是否抬起
	}
}

中断函数

void time0() interrupt 1
{
   
	static unsigned char intr = 0;
	display();
	if(++intr == 8) 	//按键消抖时间为5~10ms 
	{
   
		intr = 0;
		read_key();		//进行键扫描
	}
}

主函数内容不再赘述,如有不明白请看1,2中的内容

测试结果:

在这里插入图片描述

代码粘贴

#include <stc15f2k60s2.h>

#define uint unsigned int
#define uchar unsigned char

uchar tab[] = {
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dspbuf[8] = {
   10,10,10,10,10,10,10,10};
uchar s4 =0 ,s5 = 0,s6 = 0,s7 = 0;

void read_key();
void display();
void load();
void cls()
{
   
	//关闭LED
	P2 = (P2 & 0x1f) | 0x80;
	P0 = 0xff;
	P2 = 0x1f;
	//关闭BUZZ
	P2 = (P2 & 0x1f) | 0xa0;
	P0 = 0x00;
	P2 = 0x1f;
}

void main()
{
   
	cls();
	AUXR = 0x80;
	TMOD = 0x80;
	TL0 = 0xcd;
	TH0 = 0xd4;
	
	TR0 = 1;
	ET0 = 1;
	EA = 1;
	while(1)
	{
   }
}

void time0() interrupt 1
{
   
	static unsigned char intr = 0;
	display();
	if(++intr == 8) 	
	{
   
		intr = 0;
		read_key();
	}
}

void read_key()
{
   
	uchar temp;
	static unsigned state = 0;
	temp = P3 & 0x0f;
	switch(state)
	{
   
		case 0:{
   if(P3 != 0x0f) state = 1;}break;
		case 1:
		{
   
			if(P3 != 0x0f){
   
			switch(temp)
			{
   
				case 0x0e:{
   s7++;state = 2;}break;
				case 0x0d:{
   s6++;state = 2;}break;
				case 0x0b:{
   s5++;state = 2;}break;
				case 0x07:{
   s4++;state = 2;}break;
			}
			}
			else state = 0;
		}break;
		case 2:{
   if(P3 == 0xff) state = 0;}break;
	}
}

void load()
{
   
	
	dspbuf[0] = s4;
	dspbuf[1] = s5;
	dspbuf[2] = s6;
	dspbuf[3] = s7;
	dspbuf[4] = 10;
	dspbuf[5] = 10;
	dspbuf[6] = 10;
	dspbuf[7] = 10;
}

void display()
{
   
	static unsigned char dspcom = 0;
	load();
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = 0xff;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xc0;
	P0 = 1 << dspcom;
	P2 = 0x1f;
	
	P2 = (P2 & 0x1f) | 0xe0;
	P0 = tab[dspbuf[dspcom]];
	P2 = 0x1f;
	
	if(++dspcom == 8) dspcom = 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100136.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Oracle列转行函数LISTAGG() WITHIN GROUP ()的使用方法

    Oracle列转行函数LISTAGG() WITHIN GROUP ()的使用方法前言:最近在写一些比较复杂的SQL,是一些统计分析类的,动不动就三四百行,也是首次写那么长的SQL,有用到一些奇形怪状的SQL函数,在这里结合网上的例子做一些笔记,以后用到不记得用法可以翻出来看!1.基础用法:LISTAGG(XXX,XXX)WITHINGROUP(ORDERBYXXX),就像聚合函数一样,通过Groupby语句,把每个Group的一个字段,拼接起来…

    2022年10月24日
  • SSRF漏洞原理解析[通俗易懂]

    SSRF漏洞原理解析[通俗易懂]文章目录0x01基础知识1、SSRF漏洞简介:2、主要攻击方式:3、漏洞形成原理:4、漏洞的危害:0x02漏洞检测1、漏洞验证:2、漏洞的可能出现点:0x03绕过方法:1、绕过限制为某种域名:2、绕过限制请求IP不为内网地址:3、限制请求只为http协议:0x04漏洞利用1、产生漏洞的函数:2、漏洞靶场:0x05如何防御SSRF0x01基础知识1、SSRF漏洞简介:SSRF全称:Server-SideRequestForgery,即服务器端请求伪造,是一个由攻击者构造请求在目标服务

  • window到linux文件名乱码和文件内容乱码解决总结「建议收藏」

    window到linux文件名乱码和文件内容乱码解决总结「建议收藏」    window系统一般文件名编码为gbk,文件内容编码这个需要通过编辑器查看或者设置,找个editplus文本编辑器就可以处理文本内容编码。    那么在window上显示正常的文件到linux上的时候,常常会因为中文问题导致乱码,比如文件名乱码和文件内容乱码。查看linux设置的编码:[root~]# echo$LANGzh_CN.UTF-8[root…

  • 优化算法——梯度下降法

    优化算法——梯度下降法最近一直在看机器学习的材料,归纳起来就是把一个学习的问题转化为优化的问题,机器学习算法的本质就是如何对问题抽象建模,使一个学习的问题变为一个优化的问题。优化的算法有很多种,从最基本的梯度下降法到现在的一些启发式算法,如遗传算法(GA),差分演化算法(DE),粒子群算法(PSO)和人工蜂群算法(ABC)。梯度下降法又被称为最速下降法(Steepestdescendmethod),其理论基

    2022年10月27日
  • java实现字符串反转(javastring替换字符串)

    目录字符串反转:1,charAt()2,toCharArray()3,reverse()字符串替换:1.replace()2.replaceAll()3.replaceFirst()字符串反转:1,charAt()通过String类的charAt()的方法来获取字符串中的每一个字符,然后将其拼接为一个新的字符串publicstatic…

  • Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别[通俗易懂]

    Raid0、 Raid1、 Raid5、 Raid10的原理、特点、性能区别[通俗易懂]一、RAID是什么?RAID(RedundantArrayofIndependentDisks)即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。二、RAID有哪些?RAID方案常见的可以分为:RAID0 RAID1 RAID5 RAID6 RAID10下面来分别介绍一下。Raid0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余。Raid1:只能用两块硬

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号