基于普中单片机按键-数码管显示
简介
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/