📄 disp_key._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 + -