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

📄 keyscan.c

📁 键盘扫描程序
💻 C
字号:
#include <reg52.h>			    	// 引用标准库的头文件
#include <intrins.h>

#define  uchar  unsigned  char 
#define  uint   unsigned  int 

sbit DIN = P2^0;					// 串行数据输入
sbit CLK = P2^1;					// 串行时钟
sbit LOAD = P2^2;					// 显示数据锁存控制



#define Digit0 0x01         		// 数码管1寄存器
#define Digit1 0x02         		// 数码管2寄存器
#define Digit2 0x03         		// 数码管3寄存器
#define Digit3 0x04         		// 数码管4寄存器
#define Digit4 0x05         		// 数码管5寄存器
#define Digit5 0x06         		// 数码管6寄存器
#define Digit6 0x07         		// 数码管7寄存器
#define Digit7 0x08         		// 数码管8寄存器


#define DecodeMode  0x09     		// 译码模式寄存器
#define Intensity   0x0a     		// 亮度寄存器
#define ScanLimit   0x0b      		// 扫描位数寄存器
#define ShutDown    0x0c       		// 低功耗模式寄存器
#define DisplayTest 0x0f    		// 显示测试寄存器


#define ShutdownMode    0x00      	// 低功耗方式
#define NormalOperation 0x01   		// 正常操作方式

#define ScanDigit       0x07        // 扫描位数设置,显示8位数码管
#define DecodeDigit     0xff       	// 译码设置,8位均为BCD码
#define IntensityGrade  0x0a    	// 亮度级别设置

#define TestMode        0x01        // 显示测试模式
#define TextEnd         0x00        // 显示测试结束,恢复正常工作模式



uchar  keycode;
uchar  numbit,digit[5];
void KeyDisplay(void);
void clear(void);

/* 延时t毫秒 */
void delay(uint t)
{
	uint i;
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}



/* 向MAX7219写入字节(8位)*/
void SendChar (uchar ch)
{
	uchar i,temp;
    _nop_();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	DIN=1;
           	CLK=0;
        	CLK=1;
        }
        else
        {
        	DIN=0;
        	CLK=0;
        	CLK=1;
        }
    }
}



/* 向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    LOAD=0;
    _nop_();
    SendChar(addr);
    _nop_();
    SendChar(num);
    _nop_();
    LOAD=1;				// 锁存进相应寄存器
}



/* MAX7219初始化 */
void InitDisplay (void)
{
    WriteWord (ScanLimit,  ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode, DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,  IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,   NormalOperation);    // 设置为正常工作模式
}



void  keyscan(void) //键盘扫描子程序
{
  uchar  scancode, rowcode;
  P3=0xf0; //向行扫描输出口发全0,查询列信号
  if((P3&0xf0)!=0xf0)//若有键按下
	 {
	  delay(50);	 //延时消抖
	    if((P3&0xf0)!=0xf0)
		   {
		      scancode=0xfe;
			  while((scancode&0x10)!=0)	 //逐行扫描
			       {
				      P3=scancode;        //输出行扫描码
					  if((P3&0xf0)!=0xf0) //若本行有键按下
					    {
						  rowcode=(P3&0xf0)|0x0f;
						  keycode=((~scancode)+(~rowcode));
                          KeyDisplay();
                         }

		              else
		                { scancode=(scancode<<1)|0x01;}
					}
			}
			 
  }
		  				  
}


uchar  getkey(uchar keycode)     //获取键值子程序
{  
   uchar  kb;
 switch(keycode)
   {
	case 0x11:kb=0x04;break;
    case 0x21:kb=0x03;break;
    case 0x41:kb=0x02;break;
    case 0x81:kb=0x01;break;
   
    case 0x12:kb=0x08;break;
    case 0x22:kb=0x07;break;
    case 0x42:kb=0x06;break;
    case 0x82:kb=0x05;break;
    
	case 0x14:kb=0x0b;break;
    case 0x24:kb=0x0a;break;
    case 0x44:kb=0x00;break;
    case 0x84:kb=0x09;break;
    
	case 0x18:kb=0x0f;break;
    case 0x28:kb=0x0e;break;
    case 0x48:kb=0x0d;break;
    case 0x88:kb=0x0c;break;

    default:  kb=0x00;break;
     }
	 return(kb);
}

void KeyDisplay(void)
{
 uchar  keydata;
 keydata=getkey(keycode);
 delay(250);
 switch(keydata)
     {
      case 1:
      case 2:  
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
      case 8:
      case 9:if(numbit<5)
       {
	   digit[4]=digit[3];
       digit[3]=digit[2];
       digit[2]=digit[1];
       digit[1]=digit[0];
       digit[0]=keydata;
       numbit++;
        }break;
     
	 case 10:clear(); break;
     default:break;
    }
  WriteWord (Digit7, digit[0]);
  WriteWord (Digit6, digit[1]);
  WriteWord (Digit5, digit[2]);
  WriteWord (Digit4, digit[3]);
  WriteWord (Digit3, digit[4]);
  }

void clear(void)
{
  uchar i;
  numbit=0;
  for(i=0;i<5;i++) digit[i]=0;
  for(i=0;i<8;i++) WriteWord (Digit0+i, 0);
}

  
	






/* 主函数 */
void main(void)
{	
   	InitDisplay ();							// MAX7219初始化 
	WriteWord(DisplayTest,TestMode);		// 开始显示测试,点亮所有LED
  	delay(1000);       						// 延时约3s
   	WriteWord (DisplayTest,TextEnd);		// 退出显示测试模式
	clear();
while(1)
 {
 keyscan( );
  }
   	
}




















⌨️ 快捷键说明

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