?? 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;
if(key_delay >0) //鍵盤去抖動延時變量
key_delay--;
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;
}
//*********************************************}
//*********************************************
//*********************************************
//*********************************************
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -