⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disp_key._h

📁 一个LED特效显示程序
💻 _H
字号:
/*********************************************
*显示键盘头文件
*支持SPI显示键盘模块


     SPI接口显示键盘:
         PB0:    键盘	  
         PB1:    RCK
		 PB2:    SCK
		 PB3:    DATA

*********************************************/


/***************************************************
            头文件申明
****************************************************/
//#include<iom16v.h>
//#include <macros.h>

//显示
const char DISCODE[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
	  	   		 	  0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x63};
char  Disp_Buff[]={0,0,0,0,0,0,0,0};					  
char  disp_key_count =0;                       //LED扫描计数
int   disp_code =0;
unsigned int   time_count_sys =0;              //系统时间计数,1ms为单位
//按键
char  key_num =0;
char  old_key_num =0;
char  new_key_num =0;
char  key_buff[] ={0,0,0,0,0,0,0,0};      
int   key_down_time =1;
char  key_delay =0;
//基本全局变量
unsigned int delay_time_count =0;
//*****************************************************************************
//按键显示
void Disp_key_group(void);
void disp_bit(char disCodeIndex,char bitChoose);
void send_data_disp(unsigned char send_data);
void Key_num(void);
void delay(unsigned int n);
//****************************************
/*  ms精确延时函数  */
void delay(unsigned int n)
{//延时
  delay_time_count =n;
  while(delay_time_count >0);
}
/*  显示函数  */
void disp_bit(char disCodeIndex,char bitChoose)     //按位显示
{
   PORTB &=0B11111101;                            //RCK送底电平
   send_data_disp(bitChoose);                       //送位选
   send_data_disp(DISCODE[disCodeIndex]);           //送段码
   PORTB |=0B00000010;                          //RCK送高电平
}
void send_data_disp(unsigned char send_data)        //向595送数据串
{  
   unsigned char count;
   for(count =0;count<8;count++)
   {
      if(((send_data<<count)&0x80 )==0)
	     PORTB &=0B11110111;     //送 data
      else
	     PORTB |=0B00001000;
	  PORTB |= 0B00000100;      //送SCK信号
      PORTB &= 0B11111011; 
   }
}
/*  主显示,键值获取  */
void Disp_key_group(void)    //使用时只需对Disp_Buff[] 刷新。
{     
     disp_key_count++;
	 if(disp_key_count>7)    //4个LED的板子(disp_key_count>3)
	    disp_key_count =0;
	 disp_bit(Disp_Buff[disp_key_count],1 <<disp_key_count);
     if((PINB & 1) ==0)
	    key_buff[disp_key_count] =1;
     else 
		key_buff[disp_key_count] =0;
}
void dec_hex_disp(void)
{/* 完整数以HEX显示  */
  unsigned char i;
  int temp;
  temp =disp_code;
  for(i =0;i <7;i++)
	 Disp_Buff[i] =((temp>>i*4) &0x0f);
}
/* 键值处理及去抖 */
void Key_num(void)
{
  char i;
  char j =0;
  for(i =0;i <=7;i++)
  {
    if(key_buff[i] ==1)
	{
	   new_key_num =(i);
	   j =1;//键盘缓冲区有键值标志
	}
  }
  if(j ==0 )
    new_key_num =0x0f;
  if((old_key_num ==0x0f) && (new_key_num !=0x0f) && (key_delay ==0))//判断按键正按下
    key_num =new_key_num;
  else if ((old_key_num !=0x0f) && (new_key_num ==old_key_num))//判断按键持续按下
  {
     key_num =0x0f;//持续按键时不再给出键值,只给出空键值。   
	 key_down_time++;//记录按键持续按下时间
  }
  else 
  {   
	 if((old_key_num !=0x0f) && (new_key_num ==0x0f))
     {  
        key_num =0x0f;
	    key_down_time =0;//按键时间变量清零
		key_delay=100;//去抖动延时100ms
     }
  }
  old_key_num =new_key_num;
  if(key_delay >0)        //键盘去抖动延时变量
      key_delay--;
}
//*********************************************}
//*********************************************

//*********************************************
//*********************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -