回复https://bbs.csdn.net/topics/394580568
#include "reg51.h"
#include<intrins.h>
//#include "math.h"
sbit duan = P2^6;//数码段
sbit wei = P2^7;//数码位
sbit NanBeiHong = P2^0;
sbit NanBeiHuan = P2^1;
bit k=0, d=0;//中断标记//红绿灯倒换标记
unsigned char code ShuMaGuan[/*数码段*/]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0X80};//0~9隐.小数点共阴,(FFFF)65535-或取反(~)即是共阳.
unsigned char code WeiXuanBiao[/*数码位*/] = { 0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f };
//unsigned char code ShaoMiaoZhi[/*扫描值*/]={238,237,235,231,222,221,219,215,190,189,187,183,126,125,123,119};
unsigned char HuaDeng[/*流水灯 ,先一个个亮,再两个的亮,再三个亮,最后8个一起亮。后从第八个开始灭,依次全灭。*/]
={255,254,253,251,247,239,223,191,127,252,249,243,231,207,159,63,248,241,227,199,143,31,240,225,195,135,15,224,193,131,7,192,129,3,128,1,0};
unsigned char YanS=0;//主循环延时专用
void ShuMaXianShi(unsigned char s,unsigned char w,unsigned char d)
{
P0=WeiXuanBiao[w];
wei=1;
wei=0;
P0=ShuMaGuan[s]|ShuMaGuan[d];//d显示小数点11,10关闭
duan=1;
while(++YanS);
if(!YanS);
{
P0=ShuMaGuan[10];
duan=0;
}
}
void ZhengShuXianShi(unsigned char wei,unsigned long i/*整数拆分到数码管显示*/)
{
do
{
ShuMaXianShi(i % 10,wei--,10);
//wei>0;
}while(i/=10);
}
char ZuiDaZhi(unsigned char i[],unsigned char x)
{
unsigned char Lin=0;
do
{
if(i[x]>Lin)Lin=i[x];
}
while(x--);
return Lin;
}
void LedXunHuan(unsigned char s)
{
unsigned char i = 0, t = 0, Cnt = 0;
while(1)
{
if(!i) P1 = 0xff;
else if(i==9)P1 = 254;
else if(i>8) P1 = _crol_(P1,1);
else P1<<=1;//逐个递亮,_crol_(P1,1);单个亮,点亮16个的把其中一个P1改为P2即可.
Cnt=1;
while(Cnt) if(!++t) --Cnt; else ZhengShuXianShi(8,s);
if(++i>16)i=0;//if(++i>8)i=0;if(i++>=8)i=0;if(++i>=9)i=0;等价3式
}
}
void main()
{
unsigned char aa[]={93,9,40,1,8},d = ZuiDaZhi(aa, sizeof(aa) / sizeof(aa[0])-1);
LedXunHuan(d);
}