当前位置: 首页 > article >正文

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标志
}


http://www.kler.cn/a/505922.html

相关文章:

  • 【Linux】进程间通信IPC
  • EPC建设模式
  • My ICLR Learning-Feedback
  • Java中对list数据进行手动分页(可直接复用版)
  • Flink链接Kafka
  • Pytorch基础教程:从零实现手写数字分类
  • 如果 iPhone 丢失或被盗,如何远程擦除 iPhone?
  • .NET 内存管理释放的两种方式
  • 力扣经典练习题之70.爬楼梯
  • 类型安全与代码复用的C# 泛型
  • Hypium UIViewer 让 MacOS 与鸿蒙NEXT手机实现多屏协同
  • 硬件设计-齐纳管
  • ESXi 切换硬盘直通后无法恢复的解决办法
  • Git文件夹提交错了,怎么撤销?
  • R语言的数据库交互
  • 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测
  • Windows图形界面(GUI)-QT-C/C++ - QT信号与槽机制详解
  • Flutter中Get.snackbar和Get.dialog关闭冲突问题记录
  • C51交通控制系统的设计与实现
  • 算法3(力扣83)-删除链表中的重复元素
  • 金融数据下载
  • 启动项目报JVM初始化错误
  • United States of America三种表示
  • C++单例模式的设计
  • Tidb集群升级到8.5.0过程中服务器遇到的坑
  • rtthread学习笔记系列--32 ULOG