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

📄 key_disp.c

📁 键盘复用与显示公用一个I/OK口
💻 C
字号:
#include <REGX51.H>
char TAB[18]={0xc0};
char	disp[4]={0x7f,0x7f,0x7f,0x7f};
char dig=0;
void delay(void);
void	scanner(void);
#define		rowkey()(~P1)&0x0f;	  //读入P1低四位(列按键值)宏
/*******************************************/
main()
{
	while(1)
			scanner();
}
/*********************************************/

 void  delay(void)
 {
 	int i;
	for(i=0;i<4800;i++);
   }
/***********************************************/
void scanner(void)
{
 char	col,row;//col行,row列)
 char	scan,key,kcode;//扫描信号,扫描值,扫描码
 scan=0xef;				                   //=1110  1111
 for(col=0;col<4;col++)					   //扫描第COL行
 {
   P2=0xff;
   P1=scan;									//P1高4位输出扫描信号,低4位设为输入
   P2=disp[col];							//输出第COL行数字
   keyin=rowkey();							//读入P1低四位(第COL行的列按键值)
   if(keyin!=0)								//若有按键时
   {
      for(row=0;row<4;row++)			   //扫描第ROW列是否按下
	    {
		  if(keyin==(0x01<<row))		  //只有第ROW列按下
		  {
		  	kcode=row+4*col;			 //计算出按键码为
			disp[dig]=TAB[kcode];		 //扫描码写入7段LED数码管数组
			dig=(dig<3)?dig+1:0;		//末满时显左1位,满时至最右显示
			break;					   //离开第ROW列扫描(FOR循环)
		  }
		  if(row==4)				  //输入错误时
		  {
		    disp[dig]=TAB[16];		//负号(-)写入
			dig=(dig<3)?dig+1:0;	//未满显示左1位,滿时显示最右位
			}					    //if语句(输入错误)结束
		 }					   //for循环,扫描row列结束
		while(rowkey()!=0);	  //等按键放开
		delay();
		}						 //if 语句(有按键时)结束
	   scan=(scan<<1)|0x01;		//产生左移1位扫描信号
	   }						//for循环,扫描col行结束
	}

⌨️ 快捷键说明

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