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

📄 key_driver_单键处理.c

📁 键盘扫描程序
💻 C
字号:
/*********************************************************
/ 线翻转法键盘扫描程序,只检测和处理单键,多键按下返回12
/高三位列 p456,低四位行p0123

/键盘排列如下: 

      2   1   0
   --------------
  3|  1   2   3 |
  2|  4   5   6 |
  1|  7   8   9 |
  0|  *   0   # |
   --------------

  输入:无
  输出:键值
  10:*   11:#  12:多个按键按下
*********************************************************/
#include <iom32v.h>
//#include <key_config.h>

#define uchar unsigned char 
#define uint unsigned int
#define key_port PORTD             //定义键盘接口
#define portDDR DDRD
#define port_PIN PIND
void delays(uint k);
uchar kbscan(void);
void main_init(void);
void dis_init(void);

#pragma data:code
const uchar table[3][4]={11,9,6,3,0,8,5,2,10,7,4,1}; //10:*   11:#
#pragma data:data

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

void main_init(void) /*单片机初始化 p456上拉输入高 0123输出低*/
{
 key_port=0xff;
 portDDR=0x0f;
 key_port=0xf0;//低四位输出0
}

void dis_init(void)/*翻转: p456输出低 0123上拉输入高*/
{
 key_port|=0x0f;
 portDDR=0xf0;
 key_port&=~0xf0;//p456输出0
}

/*************************************/
void delays(uint k)
{
uchar i;
uchar j;
for(j=k;j>0;j--)
	{
	for(i=255;i>0;i--);
	}
}

uchar kbscan(void)
{
 uchar row,col;  //行列数值
 /*给个初值*/
 col=8;
 row=8;
 main_init();        /*扫描初始化*/
 
 if((port_PIN&0xf0)!=0xf0)   //有键按下
 {
  delays(4);   //去抖动

  if((port_PIN&0xf0)!=0xf0)
  {
   col=(port_PIN&0xf0); //列值
  }
  
  dis_init();   //翻转
  
  if((port_PIN&0x0f)!=0x0f)
  {
   row=(port_PIN&0x0f);
  }
  
  /*判断列键值*/
  switch(col)
  {
   case 0xb0: col=2;
   			  break;
   case 0xd0: col=1;
   			  break;
   case 0xe0: col=0;
   			  break;
   default:	  col=9; //未知数值
  }
    /*判断行键值*/
  switch(row)
  {
   case 0x0e: row=0;
   			  break;
   case 0x0d: row=1;
   			  break;
   case 0x0b: row=2;
   			  break;
   case 0x07: row=3;
   			  break;
   default:	  row=9;  //未知数值
  }
 }
  if((col!=9)&(row!=9))
  return table[col][row];
  else return 12; //错误返回
}

/*
void main(void)
{
 uchar key;
 main_init();   //初始化
 while(1);
 {
 key=kbscan();              /键盘扫描,键值给key/
 							//使用方法:
							//Lcd_stringdisp 为lcd 显示程序。
key_tmp=kbscan();
		  switch (key_tmp)
		  {
		  case 0: {Lcd_stringdisp("0",2); break;}
		  case 1: {Lcd_stringdisp("1",2); break;}
		  case 2: {Lcd_stringdisp("2",2);break;}
		  case 3: {Lcd_stringdisp("3",2);break;}
		  case 4: {Lcd_stringdisp("4",2);break;}
		  case 5: {Lcd_stringdisp("5",2);break;}
		  case 6: {Lcd_stringdisp("6",2);break;}
		  case 7: {Lcd_stringdisp("7",2);break;}
		  case 8: {Lcd_stringdisp("8",2);break;}
		  case 9: {Lcd_stringdisp("9",2);break;}
		  case 10: {Lcd_stringdisp("*",2);break;}
		  case 11: {Lcd_stringdisp("#",2);break;}
		  case 12:{Lcd_stringdisp("错误返回!",10);break;}
		  default: {Lcd_stringdisp("NO",4);break;}
		  }
 delays();
 }
}*/

⌨️ 快捷键说明

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