lqb.key按键全套

#include "stc15.h"
#define FOSC 11059200L
//#define T1MS (65536-FOSC/1000)      //1T模式
#define T1MS (65536-FOSC/12/1000) //12T模式

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

#define LY  1  //Y4C
#define CY  2  //Y6C
#define AY  3  //Y7C
#define UY  4  //Y5C

#define ledon  1
#define ledoff 0
//************接口,按键,LED定义
sbit beep=P0^6;
sbit jdq=P0^4;
//************全局变量  
u8 u8led=0x00;  

u8 code t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
//u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
u8 code T_COM[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};      //位码

u8  LED8[8];        //显示缓冲
u8  display_index;  //显示位索引
bit B_1ms;          //1ms标志

//************函数声明
void hc573(u8 x);
u8 bit1(u8 x,u8 i);
u8 bit0(u8 x,u8 i);
u8 bitT(u8 x,u8 i);
u8 bitR(u8 x,u8 i);

void LEDdisp(void);
void LEDsta(u8 pos, u8 sta);

void delay1ms(int nms);		//@11.0592MHz

long s4time=0;
u8 s4timeflag=0;
u8 s4key=0;//=0没按下,=1,有按下
u8 s4timeflag2=0;//短按计时
u16 s4time2=0;//短按时间
u8 s4cnt=0;//按下按键的次数,=0,没有按下,=1,按下一次,=2,按下2次双击。
//************************main
void main()
{
	//局部变量
	long a=0;
	//初始化环境
	hc573(UY);
	beep=0;
	hc573(0);
	
	hc573(0);
	u8led=0x00;
	P0=~u8led;
	hc573(LY);
	hc573(0);
	
    AUXR &= 0xdf;                   //定时器1为12T模式
    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL1 = T1MS;                     //初始化计时值
    TH1 = T1MS >> 8;
    TR1 = 1;                        //定时器1开始计时
    ET1 = 1;                        //使能定时器1中断
    EA = 1;
	
	while(1)
	{
    if(P30==0) //如果按下按键
		{
			delay1ms(10);//延时去抖动
			if(P30==0) //去抖动还是按下
			{
				s4key=1;//按下的标记
				s4timeflag=1;//有按下,定时中断,开始累加时间,长按计时
				
				if(s4cnt==0)  //之前没有按下
				{
					s4cnt=1; //按下次数变为1,单击
					s4time2=0;  //时间清0,等定时器从0累加时间
					s4timeflag2=1;//双击计算时间,中断开始加时间
				}
				else if(s4cnt==1) //如果之前按下了一次,250ms内再次按下看做是双击
				{
					if(s4time2<250)
					{
						s4cnt=2;  //单击变双击			
					}
			  }
				
				
				//***********************************判断是不是长按*************
				while(P30==0) //如果是等于0,不松手
				{
					//判断不松手的时间够不够长按的时间
					if(s4time>1000)//按下1秒钟算长按
					{
						s4cnt=0;  //将单击、双击次数清0
						s4time2=0;//将单击、双击时间清0
						s4timeflag2=0;//将单击、双击累加标记清0
						
						s4key = 2;//=2长按,=1单击或者双击
						delay1ms(200);//防止数据加太快,延时200ms
						a=a+1;//自加1
						if(a>9999999)a=0;
						//刷新数据
						LED8[7]=10;//长按显示A
						LED8[6]=a/1000000;//显示最高位
						LED8[5]=(a % 1000000) / 100000;//显示次高位
						LED8[4]=(a % 100000) / 10000;//显示次次高位
						LED8[3]=(a % 10000) / 1000;//显示
						LED8[2]=(a % 1000) / 100;//显示
						LED8[1]=(a % 100) / 10;//显示
						LED8[0]=(a % 10) / 1;//显示最低位
						//定时中断中输出数据
					}
				}
         //****************长按之后松手
					s4timeflag=0;//长按累加时间标记清0
				  s4time=0;//长按时间清0
			}
			
		}
		//***************如果有按键按下,并且不是长按***************************
				if(s4key==1)//长按=2,=1短按或者双击
				 {
					 if(s4cnt==2) //如果是双击
					 {					 
						s4key=0;//取消按键状态	
						s4cnt=0;//按键次数清0
		 
						a=a+10; //双击+100
					 	LED8[7]=12;//长按显示B
						LED8[6]=a/1000000;//长按显示A
						LED8[5]=(a % 1000000) / 100000;//长按显示A
						LED8[4]=(a % 100000) / 10000;//长按显示A
						LED8[3]=(a % 10000) / 1000;//长按显示A
						LED8[2]=(a % 1000) / 100;//长按显示A
						LED8[1]=(a % 100) / 10;//长按显示A
						LED8[0]=(a % 10) / 1;//长按显示A
					 }
					 第一次按下,并且按下松开之后超过200ms,没有按键按下,代表是单击
					 else if(s4cnt==1 && s4time2>200)  
					 {
						 
						s4key=0;//取消按键状态
						s4cnt=0;//按键次数清0
						s4time2=0;//按键按下的时间请0
						s4timeflag2=0;//按键按下的时间标记清0
						 
					  a=a+1;
					 	LED8[7]=11;//长按显示B
						LED8[6]=a/1000000;//长按显示A
						LED8[5]=(a % 1000000) / 100000;//长按显示A
						LED8[4]=(a % 100000) / 10000;//长按显示A
						LED8[3]=(a % 10000) / 1000;//长按显示A
						LED8[2]=(a % 1000) / 100;//长按显示A
						LED8[1]=(a % 100) / 10;//长按显示A
						LED8[0]=(a % 10) / 1;//长按显示A
					 }

				 }
		

		else   if(P31==0)
		{
			delay1ms(10);
			if(P31==0)
			{
				u8led=bitT(u8led,1);
				LEDdisp();
				
								LED8[0]=2;

				while(P31==0);
			}
		}
		
			else   if(P32==0)
		{
			delay1ms(10);
			if(P32==0)
			{
				u8led=bitT(u8led,2);
				LEDdisp();
				
								LED8[0]=3;

				while(P32==0);
			}
		}
		
			else   if(P33==0)
		{
			delay1ms(10);
			if(P33==0)
			{
				u8led=bitT(u8led,3);
				LEDdisp();
				
								LED8[0]=4;

				while(P33==0);
			}
		}
		
		
		

		
	}
}
//************************main


//*********具体函数定义
void hc573(u8 x)
{
	if(x==0)P2=P2&0x1F;//0001 1111
	else 	if(x==LY)P2= P2&0x1F | 0x80  ;//Y4C
	else 	if(x==CY)P2= P2&0x1F | 0xC0  ;//Y6C  1100
	else 	if(x==AY)P2= P2&0x1F | 0xe0  ;//Y7C   1110 0000
	else 	if(x==UY)P2= P2&0x1F | 0xa0  ;//Y5C    1010 0000
}
u8 bit1(u8 x,u8 i)  //置1,或1 0 
{
	u8 a;
	a=(0x01<<i)|x;
	return a;
}
u8 bit0(u8 x,u8 i)  //清0,与1 与0
{
	u8 a;
	a=(~(0x01<<i))&x;
	return a;
}
u8 bitT(u8 x,u8 i)  //取反 异或1
{
	u8 a;
	a=x^(1<<i);
	return a;
}
u8 bitR(u8 x,u8 i)  //读取
{
	u8 a;
	a=(x>>i) &0x01;
	return a;
}
void LEDsta(u8 pos, u8 sta)
{
	if(sta==ledon)
	{
		u8led = bit1(u8led,pos);
	}
	else 	if(sta==ledoff)
	{
		u8led = bit0(u8led,pos);
	}
}
void LEDdisp(void)
{
	hc573(0);
	P0=~u8led;
	hc573(LY);
	hc573(LY);
	hc573(0);
}
void delay1ms(int nms)		//@11.0592MHz
{
	unsigned char i, j;
  for(;nms>0;nms--)
	{
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);
	}
}
/********************** 显示扫描函数 ************************/
void DisplayScan(void)
{   

	 //输出位码
	hc573(0);
	P0=T_COM[display_index];
	hc573(CY);
	hc573(CY);
	hc573(0);

	 //输出段码
	hc573(0);
	P0=~t_display[LED8[display_index]];
	hc573(AY);
	hc573(AY);
	hc573(0);

  if(++display_index >= 8)    display_index = 0;  //8位结束回0
}


/********************** Timer0 1ms中断函数 ************************/
void tm1_isr() interrupt 3
{
	//********************//长按时间标记***************************
	//********************//长按时间标记***************************

	 if(s4timeflag==1)  //长按时间标记
	 {
		s4time++;//按下按键,时间累加
		if(s4time==100000)s4time=1000;//如果时间太长,就超时,重新赋予长按时间1000ms,防止溢出
	 }
	 	//********************//长按时间标记***************************

	 //*********************短按、双击时间标记**********************
	 //*********************短按、双击时间标记**********************
		if(s4timeflag2==1)  //短按和双击时间标记
		{
			 s4time2++;  //按下按键,时间累加
			 if(s4time2>1000) //如果时间太长,就超时,清0,不允许再累加时间
			 {
				 s4timeflag2=0;
				 s4time2=0;//短按时间
			 }

		 }
		//*********************短按、双击时间标记**********************

		 
		 
		//**********************扫描数码管******************************
		 
		 //扫描数码管
   	DisplayScan();  //1ms扫描显示一位
    B_1ms = 1;      //1ms标志
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker实践:部署Docker管理工具DockerUI

Docker实践&#xff1a;部署Docker管理工具DockerUI 前言一、DockerUI介绍1.1 DockerUI概述1.2 镜像说明 二、检查本地Docker环境三、拉取DockerUI镜像四、创建DockerUI容器五、访问DockerUI六、DockerUI的基本使用6.1 查询宿主机容器情况6.2 查询Docker镜像列表6.3 查看容器配…

【excel】VBA股票数据获取(搜狐股票)

文章目录 一、序二、excel 自动刷新股票数据三、付费获取 一、序 我其实不会 excel 的函数和 visual basic。因为都可以用matlab和python完成。 今天用了下VBA&#xff0c;还挺不错的。分享下。 上传写了个matlab获取股票数据的&#xff0c;是雅虎财经的。这次是搜狐股票的数…

解锁企业数据管理统一身份认证难题,EasyMR助力企业敏捷提效

在数字经济迅猛发展的当下&#xff0c;企业数据量正以令人惊叹的速度持续增长。据IDC研究显示&#xff0c;至2025年&#xff0c;全球数据总量预计将超175 ZB。数据的爆发式增长对企业而言&#xff0c;既是机遇&#xff0c;更是巨大挑战。 如今&#xff0c;大数据已然成为企业决…

IntelliJ IDEA Type Hierarchy Scope Pattern 学习指南

IntelliJ IDEA Type Hierarchy Scope Pattern 学习指南 什么是 Type Hierarchy&#xff1f; Type Hierarchy 是 IntelliJ IDEA 提供的一个工具&#xff0c;允许开发者查看某个类的继承关系及其实现的接口结构。它是理解类关系的重要工具&#xff0c;尤其在处理复杂的继承体系…

ukui-quick 计数器

作品简介 使用ukui-quick框架进行开发&#xff0c;实现了在任务栏中计数器的插件&#xff0c;方便用户的日常使用。 技术架构 用于实现一个具有点击计数功能的QML应用程序。这个架构将包括C后端和QML前端&#xff0c;通过Qt的信号和属性绑定机制进行交互。 实现过程 开发环…

Flutter:封装ActionSheet 操作菜单

演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …

【混合开发】CefSharp+Vue 解决Cookie问题

问题表现 使用Element-admin架构搭建Vue前端项目&#xff0c;在与CefSharp搭配时&#xff0c;出现无法使用cookie的问题。 无法将token存入cookiecookie无法被读取 如下图&#xff0c;Cookies下显示file://。 正常的Cookies显示&#xff0c;Cookies显示为http://域名&#x…

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

C#轻松实现条形码二维码生成及识别

一、前言 大家好&#xff01;我是付工。 今天给大家分享一下&#xff0c;如何基于C#来生成并识别条形码或者二维码。 二、ZXing.Net 实现二维码生成的库有很多&#xff0c;我们这里采用的是http://ZXing.Net。 ZXing是一个开放源码的&#xff0c;用Java实现的多种格式的一…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些&#xff1f; 答案&#xff1a;Java中的基本数据类型包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔类型&#xff08;boo…

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

WPF、控件模板(ControlTemplate)和数据模板(DataTemplate)

前言 在 WPF 中&#xff0c;控件种类丰富且功能非常完善。一个显著的优点是 WPF 提供了强大的自定义能力和灵活的用户界面表现&#xff0c;能够满足各种复杂的应用需求。其中&#xff0c;ControlTemplate 和 DataTemplate 是两个非常重要的概念&#xff0c;分别用于自定义控件…

RAG实战_01代码生成_02智能检索

整理了RAG案例的Git代码 https://github.com/LGRY/RAG_Tutorial/tree/main 【注意事项】 01 代码生成系统源代码中使用的weaviate向量数据库&#xff0c;不支持window系统&#xff0c;建议换系统/换向量数据库02 智能检索系统 同样需要配置向量数据库&#xff0c;可以先安…

【Linux系统编程】—— 自动化构建工具Makefile指南

文章目录 背景基本使用推导过程适度扩展语法 背景 Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志。在一个工程中&#xff0c;源文件的数量可能极多&#xff0c;这些文件会按照类型、功能或模块分布在多个目录中。Makefile 通过定义一系列规则&#xff0c;指定…

【JavaWeb01】JavaWeb开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

Android-目前最稳定和高效的UI适配方案

谈到适配&#xff0c;首先需要介绍几个基本单位&#xff1a; 1、密度无关像素&#xff08;dp&#xff09;&#xff1a; 含义&#xff1a;density-independent pixel&#xff0c;叫dp或dip&#xff0c;与终端上的实际物理像素点无关 单位&#xff1a;dp&#xff0c;可以保证在…

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构&#xff1a; {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…

java8 springboot 集成javaFx 实现一个客户端程序

1. 先创建一个springboot 程序(此步骤不做流程展示) 2. 更改springboot的版本依赖和导入所需依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.7</versio…