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

📄 按键设置数码管.c

📁 单片机串行通信程序单片机串行通信程序单片机串行通信程序单片机串行通信程序
💻 C
字号:
//=======================================================================================
//  工程名称:	按键设置数码管
//  功能描述:	通过按键设置数码显示的值  
//  涉及的库:	reg51.h
//	硬件连接:见电路图
//	维护记录:	2008-12-14 v1.0	
//========================================================================================


//====================================================================================
//	文件名:	main.c
//  功能描述:	通过按键设置数码显示的值 
//	维护记录:	2008-12-14 v1.0			
//====================================================================================
#include "reg51.h"									

#define SEG_NUM	P2		      //段码接口
#define KEY_IO	P0			  //4*4矩阵键盘的接口
sbit SEL_GE =P1^0;		     //个位数码管位选
sbit SEL_SHI=P1^2;		     //十位数码管位选
sbit SEL_BAI=P1^4;			//百位数码管位选 

unsigned int N;											//片选数码管的位数个位为0,百位为2
unsigned int REG_NUM[3];								//显示缓存:存3个数码管对应段码,依次为个十百位
unsigned int CODE_NUM[10] = {							
        0xbb,			/*0*/
        0x88,			/*1*/
        0xd3,			/*2*/
        0xda,			/*3*/
        0xe8,			/*4*/
        0x7a,			/*5*/
        0x7b,			/*6*/
        0x98,			/*7*/
        0xfb,			/*8*/
        0xfa			/*9*/
};		
void delay(int i);							 //延时
int  MatrixKey() ;                            //按键扫描
void Scan_disp(void);						//显示扫描函数
void Convert(unsigned int NUM_SHOW);		//缓存区处理函数
int num=0;
unsigned char pf;

//=============================================================
// 语法格式:	int main();
// 实现功能:	主函数
// 参数:		无
// 返回值:		无
//=============================================================
int main(void)
{	
   unsigned char key=0;	
    TMOD=0x20;
    TH1=0xe6;
    TL1=0xe6;
    PCON=0x00;
    TR1=1;
    SCON=0x50;
	Convert(key);			
	while(1)
	{      
		key=MatrixKey();
		if(key!=0)
		{
 		  SBUF=key;
		  while(TI==0)
		  {
		  Convert(key);
		  Scan_disp();
	      delay(6);		  
		  }	
		  TI=0;
		}
		Scan_disp();
	    delay(6);		
	}
}

void delay(int i)
{
	int j;
	for(;i>0;i--)
	for(j=110;j>0;j--);
}

//=============================================================
// 语法格式:	void Scan_disp(void);
// 实现功能:	扫描显示器件
// 参数:		无
// 返回值:		无
//=============================================================
void Scan_disp(void)
{
	SEG_NUM = 0x0000;										//清段码输出
	SEL_GE	 = 0;
	SEL_SHI  = 0;
	SEL_BAI  = 0;
	switch(N)
	{
		case 0:	SEL_GE	 = 1;SEG_NUM = REG_NUM[0];	break;	//片选个位数码管并输出对应缓存
		case 1: SEL_SHI  = 1;SEG_NUM = REG_NUM[1];	break;	//片选十位数码管并输出对应缓存
		case 2: SEL_BAI  = 1;;SEG_NUM = REG_NUM[2];	break;	//片选百位数码管并输出对应缓存
		default:break;
	}
	N++;
	if(N >= 3) N = 0;										//使始终在0~4循环
}

//=============================================================
// 语法格式:	void Convert(unsigned int);
// 实现功能:	更新显示缓存,提取整数的个、十、百位并转换为数码管段码,更新到缓存REG_NUM[]
// 参数:		NUM_SHOW:需要提取并转换的整数
// 返回值:		无
//=============================================================
void Convert(unsigned int NUM_SHOW)
{									
	REG_NUM[0] = CODE_NUM[NUM_SHOW%10];				//提取个位
	REG_NUM[1] = CODE_NUM[NUM_SHOW/10%10];			//提取十位
	REG_NUM[2] = CODE_NUM[NUM_SHOW/100%10];			//提取百位	
}

int MatrixKey()
{
  unsigned int data_A=0,data_B=0,KEY_NUM;
  unsigned char data_key=0;
  KEY_IO=0x0f;
  KEY_NUM= KEY_IO;
  if(KEY_NUM!=0x0f)  //检查行是否有按键按下 
    {
     delay(2);		  //////////
     if(KEY_NUM!=0x0f)
       {
         data_A=KEY_NUM;				      
		 KEY_IO=0xf0;
		 KEY_NUM= KEY_IO; 
		 data_B=KEY_NUM;
		 if(data_A==0x0e&&data_B==0xe0){data_key= 1;} 
    		else if(data_A==0x0e&&data_B==0xd0){data_key= 2;}
    		else if(data_A==0x0e&&data_B==0xb0){data_key= 3;}
    		else if(data_A==0x0e&&data_B==0x70){data_key= 4;}
    		else if(data_A==0x0d&&data_B==0xe0){data_key= 5;}
    		else if(data_A==0x0d&&data_B==0xd0){data_key= 6;}
    		else if(data_A==0x0d&&data_B==0xb0){data_key= 7;}
    		else if(data_A==0x0d&&data_B==0x70){data_key= 8;}
    		else if(data_A==0x0b&&data_B==0xe0){data_key= 9;}
			else if(data_A==0x0b&&data_B==0xd0){data_key= 10;}
    		else if(data_A==0x0b&&data_B==0xb0){data_key= 11;}
    		else if(data_A==0x0b&&data_B==0x70){data_key= 12;}
    		else if(data_A==0x07&&data_B==0xe0){data_key= 13;}
    		else if(data_A==0x07&&data_B==0xd0){data_key= 14;}
    		else if(data_A==0x07&&data_B==0xb0){data_key= 15;}
    		else if(data_A==0x07&&data_B==0x70){data_key= 16;}
		   while(KEY_IO!=0xf0)
		   {
		     Scan_disp();
	    	 delay(6);
		   }
       }    
    }  
     return data_key;        
}

	

	
	
	
	
	
							  

⌨️ 快捷键说明

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