lqb.key按键全套

ops/2025/1/16 21:05:15/
#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.ppmy.cn/ops/150638.html

相关文章

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…

【认识油管头部频道】ep3 “PewDiePie”——游戏内容

PewDiePie&#xff08;本名 Felix Kjellberg&#xff09;是世界上最知名的 YouTuber 之一&#xff0c;以其独特的内容风格、个性魅力和对观众的深刻理解而闻名。他的成功是多方面因素共同作用的结果&#xff0c;以下是 PewDiePie 火爆的主要原因&#xff1a; 1. 游戏领域的早期…

MyBatis——XML映射文件

在MyBatis中&#xff0c;既可以通过注解的方式配置SQL语句&#xff0c;也可以通过XML映射文件的方式配置SQL语句。对于简单的SQL语句建议直接通过注解的方式配置SQL语句&#xff1a; Delete("delete from user where id#{id}") Integer deleteById(Integer id);但是…

40,【6】CTFHUB WEB SQL MYSQL数据库

进入靶场 12时回显异常&#xff0c;可知是整数型注入 order by判断字节数 使用order by 判断出字节数为3 使用union select 寻找回显点 database爆出了库名 表名有2个&#xff0c;news和qctclblljo,看不出来flag在哪个文件里&#xff0c;都看看 第2个更可疑一点&#xff0c;&a…

《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(28):DSA数字签名

《深入浅出HTTPS​​​​​​​​​​》读书笔记&#xff08;28&#xff09;&#xff1a;DSA数字签名 对称加密算法有很多算法&#xff0c;标准算法是RSA机密算法&#xff0c;数字签名技术也有一个标准DSS&#xff08;Digital Signature Standard&#xff09;&#xff0c;其标准…

npm更换淘宝镜像源

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com npm更换淘宝镜像源 npm config set registry https://registry.npmmirror.com 然后再执行以下操作查看是否成功 npm config get registry 如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -…

《零基础Go语言算法实战》【题目 4-7】实现链表的排序

《零基础Go语言算法实战》 【题目 4-7】实现链表的排序 请用 Go 语言实现合并 K 个排序的链表并将其作为一个排序链表返回。 【解答】 ① 思路。 借助分治算法的思想&#xff0c;递归对比两个链表中的每个元素的值的大小&#xff0c;然后将 K 个有序链 表两两合并即可。 …

【数字化】华为-用变革的方法确保规划落地

导读&#xff1a;华为在数字化转型过程中&#xff0c;深刻认识到变革的必要性&#xff0c;并采用了一系列有效的方法确保转型规划的有效落地。华为认为&#xff0c;数字化转型不仅仅是技术层面的革新&#xff0c;更是企业运作模式、流程、组织、文化等深层次的变革。数字化转型…