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    F0x3F,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    y0x00,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.0592MHzlong 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;  //将单击、双击次数清0s4time2=0;//将单击、双击时间清0s4timeflag2=0;//将单击、双击累加标记清0s4key = 2;//=2长按,=1单击或者双击delay1ms(200);//防止数据加太快,延时200msa=a+1;//自加1if(a>9999999)a=0;//刷新数据LED8[7]=10;//长按显示ALED8[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;//长按累加时间标记清0s4time=0;//长按时间清0}}//***************如果有按键按下,并且不是长按***************************if(s4key==1)//长按=2,=1短按或者双击{if(s4cnt==2) //如果是双击{					 s4key=0;//取消按键状态	s4cnt=0;//按键次数清0a=a+10; //双击+100LED8[7]=12;//长按显示BLED8[6]=a/1000000;//长按显示ALED8[5]=(a % 1000000) / 100000;//长按显示ALED8[4]=(a % 100000) / 10000;//长按显示ALED8[3]=(a % 10000) / 1000;//长按显示ALED8[2]=(a % 1000) / 100;//长按显示ALED8[1]=(a % 100) / 10;//长按显示ALED8[0]=(a % 10) / 1;//长按显示A}第一次按下,并且按下松开之后超过200ms,没有按键按下,代表是单击else if(s4cnt==1 && s4time2>200)  {s4key=0;//取消按键状态s4cnt=0;//按键次数清0s4time2=0;//按键按下的时间请0s4timeflag2=0;//按键按下的时间标记清0a=a+1;LED8[7]=11;//长按显示BLED8[6]=a/1000000;//长按显示ALED8[5]=(a % 1000000) / 100000;//长按显示ALED8[4]=(a % 100000) / 10000;//长按显示ALED8[3]=(a % 10000) / 1000;//长按显示ALED8[2]=(a % 1000) / 100;//长按显示ALED8[1]=(a % 100) / 10;//长按显示ALED8[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 1111else 	if(x==LY)P2= P2&0x1F | 0x80  ;//Y4Celse 	if(x==CY)P2= P2&0x1F | 0xC0  ;//Y6C  1100else 	if(x==AY)P2= P2&0x1F | 0xe0  ;//Y7C   1110 0000else 	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标志
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

概率函数,累计分布函数

四. 累计分布函数 1. 累计分布函数&#xff08;CDF, Cumulative Distribution Function&#xff09; 累计分布函数是用来描述随机变量取值小于或等于某个给定值的概率。它适用于离散型和连续型随机变量&#xff0c;并且能够通过概率质量函数&#xff08;PMF&#xff09;或概率…

Flutter项目适配鸿蒙

Flutter项目适配鸿蒙 前言Flutter项目适配鸿蒙新工程直接支持ohos构建新项目编译运行 适配已有的Flutter项目 前言 目前市面上使用Flutter技术站的app不在少数&#xff0c;对于Flutter的项目&#xff0c;可能更多的是想直接兼容Harmonyos&#xff0c;而不是直接在重新开发一个…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

【20250113】基于肌肉形变测量的连续步态相位估计算法,可自适应步行速度和地形坡度...

【基本信息】 论文标题&#xff1a;Continuous Gait Phase Estimation by Muscle Deformations with Speed and Ramp Adaptability 发表期刊&#xff1a;IEEE Sensors Journal 发表时间&#xff1a;2024年5月30日 【访问链接】 论文链接&#xff1a;https://ieeexplore.ieee.or…

【全套】基于分类算法的学业警示预测信息管理系统

【全套】基于分类算法的学业警示预测信息管理系统 【摘 要】 随着网络技术的发展基于分类算法的学业警示预测信息管理系统是一种新的管理方式&#xff0c;同时也是现代学业预测信息管理的基础&#xff0c;利用互联网的时代与实际情况相结合来改变过去传统的学业预测信息管理中…

小程序组件 —— 31 事件系统 - 事件绑定和事件对象

小程序中绑定事件和网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代替&#xff0c;绑定事件的方式有两种&…

邮箱发送验证码(nodemailer)

邮箱发送验证码 打开SMTP 服务使用 Node.js 邮件发送模块&#xff08;nodemailer&#xff09;封装验证码组件 开发中经常会遇到需要验证码&#xff0c;不过手机验证码需要money&#xff0c;不到必要就不必花费&#xff0c;所以可以使用邮箱发送验证码 打开SMTP 服务 根据自己想…

AV1视频编解码简介、码流结构(OBU)

我的音视频/流媒体开源项目(github) 目录 一、AV1编码技术 二、AV1码流结构(OBU) 三、IVF文件格式 四、ffmpeg支持AV1 五、关于常见格式对AV1的封装 一、AV1编码技术 AV1是由开放媒体联盟(AOM&#xff0c;Alliance for Open Media)在2018年发布的&#xff0c;AV1的前身…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中&#xff0c;如果需要对器件进行翻转、平移等操作&#xff0c;可以通过transform指…

kafka消费堆积问题探索

背景 我们的商城项目用PHP写的&#xff0c;原本写日志方案用的是PHP的方案&#xff0c;但是&#xff0c;这个方案导致资源消耗一直降不下来&#xff0c;使用了20个CPU。后面考虑使用通过kafka的方案写日志&#xff0c;商城中把产生的日志丢到kafka中&#xff0c;在以go写的项目…

【opencv】第7章 图像变换

7.1 基 于OpenCV 的 边 缘 检 测 本节中&#xff0c;我们将一起学习OpenCV 中边缘检测的各种算子和滤波器——Canny 算子、Sobel 算 子 、Laplacian 算子以及Scharr 滤波器。 7.1.1 边缘检测的一般步骤 在具体介绍之前&#xff0c;先来一起看看边缘检测的一般步骤。 1.【第…

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…

[Linux]从零开始的STM32MP157交叉编译环境配置

一、前言 最近该忙的事情也是都忙完了&#xff0c;也是可以开始好好的学习一下Linux了。之前九月份的时候就想入手一块Linux的开发板用来学习Linux底层开发。之前在NXP和STM32MP系列之间犹豫&#xff0c;思来想去还是入手了一块STM32MP157。当然不是单纯因为MP157的性能在NXP之…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

添加计算机到AD域中

添加计算机到AD域中 一、确定计算机的DNS指向域中的DNS二、打开系统设置三、加域成功后 一、确定计算机的DNS指向域中的DNS 二、打开系统设置 输入域管理员的账密 三、加域成功后 这里有显示&#xff0c;就成功了。

从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录 一、应用层与TCP之间的联系 二、 当通信双方中的一方如客户端主动断开连接时&#xff0c;仅是在客户端的视角下连接已经断开&#xff0c;在服务端的眼中&#xff0c;连接依然存在&#xff0c;为什么&#xff1f;——触发EPOLLRDHUP事件&#xff1a;对端关闭连接或停止写…

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析

全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业&#xff0c;技术革新迅猛&#xff0c;市场竞争激烈。《全星研发管理 APQP 软件系统》的应用&#xff0c;为企业带来了革命性的变化&#xff0c;诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…

22、PyTorch nn.Conv2d卷积网络使用教程

文章目录 1. 卷积2. python 代码3. notes 1. 卷积 输入A张量为&#xff1a; A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] \begin{equation} A\begin{bmatrix} 0&1&2&3\\\\ 4&5&6&7\\\\ 8&9&10&11\\\\ 12&13&14&15 \end{b…