一、第一个数码管显示0,第二个数码管显示1
#include<stc15.h>
void Delay_MS(unsigned int MS);
void main(void)
{
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);
}
}
void Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
二、多个数码管显示不同内容(创建数码管显示子函数)
#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned 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);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P2=0XC0;P0=0X01;P2=0XFF;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 Delay_MS(unsigned int MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
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);
}
改进1、创建多个子函数
#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
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);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P2=0XC0;P0=0X01;P2=0XFF;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 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);
}
改进2、使用宏定义,用字符代替数据类型的定义或者用类型定义,用字符代替数据类型的定义
#define uchar unsigned char
#define uint unsigned int
(typedef unsigned char uchar;
typedef unsigned int uint;后面要加分号)
#include<stc15.h>
#define uchar unsigned char
#define uint unsigned int
//typedef unsigned char uchar;
//typedef unsigned int uint;
unsigned char code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(uint MS);
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);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
P2=0XC0;P0=0X01;P2=0XFF;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 Delay_MS(uint MS)
{
unsigned i,j;
for(i=0;i<MS;i++)
for(j=853;j>0;j--);
}
void SEG_Display12(uchar yi,uchar 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(uchar san,uchar 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(uchar wu,uchar 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(uchar qi,uchar 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);
}
三、多位数码管倒计时,第6,7,8位数码管显示255——0倒计时,其他数码管保持熄灭
#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;
}
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);
}
四、在8位数码管中,前面4位显示年份2018,接着2位是分隔符“--”,最后两位是月份。
#include<stc15.h>
unsigned char yu=1;
unsigned char code SMG_duanma[18]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,
0X82,0XF8,0X80,0X90,0X88,0X80,
0XC6,0XC0,0X86,0X8E,0XBF,0X7F};
void DelaySMG(unsigned int t)
{
while(t--);
}
void SlecetHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0X1F)|0X80;
break;
case 5:
P2=(P2&0X1F)|0XA0;
break;
case 6:
P2=(P2&0X1F)|0XC0;
break;
case 7:
P2=(P2&0X1F)|0XE0;
break;
}
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
SlecetHC573(6);
P0=0X01<<pos;
SlecetHC573(7);
P0=value;
}
void Display_Dynamic()
{
DisplaySMG_Bit(SMG_duanma[2],0);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[1],2);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[8],3);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],4);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],5);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[yu/10],6);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[yu%10],7);
DelaySMG(500);
}
void Delay(unsigned char t)
{
while(t--)
{
Display_Dynamic();
}
}
void main()
{
while(1)
{
Display_Dynamic();
yu++;
if(yu>12)
{
yu=1;
}
Delay(200);
}
}