51单片机实现0~F数码管滚动显示

void delay(uchar x) //延时函数
{
uchar i,j;
for(i = 0; i<x; i--)
for(j = 0; j<255; j--)
;
}

void xianshi() //显示函数
{
uchar i;

for(i = 0; i<6; i++)
{
P0=wen[i]; //位选
wei=1; //开锁存
wei=0; //关锁存

P0=huancun[i]; //段选
duan=1;
duan=0;

P0=0xff; //消影
delay(5);
}
}

void init()
{
uchar i;

TMOD=0x01;
TH0=(65536-50000)/256; //10ms定时初值(T0计时用)
TL0=(65536-50000)%256;
TR0=1; //T0计时关断
ET0=1; //T0中断允许位关断
EA=1; //开总中断

for(i = 0; i<6; i++)
{
huancun[i] = shu[i]; //段选送缓存
}
}

void main()
{
init();
while(1)
{
xianshi();
}
}

void time_intt0 (void) interrupt 1 //50ms中断
{
uchar t,i,j;

TH0=(65536-50000)/256; //重置初值
TL0=(65536-50000)%256;

t++;

if(t == 20) //1秒到 50ms*20 = 1s
{
t=0;
j++; //j+1

for(i = 0; i<6; i++) //使段选数据移位输入缓存
{
huancun[i] = shu[i+j];
}

if(j>9) //移到最后面 回到初始状态
{
j = 0;
}
}
}
code uchar shu[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
code uchar wen[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar huancun[] = {0x00,0x00,0x00,0x00,0x00,0x00};
sbit duan = P2^6;
sbit wei = P2^7;
前面部分

你的程序,在下一句一句来鉴定并修复

void delay(uchar x)   //延时函数,大约延时 x ms
{
    uchar i,j;
    for(i = 0; i<x; i++)
        for(j = 0; j<120; j++);
}
 
void xianshi()    //显示函数
{
    uchar i;
 
    for(i = 0; i<6; i++)
    {
        wei=1;      //开锁存
        P0=wen[i];  //位选
        wei=0;      //关锁存
         
        duan=1;     //开锁存
        P0=huancun[i];  //段选
        duan=0;     //关锁存
        
        delay(2);   //延时点亮约 2 ms
        P0=0xff;    //消影
    }
}
 
void init()
{
    uchar i;
 
    TMOD=0x01;                     
    TH0=(65536-50000)/256;          //50ms定时初值(T0计时用)
    TL0=(65536-50000)%256;
    ET0=1;                          //开T0中断允许
    EA=1;                           //开总中断
    TR0=1;                          //开T0计时器
    
    for(i = 0; i<6; i++)
    {
       huancun[i] = shu[i];      //段选送缓存
    }
}
 
void main()
{
    init();
    while(1)
    {
        xianshi();
    }
}
 
void time_intt0 (void) interrupt 1      //50ms中断     
{
    uchar t,i,j;
 
    TH0=(65536-50000)/256;              //重置初值
    TL0=(65536-50000)%256;
 
    t++;
 
    if(t == 20)                           //1秒到 50ms*20 = 1s
    {
        t=0;
        j++;                            //j+1
 
        for(i = 0; i<6; i++)         //使段选数据移位输入缓存
        {
           huancun[i] = shu[i+j];
        }  
 
        if(j>9)   //或者if(j==10),移到最后面,回到初始状态
        {
           j = 0;
        }
    }
}

请鉴定,有问题再将

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-16
程序不全,难以修改。追问

程序前面部分已经上传了,这个程序能改的和视频里的一样吗?

追答

code uchar shu[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71, 0};
code uchar wen[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar huancun[] = {
16,16,16,16,16,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,16,16,16,16,16};
uchar k = 0, t = 0;
void delay(uchar x)
{
uchar i, j;
for(i = 0; i = 5) {
t = 0;
k++;
if(k > 21) k = 0;
}
}
字数超了,就删除了注释。
仿真运行,和视频里面的,一样。

本回答被提问者采纳
相似回答