打印

diy(1)跑马灯

[复制链接]
1792|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
面对你|  楼主 | 2008-11-4 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做单片机系统的项目设计,自己的系统板还在厂家制作,要一段时间才能送来,借用同学的小开发板先写了一个简易数字钟程序!
基本情况如下:
硬件平台:单片机:华邦系列W78E516B40DL
            晶振:12MHZ
            8个二极管
                      四个数码管
                      四个按键
                      一个温度传感器
                      串口通信:MAX232
软件平台:Keil uVision2
开发语言:C语言
程序下载软件:8051IspWriter.exe
程序功能:8个LED灯循环闪烁,数码管显示相应闪烁的位置!0001-0008
源程序如下:
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar  *dis_ptr;
uchar data dis_buf[4]={0,0,0,1};//显示缓冲区
uchar data time_buf[2]={0x00,0x00};//显示数据
uchar code seg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
    0xf8,0x80,0x90,0xff};//7段共阳极,依次为0-9
uchar code digit_tab[4]={1,2,4,8};//动态显示缓冲区
uchar code light_buf[]={1,2,4,8,0x10,0x20,0x40,0x80};
uint m=0;
uint n=0;
void init_sys();
void disply_one(void);
void dis_buf_flash(void);
void main()
{init_sys();
for(;;);}

void init_sys(void)//T0工作于方式2,定时250um,
{
dis_ptr=dis_buf+3;
TH0=6;
TL0=6;
TMOD=2;
IE=0x82;
IP=2;
TR0=1;
}

void disply_one(void)//动态显示1位
{uchar i;
P0=seg_tab[*dis_ptr];
i=dis_ptr-dis_buf;
P2=~digit_tab;
if (dis_ptr>dis_buf)
    dis_ptr--;
else dis_ptr=dis_buf+3;
}


void dis_buf_flash(void)//显示数据送缓冲区
{
dis_buf[0]=time_buf[0]/10;
dis_buf[1]=time_buf[0]%10;
dis_buf[2]=time_buf[1]/10;
dis_buf[3]=time_buf[1]%10;
}


void time0(void) interrupt 1 
{   
            dis_buf_flash();
     disply_one(); 
                  TF0=0;
                   m++;
                  
                  if (m>=4000)//1秒处理
                  {    m=0;
                      time_buf[1]+=1;
                              if (time_buf[1]>=9)//循环显示
                                  {time_buf[1]=1;
                                   n=0;}
                    P1=~(light_buf[n]); 
                    n++;
                  }
 }
最终结果:8个LED灯从左至由循环闪烁!数码管循环显示0001-0008!
中途遇到的问题:
运行后,
显示这样:
灯的情况:
1-2-3-4-5-6-7-8-3-1-2-3-4-5-6-7-8-1-2-3-4-5-6-7-8-1-2。。。。。。
第一次循环之后不回到1而亮3,
但以后则是从1-8依次循环
解决办法:将程序段          if (m>=4000)//1秒处理
                                             {    m=0;
                                               time_buf[1]+=1;
                                                             P1=~(light_buf[n]); 
                                                             n++;
                                                                                if (time_buf[1]>=9)//循环处理
                                                                    {time_buf[1]=1;
                                                                                           n=0;
                                  }
修改为:
                          if (m>=4000)//1秒处理
                                           {    m=0;
                                                 time_buf[1]+=1;
                                                                       if (time_buf[1]>=9)//循环处理
                                                      {time_buf[1]=1;
                                                                          n=0;}
                                         P1=~(light_buf[n]); 
                                                         n++;
                                                   }
我认为出现的原因可能是:P1=~(light_buf[n]);n++;这两句应放在循环处理之后,否则程序运行可能导致循环处理不能及时反映给P1,从而出现一个bug.
将两句程序放在循环处理之后,则可消除这种bug.

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

0

粉丝