📄 key.c
字号:
//键盘引脚与参数定义
//sbit KEY_1 = P1^7;
//sbit KEY_2 = P1^6;
//sbit KEY_3 = P1^5;
//sbit KEY_4 = P1^4;
//改动后的
#define KEYALL 0Xf0 // // 1111 0000
#define KEY_P P1
#define KEY_NO1 0X70 //扫描第1行结果 // 0111 0000
#define KEY_NO2 0Xb0 // 扫描第2行结果// 1011 0000
#define KEY_NO3 0Xd0 //扫描第3行结果 // 1101 0000
#define KEY_NO4 0Xe0 //扫描第4行结果 // 1110 0000
#define KEY_SNO1 0X7f //扫描行为第1行 // 0111 1111
#define KEY_SNO2 0Xbf //扫描行为第2行 // 1011 1111
#define KEY_SNO3 0Xdf //扫描行为第3行 // 1101 1111
#define KEY_SNO4 0Xef //扫描行为第4行 // 1110 1111
uchar code key_keyno[]={0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e}; //Mode1、2、3、4、5、Monitor、Play、Record,第九键未用
/*========================================================
名称:Scan_Key(void)
功能: 扫描小键盘和穿梭键
入口参数: 无
出口参数: 键值
==========================================================*/
/*
#define KEYALL 0Xf0 // // 1111 0000 //四跟线连在高4位
#define KEY_P P1
#define KEY_NO1 0X70 //扫描第1行结果 // 0111 0000
#define KEY_NO2 0Xb0 // 扫描第2行结果// 1011 0000
#define KEY_NO3 0Xd0 //扫描第3行结果 // 1101 0000
#define KEY_NO4 0Xe0 //扫描第4行结果 // 1110 0000
#define KEY_SNO1 0X7f //扫描行为第1行 // 0111 1111
#define KEY_SNO2 0Xbf //扫描行为第2行 // 1011 1111
#define KEY_SNO3 0Xdf //扫描行为第3行 // 1101 1111
#define KEY_SNO4 0Xef //扫描行为第4行 // 1110 1111
*/
//sbit KEY_1 = P1^7;
//sbit KEY_2 = P1^6;
//sbit KEY_3 = P1^5;
//sbit KEY_4 = P1^4;
uchar Scan_Key(void)
{
uchar xdata key,temp=0x00,key_counter=0x00,scankey=0x00,returned_no=0x00;
if(Sys_scom_work_enable==1)
{
while(1)
{
WDT_CONTR = 0x37; //喂狗,最长9秒
key=0x00;
edit_n=0x00;
//=========扫描键盘第1行================
KEY_P |=KEYALL;
KEY_P &=KEY_SNO1;
if( ( KEY_P & KEY_NO1 ) != KEY_NO1 )
{
Sys_delayms(10);
KEY_P |=KEYALL;
KEY_P &=KEY_SNO1;
if( ( KEY_P & KEY_NO1 ) != KEY_NO1 )
{
key_counter++;
temp = KEY_P;
temp &= KEY_NO1;
switch(temp)
{
case 0x30://0001 1000//0000 1100
{
key = key_keyno[0];
}break;
case 0x50://0001 0100 //0000 1010
{
key = key_keyno[1];
}break;
case 0x60://0000 1100 //0000 0110
{
key = key_keyno[2];
}break;
}
scankey=key;
}
}
//=========扫描键盘第2行================
KEY_P |=KEYALL;
KEY_P &=KEY_SNO2;
if( ( KEY_P & KEY_NO2 ) != KEY_NO2 )
{
Sys_delayms(10);
KEY_P |=KEYALL;
KEY_P &=KEY_SNO2;
if( ( KEY_P & KEY_NO2 ) != KEY_NO2 )
{
key_counter++;
temp = KEY_P;
temp &= KEY_NO2;
switch(temp)
{
case 0x30://0001 1000 //0000 1100
{
key = key_keyno[3];
}break;
case 0x90://0001 0010 //0000 1001
{
key = key_keyno[4];
}break;
case 0xa0://0000 1010 //0000 0101
{
key = key_keyno[5];
}break;
}
scankey=key;
}
}
//=========扫描键盘第3行================
KEY_P |=KEYALL;
KEY_P &=KEY_SNO3;
if( ( KEY_P & KEY_NO3 ) != KEY_NO3 )
{
Sys_delayms(10);
KEY_P |=KEYALL;
KEY_P &=KEY_SNO3;
if( ( KEY_P & KEY_NO3 ) != KEY_NO3 )
{
key_counter++;
temp = KEY_P;
temp &= KEY_NO3;
switch(temp)
{
case 0x50://0001 0100 //0000 1010
{
key = key_keyno[6];
}break;
case 0x90://0001 0010 //0000 1001
{
key = key_keyno[7];
}break;
case 0xc0://0000 0110 //0000 0011
{
key = key_keyno[8]; //第九键,暂时未用,保留
}break;
}
scankey=key;
}
}
if(scankey==0x00)//扫描穿梭键部分
{
edit();
if(edit_n!=0x00)
{
scankey=edit_n;
key_counter++;
}
}
if(Sys_is_auto_playing==1)
{
if(Sys_scom_work_enable==0 || Sys_scom_play_enable==0)
{
Sys_is_auto_playing=0;
Custom_doing_now_byte1=0x05;
}
}
if(scankey==0x0b)
{
returned_no=Sys_auto_play_enable_fun(0x0b);//返回OKOK表示已经被Scan_key_not_in_menu(void)函数处理过了
if(returned_no==OKOK )
{
scankey=0x00;
key_counter=0x00;
}
}else
{
returned_no=Sys_auto_play_enable_fun(scankey);
if(returned_no==OKOK )
{
scankey=0x00;
key_counter=0x00;
}
}
if(key_counter>=1)//已经有按键被按下//消除重键
{
if(key==0x00)//按键已经松开
break;
}
}
}
return(scankey);//返回键值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -