基于STC15F2K60S2单片机的数码管显示程序。主要功能包括:
- 定义了一些宏和全局变量,包括数码管显示需要的码表、数码管的各个位的值、刷新计数器、按键扫描标志等。
- 初始化函数
All_Init()
用来初始化IO口,包括控制蜂鸣器、LED灯、数码管位选和段选的锁存器。 - 数码管显示函数分为四个部分,分别用来显示数码管的1-2位、3-4位、5-6位、7-8位。
- 按键扫描函数
Key_Scan()
用来检测外部按键输入,并根据按键情况设置标志位。 - 主程序中通过循环不断扫描按键状态,根据按键状态改变显示值或控制特定功能,比如按下按键S7会显示从1到8,按下按键S6会显示从9到2,按下按键S5会控制数码管显示器输出高电平,按下按键S4会控制数码管显示器的运行。
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量定义区域
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
uchar Num=255;
uchar Num_Refresh=0;
uchar S7_Flag=0,S6_Flag=0,S5_Flag=0,S4_Flag=0;
uchar SEG_Run=0;
//函数定义区域
//毫秒级延迟函数
void Delay(unsigned int ms);
//初始化程序
void All_Init(void);
//数码管显示函数
void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(uchar wu,uchar liu);
void SEG_Display78(uchar qi,uchar ba);
//按键扫描函数
void Key_Scan(void);
//主程序
void main()
{
All_Init();
SEG1=10;SEG2=10;SEG3=10;SEG4=10;
SEG5=10;SEG6=10;SEG7=10;SEG8=10;
while(1)
{
Key_Scan();
if(S7_Flag==1){S7_Flag=0;SEG1=1;SEG2=2;SEG3=3;SEG4=4;SEG5=5;SEG6=6;SEG7=7;SEG8=8;}
if(S6_Flag==1){S6_Flag=0;SEG1=9;SEG2=8;SEG3=7;SEG4=6;SEG5=5;SEG6=4;SEG7=3;SEG8=2;}
if(S5_Flag==1)
{
S5_Flag=0;
P2=0X80;
P0=0X00;
}
if(S4_Flag==1)
{
S4_Flag=0;
if(SEG_Run==0)SEG_Run=1;
else if(SEG_Run==1)SEG_Run=0;
}
if(SEG_Run == 1)
{
if(++Num_Refresh==125)
{
Num_Refresh = 1;
Num=Num-1;
SEG1=11;SEG2=11;SEG3=11;SEG4=11;SEG5=11;
SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
if(Num==250)
{
P2=0X80;P0=0X7F;
}
}
}
SEG_Display12(SEG1,SEG2);
SEG_Display34(SEG3,SEG4);
SEG_Display56(SEG5,SEG6);
SEG_Display78(SEG7,SEG8);
}
}
//毫秒级延迟函数
void Delay(unsigned int ms) //@11.0592MHz
{
unsigned char i, j;
while(ms--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
//初始化
void All_Init(void)
{
P2=0XA0;//1010 00000 打开控制蜂鸣器继电器的74HC573锁存器
P0=0X00;//0000 0000 关闭蜂鸣器继电器
P2=0X80;//1000 0000 打开控制LED灯的74HC573的锁存器
P0=0XFF;//1111 1111 关闭所有LED
P2=0XC0;//1100 0000 打开控制数码管位选的锁存器
P0=0XFF;//1111 1111 选中所有数码管
P2=0XE0;//1110 0000 打开控制数码管段选的锁存器
P0=0XFF;//1111 1111关闭所有数码管
}
//数码管显示函数
void SEG_Display12(uchar yi,uchar er)
{
P0=0XFF;
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=tab[yi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
P0=0XFF;
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=tab[er]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
}
void SEG_Display34(unsigned char san,unsigned char si)
{
P0=0XFF;
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=tab[san]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
P0=0XFF;
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=tab[si]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
}
void SEG_Display56(unsigned char wu,unsigned char liu)
{
P0=0XFF;
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=tab[wu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
P0=0XFF;
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=tab[liu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
P0=0XFF;
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=tab[qi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
P0=0XFF;
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=tab[ba]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P0=0XFF;
}
//按键扫描函数
void Key_Scan(void)
{
if(P30 == 0)
{
Delay(30);
if(P30 == 0) S7_Flag=1;
while(!30);
}
else if(P31==0)
{
Delay(30);
if(P31 == 0) S6_Flag=1;
while(!30);
}
else if(P32==0)
{
Delay(30);
if(P32 == 0) S5_Flag=1;
while(!30);
}
else if(P33==0)
{
Delay(30);
if(P33 == 0) S4_Flag=1;
while(!30);
}
}