基于普中单片机按键-数码管显示

简介

1.硬件部分
普中单片机开发板 数码管 独立按键
2.软件部分
keil软件

硬件部分

普中单片机开发板 数码管 独立按键

(这些都是开发板的最基本的配置)

软件部分


#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
/*端口引脚定义*/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
/*变量定义*/
int number;
unsigned char KeyNum=0;   //被触发的按键编号
unsigned char KeyLock1=0;
unsigned char KeyLock2=0;
unsigned int cnt;

/*函数声明部分*/
void KEY_Scan();
void KEY_Action();
void Light_Scan();
void delay(u16 i);
void Display();
void Time0Iint();
/*数码管码表*/
unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管显示0~F的值
unsigned char LightBuf[]={0xFF,0xFF,0xFF,0xFF,0XFF};
/******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}
/******************************************************************************* * 函 数 名 : Display * 函数功能 : 数码管显示部分 *******************************************************************************/
void Display()
{
		LightBuf[0]=smgduan[number%10];
		LightBuf[1]=smgduan[number/10%10];
		LightBuf[2]=smgduan[number/100%10];
		LightBuf[3]=smgduan[number/1000%10];
	    LightBuf[4]=smgduan[number/10000%10];
	
}
/******************************************************************************* * 函 数 名 : Light_Scan() * 函数功能 : 数码管扫描函数,选择显示的位置 *******************************************************************************/
void Light_Scan()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0;P0=LightBuf[4];break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0;P0=LightBuf[3];break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0;P0=LightBuf[2];break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0;P0=LightBuf[1];break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1;P0=LightBuf[0];break;//显示第4位
			default: break;
		}
		delay(100); //间隔一段时间扫描 
		P0=0x00;//消隐
	}
}
/******************************************************************************* * 函 数 名 : KEY_Scan() * 函数功能 : 按键扫描函数 *******************************************************************************/
void KEY_Scan()
{
	static unsigned char cnt1 = 0xFF;
	static unsigned char cnt2 = 0xFF;
  cnt1 =(cnt1<<1)|KEY1;
	cnt2 =(cnt2<<1)|KEY2;
	if(cnt1 != 0x00)
	{
		  KeyLock1 = 0;
	}
	else if(KeyLock1==0)
	{
	  	KeyNum = 1;
		  KeyLock1 = 1;
	}
	if(cnt2 != 0x00)
	{
		 KeyLock2 = 0;
	}
	else if(KeyLock2==0)
	{
	  	 KeyNum = 2;
		  KeyLock2 = 1;
	}
}
/******************************************************************************* * 函 数 名 : KEY_Action() * 函数功能 : 按键执行操作部分 *******************************************************************************/
void KEY_Action()
{
	 switch(KeyNum)
	 {
	        case 1:number++; KeyNum = 0; break;
	        case 2:number--; KeyNum = 0; break;
	   	    default:break;          
	  }
}
/******************************************************************************* * 函 数 名 :Time0Iint * 函数功能 :定时器0配置,定时器初始化函数 *******************************************************************************/
void Time0Iint()
{
		EA=1;
		TH0 = (65536-2000)/256;//定时2ms
		TL0 = (65536-2000)%256;
		TMOD &= 0xFC;
		TMOD =  0x01;
		ET0 = 1;
		TR0 = 1;
}
/******************************************************************************* * 函 数 名 :void InterruptT0() interrupt 1 * 函数功能 : 定时器0中断执行部分 *******************************************************************************/
void InterruptT0() interrupt 1
{
		TH0 = (65536-2000)/256;//定时2ms
		TL0 = (65536-2000)%256;
		Light_Scan();
		KEY_Scan();
}
/******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/
void main()
{	 
	Time0Iint();
	while(1)
	{	
		Display();
		KEY_Action();
	}		
}

参考资料

1.海创电子学习https://space.bilibili.com/93630735/
2.普中单片机论坛http://prechin.net/