目录
(1)例程1:两个数码管显示不同内容。本例以第一个数码管显示数字“0”,第二个数码管显示数字“1”为例。
(2)例程2:多个数码管显示不同内容(二)。注:创建数码管显示子函数。
(3)例程3:多个数码管显示不同内容(二)。注:创建数码管显示子函数。
(4)例程4:多位数码管倒计时。本例以第6、7、8位数码管显示255→0的倒计时为例,其他数码管保持熄灭。
(5)例程5:,多位数码管倒计时+联合LED控制。本例以第6、7、8位数码管显示255→0的倒计时(其他数码管保持熄灭),倒计时至250时L1点亮为例。
(1)例程1:两个数码管显示不同内容。本例以第一个数码管显示数字“0”,第二个数码管显示数字“1”为例。
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
unsigned int i = 0;
//函数声明区域
void Delay(int ms);
//程序主体
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//初始化程序
while(1)
{
P2=0XC0;P0=0X01;//打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=0XC0;//大家控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
P2=0XC0;P0=0X02;//打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=0XF9;//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay(1);
}
}
//函数定义区域
void Delay(int ms) //@11.0592MHz
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
(2)例程2:多个数码管显示不同内容(二)。注:创建数码管显示子函数。
#include <STC15F2K60S2.H>
#include<intrins.h>
void Delay_MS(unsigned int MS);
void main(void)
{
IO_Init();
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序,后期详解;
while(1)
{
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=0XC0; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=0XF9; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
}
void Delay_MS(unsigned int MS)
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
(3)例程3:多个数码管显示不同内容(二)。注:创建数码管显示子函数。
①法一:
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
unsigned int i = 0;
unsigned char DSEG[]= {0X00,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char code SEG[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//函数声明区域
void Delay(int ms);
void DSED_Display(unsigned char dseg,unsigned char seg);
//程序主体
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//初始化程序
while(1)
{
DSED_Display(1,1);
DSED_Display(2,2);
DSED_Display(3,3);
DSED_Display(4,4);
DSED_Display(5,5);
DSED_Display(6,6);
DSED_Display(7,7);
DSED_Display(8,8);
}
}
//函数定义区域
void Delay(int ms) //@11.0592MHz
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void DSED_Display(unsigned char dseg,unsigned char seg)
{
P0 = 0XFF;//消影
P2=0XC0;P0=DSEG[dseg];//打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=SEG[seg];
Delay(1);
}
②法二:
#include <STC15F2K60S2.H>
#include<intrins.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void Delay(int ms);
void SEG_Display(unsigned char yi,unsigned char er,unsigned char san,unsigned char si,unsigned char wu,unsigned char liu,unsigned char qi,unsigned char ba);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序,后期详解;
while(1)
{
SEG1=1,SEG2=2,SEG3=3,SEG4=4,SEG5=5,SEG6=6,SEG7=7,SEG8=8;
SEG_Display(SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8);
}
}
void SEG_Display(unsigned char yi,unsigned char er,unsigned char san,unsigned char si,unsigned char wu,unsigned char liu,unsigned char qi,unsigned char ba)
{
P0=0XFF;
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=tab[yi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=tab[er]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=tab[san]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=tab[si]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=tab[wu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=tab[liu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=tab[qi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=tab[ba]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void Delay(int ms) //@11.0592MHz
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
③法三
#include <STC15F2K60S2.H>
#include<intrins.h>
//#define uchar unsigned char
//#define uint unsigned int
typedef unsigned char uchar ;
typedef unsigned int uint ;
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void Delay(int ms);
void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序,后期详解;
while(1)
{
SEG1=1,SEG2=2,SEG3=3,SEG4=4,SEG5=5,SEG6=6,SEG7=7,SEG8=8;
SEG_Display12(SEG1,SEG2);
SEG_Display34(SEG3,SEG4);
SEG_Display56(SEG5,SEG6);
SEG_Display78(SEG7,SEG8);
}
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
P0=0XFF;
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=tab[yi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=tab[er]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void SEG_Display34(unsigned char san,unsigned char si)
{
P0=0XFF;
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=tab[san]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=tab[si]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void SEG_Display56(unsigned char wu,unsigned char liu)
{
P0=0XFF;
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=tab[wu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=tab[liu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
P0=0XFF;
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=tab[qi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=tab[ba]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void Delay(int ms) //@11.0592MHz
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
(4)例程4:多位数码管倒计时。本例以第6、7、8位数码管显示255→0的倒计时为例,其他数码管保持熄灭。
#include <STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char Num = 255 ;
unsigned char Num_Refresh = 0 ;
void Delay(uint MS);
void SEG_Display12(uchar yi,uchar er);
void SEG_Display34(uchar san,uchar si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序,后期详解;
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //打开第一个数码管,后期详解;
SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11;
SEG6=2,SEG7=5,SEG8=5;
while(1)
{
if(++Num_Refresh==125)
{
Num_Refresh = 0 ;
Num = Num -1; //Num--;
SEG6=Num/100,SEG7=Num%100/10,SEG8=Num%10;
}
SEG_Display12(SEG1,SEG2);
SEG_Display34(SEG3,SEG4);
SEG_Display56(SEG5,SEG6);
SEG_Display78(SEG7,SEG8);
}
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
P0=0XFF;
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=tab[yi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=tab[er]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void SEG_Display34(unsigned char san,unsigned char si)
{
P0=0XFF;
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=tab[san]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=tab[si]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void SEG_Display56(unsigned char wu,unsigned char liu)
{
P0=0XFF;
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=tab[wu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=tab[liu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
P0=0XFF;
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=tab[qi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=tab[ba]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
}
void Delay(uint MS) //@11.0592MHz
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
(5)例程5:,多位数码管倒计时+联合LED控制。本例以第6、7、8位数码管显示255→0的倒计时(其他数码管保持熄灭),倒计时至250时L1点亮为例。
//头文件声明区域
#include <STC15F2K60S2.H>
#include<intrins.h>
//变量声明区域
unsigned int i = 0;
unsigned char DSEG[]= {0X00,0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
unsigned char code SEG[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char Num = 255;
unsigned char Num_Refresh = 0;
//函数声明区域
void Delay(int ms);
void DSED_Display(unsigned char dseg,unsigned char seg);
//程序主体
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;//初始化程序
while(1)
{
DSED_Display(1,10);
DSED_Display(2,10);
DSED_Display(3,10);
DSED_Display(4,10);
DSED_Display(5,10);
DSED_Display(6,Num/100);
DSED_Display(7,Num%100/10);
DSED_Display(8,Num%10);
if(++Num_Refresh == 125)
{
Num_Refresh = 0;
Num--;
}
if(Num == 250)
{
P2 = 0X90;P0 = 0XFE;
}
}
}
//函数定义区域
void Delay(int ms) //@11.0592MHz
{
unsigned char i, j;
for(i = 0;i < ms;i++)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
void DSED_Display(unsigned char dseg,unsigned char seg)
{
P2=0XC0;P0=DSEG[dseg];
P2=0XFF;P0=SEG[seg];
Delay(1);
P0 = 0XFF;
}
(6)例程6:独立按键控制数码管显示。本例以上电之后所有数码管显示字符“-”,按下S7按键,第一个数码管显示数字“1”,按下S6按键,第二个数码管显示数字“2”,按下S5按键,第三个数码管显示数字“3”,按下S4按键,第四个数码管显示数字4为例。
#include <STC15F2K60S2.H>
#include<intrins.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char Num = 255 ;
unsigned char Num_Refresh = 0 ;
unsigned char S7_Flag = 0, S6_Flag = 0, S5_Flag = 0, S4_Flag = 0 ;
void Delay_MS(unsigned int MS);
void SEG_Display12(unsigned char,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void KeyScan(void);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序,后期详解;
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //打开第一个数码管,后期详解;
SEG1=10,SEG2=10,SEG3=10,SEG4=10,SEG5=10;
SEG6=10,SEG7=10,SEG8=10;
while(1)
{
KeyScan();
if(S7_Flag == 1){ S7_Flag = 0 ; SEG1 = 1 ; }
if(S6_Flag == 1){ S6_Flag = 0 ; SEG2 = 2 ; }
if(S5_Flag == 1){ S5_Flag = 0 ; SEG3 = 3 ; }
if(S4_Flag == 1){ S4_Flag = 0 ; SEG4 = 4 ; }
SEG_Display12(SEG1,SEG2);
SEG_Display34(SEG3,SEG4);
SEG_Display56(SEG5,SEG6);
SEG_Display78(SEG7,SEG8);
}
}
void KeyScan(void)
{
if(P30==0)
{
Delay_MS(10);
if(P30==0)S7_Flag = 1 ;
while(!P30);
}
else if(P31==0)
{
Delay_MS(10);
if(P31==0)S6_Flag = 1 ;
while(!P31);
}
else if(P32==0)
{
Delay_MS(10);
if(P32==0)S5_Flag = 1 ;
while(!P32);
}
else if(P33==0)
{
Delay_MS(10);
if(P33==0)S4_Flag = 1 ;
while(!P33);
}
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=tab[yi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=tab[er]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void SEG_Display34(unsigned char san,unsigned char si)
{
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=tab[san]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=tab[si]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void SEG_Display56(unsigned char wu,unsigned char liu)
{
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=tab[wu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=tab[liu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=tab[qi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=tab[ba]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0 = 0XFF;
}
void Delay_MS(unsigned int MS)
{
unsigned char i, j;
while(MS--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
(7)例程7:独立按键控制数码管显示+数码管倒计时+LED控制。本例以上电之后所有数码管显示字符“-”,按下S7按键,第一个数码管显示数字“1”;按下S6按键,第二个数码管显示数字“2”,按下S5按键,控制点亮L1灯,且第6、7、8位数码管显示255->0的倒计时(其他所有数码管熄灭),倒计时至250时,L8灯点亮为例。
#include <STC15F2K60S2.H>
#include<intrins.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
//unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char Num = 255 ;
unsigned char Num_Refresh = 0 ;
unsigned char S7_Flag = 0, S6_Flag = 0, S5_Flag = 0, S4_Flag = 0 ;
unsigned char SEG_Run = 0 ;
void Delay_MS(unsigned int MS);
void SEG_Display12(unsigned char yi, unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu, unsigned char liu);
void SEG_Display78(unsigned char qi, unsigned char ba);
void KeyScan(void);
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序,后期详解;
SEG1=10,SEG2=10,SEG3=10,SEG4=10,SEG5=10;
SEG6=10,SEG7=10,SEG8=10;
while(1)
{
KeyScan();
if(S7_Flag == 1){ S7_Flag = 0 ; SEG1 = 1 ; }
if(S6_Flag == 1){ S6_Flag = 0 ; SEG2 = 2 ; }
if(S5_Flag == 1)
{
S5_Flag = 0 ;
SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11;
SEG6=Num/100,SEG7=Num%100/10,SEG8=Num%10;
P2=0X80;P0=0XFE;
SEG_Run = 1 ;
}
if(SEG_Run == 1)
{
if(++Num_Refresh==125)
{
Num_Refresh = 0 ;
Num = Num -1; //Num--;
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 KeyScan(void)
{
if(P30==0)
{
Delay_MS(10);
if(P30==0)S7_Flag = 1 ;
while(!P30);
}
else if(P31==0)
{
Delay_MS(10);
if(P31==0)S6_Flag = 1 ;
while(!P31);
}
else if(P32==0)
{
Delay_MS(10);
if(P32==0)S5_Flag = 1 ;
while(!P32);
}
else if(P33==0)
{
Delay_MS(10);
if(P33==0)S4_Flag = 1 ;
while(!P33);
}
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
P2=0XC0;P0=0X01; //打开控制数码管位选的锁存器,然后选中第一个数码管
P2=0XFF;P0=tab[yi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X02; //打开控制数码管位选的锁存器,然后选中第二个数码管
P2=0XFF;P0=tab[er]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void SEG_Display34(unsigned char san,unsigned char si)
{
P2=0XC0;P0=0X04; //打开控制数码管位选的锁存器,然后选中第三个数码管
P2=0XFF;P0=tab[san]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X08; //打开控制数码管位选的锁存器,然后选中第四个数码管
P2=0XFF;P0=tab[si]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void SEG_Display56(unsigned char wu,unsigned char liu)
{
P2=0XC0;P0=0X10; //打开控制数码管位选的锁存器,然后选中第五个数码管
P2=0XFF;P0=tab[wu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X20; //打开控制数码管位选的锁存器,然后选中第六个数码管
P2=0XFF;P0=tab[liu]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void SEG_Display78(unsigned char qi,unsigned char ba)
{
P2=0XC0;P0=0X40; //打开控制数码管位选的锁存器,然后选中第七个数码管
P2=0XFF;P0=tab[qi]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
P2=0XC0;P0=0X80; //打开控制数码管位选的锁存器,然后选中第八个数码管
P2=0XFF;P0=tab[ba]; //打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
Delay_MS(1);
P0=0XFF;
}
void Delay_MS(unsigned int MS)
{
unsigned char i, j;
while(MS--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}