一、多位数码管倒计时+联合LED控制
第6,7,8位数码管显示255——0倒计时,其他数码管保持熄灭,倒计时至250时L1灯点亮
#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char Num=255;
unsigned int Num_Refresh=0;
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
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 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--;
SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
if(Num==250)
{
P2=0X80;//打开控制LED灯的锁存器
P0=0XFE;//操作LED
}
}
SEG_Display12(SEG1,SEG2);
SEG_Display34(SEG3,SEG4);
SEG_Display56(SEG5,SEG6);
SEG_Display78(SEG7,SEG8);
}
}
void Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
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;
}
二、独立按键控制数码管显示(上电之后所有数码管显示字符“—”,按下按键S7,第一个数码管显示“1”,按下按键S6,第一个数码管显示“2”,按下按键S5,第一个数码管显示“3”,按下按键S4,第一个数码管显示“4”)
#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char S7_Flag=0;S6_Flag=0;S5_Flag=0;S4_Flag=0;
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 Key_Scan(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)
{
Key_Scan();
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 Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
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 Key_Scan(void)
{
if(P30==0)
{
Delay_MS(10);
if(P30==0)S7_Flag=1;
while(!P30);
}
if(P31==0)
{
Delay_MS(10);
if(P31==0)S6_Flag=1;
while(!P31);
}
if(P32==0)
{
Delay_MS(10);
if(P32==0)S5_Flag=1;
while(!P32);
}
if(P33==0)
{
Delay_MS(10);
if(P33==0)S4_Flag=1;
while(!P33);
}
}
三、独立按键控制数码管显示+倒计时+LED控制(上电之后所有数码管显示字符“—”,按下按键S7,第一个数码管显示“1”,按下按键S6,第一个数码管显示“2”,按下按键S5,控制点亮L1灯,且第6,7,8位数码管显示255——0倒计时,其他数码管保持熄灭,倒计时至250时L8灯点亮)
#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char Num=255;
unsigned int Num_Refresh=0;
unsigned char SEG_Run=0;
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char S7_Flag=0;S6_Flag=0;S5_Flag=0;S4_Flag=0;
void Key_Scan(void);
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 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)
{
Key_Scan();
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--;
SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
if(Num==250)
{
P2=0X80;//打开控制LED灯的锁存器
P0=0X7F;//操作LED
}
}
}
SEG_Display12(SEG1,SEG2);
SEG_Display34(SEG3,SEG4);
SEG_Display56(SEG5,SEG6);
SEG_Display78(SEG7,SEG8);
}
}
void Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
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 Key_Scan(void)
{
if(P30==0)
{
Delay_MS(10);
if(P30==0)S7_Flag=1;
while(!P30);
}
if(P31==0)
{
Delay_MS(10);
if(P31==0)S6_Flag=1;
while(!P31);
}
if(P32==0)
{
Delay_MS(10);
if(P32==0)S5_Flag=1;
while(!P32);
}
if(P33==0)
{
Delay_MS(10);
if(P33==0)S4_Flag=1;
while(!P33);
}
}