找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4461|回复: 7
打印 上一主题 下一主题
收起左侧

[求助]大家帮我看看一个小程序什么毛病,急!!!

[复制链接]
跳转到指定楼层
楼主
ID:32490 发表于 2012-6-16 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

本人菜鸟 只有C语言基础和单片机概念(开始就是只知道单片机包括那几大类东东,具体的不懂,就这种水平,现在对单片机有了基本的印象和了解)刚买板子几个月 边看书边做,花了好久好久这么个程序,目的是用8*8数码管用00-00-00这样的格式表示电子钟,但是烧进程序后,数码管全部显示8.(就是全部亮,数码管每段都亮),打击啊,左思右想就是不知道哪里的毛病,求大手点化啊,新手需要鼓励啊

//数码管时钟
#include "REGX52.H"
#define LED_PORT P0
#define uint8 unsigned char
#define uint16 unsigned int
#define A 20
#define B 30



#define C 40
uint8 Time2Ms= 0 ; // 2msLED 动态扫描时标消息
uint8 Time1S= 0 ; //时钟1S 时标消息
static uint16 flag2MS= 0 ; //对2 ms 时标进行计数

uint8 LEDBuffer[8] = {0} ; //显示缓冲区
uint8 DisplayCode[]={ 
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40};//共阴数码管使用
/*uint8 code  DisplayCode[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,
0xbf, //'-'号代码
} ;//共阳数码管使用
*/
//初始化定时器0
void Timer0Init(void)
{
 TMOD &= 0xf0 ;
 TMOD |= 0x01 ; //定时器0 工作方式1
 //TH0=(65536-50000)/256;  //12M赋值
    //TL0=(65536-50000)%256;
 TH0 = 0xf8 ; //定时器初始值,2MS
 TL0 = 0xcc ;
 TR0 = 1 ;
 ET0 = 1 ;
}
//在定时器0 中断处理程序中,设置时标消息,11.0592M晶振
void Time0(void) interrupt 1
{
 TH0 = 0xf8 ; //定时器重新赋初值
 TL0 = 0xcc ;
 //TH0=(65536-50000)/256;  //送初值12M晶振
 //TL0=(65536-50000)%256;
 //50ms_flag=1;
 Time2Ms= 1 ; //2MS 时标标志位置位
 if(++flag2MS== 500)
  {
  flag2MS= 0 ;
  Time1S= 1 ;
  }
}
void SetClock(uint8 nHour, uint8 nMinute, uint8 nSecond)
{
 LEDBuffer[0] = nHour / 10 ;
 LEDBuffer[1] = nHour % 10 ;
 LEDBuffer[2] = '-' ;
 LEDBuffer[3] = nMinute / 10 ;
 LEDBuffer[4] = nMinute % 10 ;
 LEDBuffer[5] = '-' ;
 LEDBuffer[6] = nSecond / 10 ;
 LEDBuffer[7] = nSecond % 10 ;
}
void RunClock(void)//数码管电子钟程序
{
if(Time1S )
 {
 Time1S = 0 ;
 if(++LEDBuffer[7] == 10)
  {
  LEDBuffer[7] = 0 ;
  if(++LEDBuffer[6] == 6)
   {
   LEDBuffer[6] = 0 ;
   if(++LEDBuffer[4] == 10)
    {
    LEDBuffer[4] = 0 ;
    if(++LEDBuffer[3] == 6)
     {
     LEDBuffer[3] = 0 ;
     if( LEDBuffer[0]<2)
      {
      if(++LEDBuffer[1]==10)
      {
      LEDBuffer[1] = 0 ;
      LEDBuffer[0]++;
      }
      }
     else
      {
      if(++LEDBuffer[1]==4)
       {
       LEDBuffer[1] = 0 ;
       LEDBuffer[0] = 0 ;
       }
      }
     }
    }
   }
  }
 }
}

//再分别编写送数码管段码函数,以及位选通函数。
void SendLedSegData(uint8 dat)
{
 LED_PORT = dat ;
 P2_6 = 1 ; //开段码锁存,送段码数据
 P2_6 = 0 ;
}
void SendLedBitData(uint8 dat)
{
 uint8 temp ;
 temp = (0x01 << dat ) ; //根据要选通的位计算出位码
 LED_PORT = temp ;
 P2_7 = 1 ; //开位码锁存,送位码数据
 P2_7 = 0 ;
}
void LedDisplay(uint8 * pBuffer)
{
 static uint8 LED_BIT = 0 ;
 if(flag2MS)
  {
  flag2MS= 0 ;
  SendLedBitData(8) ; //消隐
  if(pBuffer[LED_BIT] == '-') //显示'-'号
   {
   SendLedSegData(DisplayCode[16]) ;
   }
  else
   {
   SendLedSegData(DisplayCode[pBuffer[LED_BIT]]) ;
   }
  SendLedBitData(LED_BIT);
  if(++LED_BIT > 7)
   {
   LED_BIT = 0 ;
   }
  }
}
void main_init()
{
 P1_4 = 1 ; //关闭LED灯
    P3_4=0;//关闭液晶
 Timer0Init() ;
 SetClock(A,B,C) ; //设置初始时间
 EA = 1 ;
}

void main()
{
    main_init();
 while(1)
 {
 LedDisplay(LEDBuffer);
 RunClock();
 }
}
附:板子为本站的VER51HEI-5,keil 编译通过,无错误无警告,附图如下:

 

 

[此贴子已经被作者于2012-6-16 16:12:48编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:32490 发表于 2012-6-20 18:12 | 只看该作者
怎么没人回答啊,给点建议哇
回复

使用道具 举报

板凳
ID:1 发表于 2012-6-21 04:39 | 只看该作者

这个程序是网上找了修改的 还是完全自己写的 问题比较多

回复

使用道具 举报

地板
ID:35727 发表于 2012-6-25 18:35 | 只看该作者

你写的好复杂啊

 

回复

使用道具 举报

5#
ID:32490 发表于 2012-6-29 18:02 | 只看该作者
以下是引用wy704972600在2012-6-25 18:35:09的发言:

你写的好复杂啊

 

我是新手啊 已经尽力了 怎么能优化啊 有没有效率高代码简单的啊 发我一份啊

回复

使用道具 举报

6#
ID:32490 发表于 2012-6-29 18:04 | 只看该作者
以下是引用admin在2012-6-21 4:39:14的发言:

这个程序是网上找了修改的 还是完全自己写的 问题比较多

管理员帮忙指出我的问题啊 我进入自己的死胡同了转不出来

回复

使用道具 举报

7#
ID:42637 发表于 2012-7-9 20:36 | 只看该作者
写复杂了
[此贴子已经被作者于2012-7-9 20:44:30编辑过]
回复

使用道具 举报

8#
ID:41987 发表于 2012-7-14 16:13 | 只看该作者
你好!

你应该是写得显示函数有问题,段与位选之间可能有问题。我改写显示函数以后可以正常运行。

void display(uint8 aa, uint8 bb,uint8 cc,uint8 dd, uint8 ee,uint8 ff,uint8 gg, uint8 hh)
{

P0=table[aa];   //送段选数据
dula=1;         //打开段选
dula=0;         //关闭断选
P0=0xff;    //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xfe;        //送位选数据
wela=1;         //打开位选
wela=0;         //关闭位选
delayms(1);     //延时


P0=table[bb];    //送段选数据
dula=1;         //打开段选
dula=0;         //关闭断选
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xfd;      //送位选数据
wela=1;        //打开位选
wela=0;       //关闭位选
delayms(1);   //延时


P0=table[cc]; //送段选数据
dula=1;       //打开段选
dula=0;       //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xfb;     //送位选数据
wela=1;      //打开位选
wela=0;      //关闭位选
delayms(1);  //延时


P0=table[dd];   //送段选数据
dula=1;         //打开段选
dula=0;         //关闭断选
P0=0xff;    //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xf7;        //送位选数据
wela=1;         //打开位选
wela=0;         //关闭位选
delayms(1);     //延时


P0=table[ee];    //送段选数据
dula=1;         //打开段选
dula=0;         //关闭断选
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xef;      //送位选数据
wela=1;        //打开位选
wela=0;       //关闭位选
delayms(1);   //延时


P0=table[ff]; //送段选数据
dula=1;       //打开段选
dula=0;       //关闭断选
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xdf;     //送位选数据
wela=1;      //打开位选
wela=0;      //关闭位选
delayms(1);  //延时

P0=table[gg];   //送段选数据
dula=1;         //打开段选
dula=0;         //关闭断选
P0=0xff;    //送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0xbf;        //送位选数据
wela=1;         //打开位选
wela=0;         //关闭位选
delayms(1);     //延时


P0=table[hh];    //送段选数据
dula=1;         //打开段选
dula=0;         //关闭断选
P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时原来段选数据通过位锁存端造成混乱

P0=0x7f;      //送位选数据
wela=1;        //打开位选
wela=0;       //关闭位选
delayms(1);   //延时

 

}

void delayms(uint16 z)
{
uint16 x,y;
for(x=z;x>0;x--)
 for(y=110;y>0;y--);
}


这个显示函数是我根据光盘里的程序改写的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表