查看: 1736|回复: 9
打印 上一主题 下一主题

这是小弟一天的成果,利用并行口实现时分秒的不精确显示

[复制链接]
跳转到指定楼层
沙发
发表于 2014-7-23 08:47:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************
*   程序功能:数码管显示器动态显示
*   接线说明:核心板JP2 PA0-PA7连接到系统底板动态数码管显示电路JP81
*   实验现象:8位数码管产生精确秒计时
*        日    期 : 2014/7/22
*        作    者 : 翟志刚
*******************************************************/
#include <iom16v.h>
#define  uchar unsigned char
#define  uint  unsigned int

uchar led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar position[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar time[3];                                        // 时、分、秒计数
uchar dis_buff[8];                                // 显示缓冲区,存放要显示的6个字符的段码值
int time_counter;                                // 1秒计数器
/*******************************************************
//函数名称:delay_ms(uint k)
//函数功能:延时子程序
//入口参数:k,延时时间参数
//返回参数:无
********************************************************/
void delay_1ms(int k)
{
    int i,j;
    for(i=0;i<k;i++)
    {
       for(j=0;j<1000;j++)
       ;
    }
}
/*******************************************************
//函数名称:time_to_disbuffer(void)
//函数功能:时间值送显示缓冲区函数子程序
//入口参数:i,j,秒计数到十进位
//返回参数:无
********************************************************/
void time_to_disbuffer(void)                        // 时间值送显示缓冲区函数
{
    uchar i,j = 0;
        for (i=0;i < 3;i++)
        {
                dis_buff[3*i] = time[i] % 10;
                dis_buff[3*i+1] = time[i] / 10;
        }
}
/*******************************************************
//函数名称:display(void)
//函数功能:扫描显示函数子程序
//入口参数:i,数码管位数
//返回参数:无
********************************************************/
void display(void)                                // 扫描显示函数,执行时间12ms
{
    uchar i;
        for(i=0;i<8;i++)
        {
            if (i==2 || i==5 )
        {
            PORTA = 0x40;
        }
                else
            PORTA = led_7[dis_buff[i]];
            PORTC = position[i];
            delay_1ms(1);                                                                        // (2)
            PORTC = 0xff;                                                                        // (3)
          }
}

/*******************************************************
//函数名称:main()
//函数功能:程序主函数
********************************************************/
void main(void)
{
    PORTA=0x00;                // PORTA初始化
    DDRA=0xFF;
    PORTC=0x00;                // PORTC初始化
    DDRC=0xFF;

    time[2] = 0; time[1] = 0; time[0] = 0;        // 时间初值23:58:55
    time_to_disbuffer();

    while (1)
    {
            display();
                                                    // 显示扫描,执行时间12ms
            if (++time_counter >= 100)
            {
                    time_counter = 0;                                // (4)
                   // point_on = ~point_on;                        // (5)
                    if (++time[0] >= 60)
                    {
                            time[0] = 0;

            if (++time[1] >= 60)
            {
                time[1] = 0;

            if (++time[2] >= 24)

                time[2] = 0;
                            }
                    }

            }time_to_disbuffer();
        delay_1ms(1);                                        // 延时13ms,可进行其它处理(6)
    }
}


回复

使用道具 举报

地板
 楼主| 发表于 2014-7-23 09:00:41 | 只看该作者

标准度还不够,还请阁下多多包涵!
回复 支持 反对

使用道具 举报

4#
发表于 2014-7-23 09:01:21 | 只看该作者
为何不把问题一起发出来?
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2014-7-23 09:07:46 | 只看该作者
lxe 发表于 2014-7-23 09:01
为何不把问题一起发出来?

s o g a...这位仁兄有什么问题可以加我好友,我们细谈!
回复 支持 反对

使用道具 举报

6#
发表于 2014-7-23 09:11:51 | 只看该作者
jerryzhai 发表于 2014-7-23 09:07
s o g a...这位仁兄有什么问题可以加我好友,我们细谈!

。。能不矫情吗?
回复 支持 反对

使用道具 举报

7#
发表于 2014-7-23 09:18:20 | 只看该作者
本帖最后由 lxe 于 2014-7-23 09:20 编辑

/*******************************************************
//函数名称:time_to_disbuffer(void)
//函数功能:时间值送显示缓冲区函数子程序
//入口参数:i,j,秒计数到十进位
//返回参数:无
********************************************************/
void time_to_disbuffer(void)                        // 时间值送显示缓冲区函数
{
    uchar i;
        for (i=0;i < 3;i++)
        {
                dis_buff[3*i] = time % 10;
                dis_buff[3*i+1] = time / 10;
        }
}

/*******************************************************
//函数名称:time_to_disbuffer(void)
//函数功能:时间值送显示缓冲区函数子程序
//入口参数:i,j,秒计数到十进位
//返回参数:无
********************************************************/
void time_to_disbuffer(void)                        // 时间值送显示缓冲区函数
{
    uchar i,j = 0;
        for (i=0;i < 3;i++)
        {
                dis_buff[j++] = time % 10;
                dis_buff[j++] = time / 10;
        }
}


这两种写法会出现什么不现的效果?
回复 支持 反对

使用道具 举报

8#
 楼主| 发表于 2014-7-23 09:40:43 | 只看该作者
lxe 发表于 2014-7-23 09:18
/*******************************************************
//函数名称:time_to_disbuffer(void)
//函数 ...

首先我很佩服这位童鞋的意志力,学习,做工程就应该像这样!
接下来我们来看这个问题,很明显,我们先是强制让数码管的第三位和第六位送了一组数据“-”而后再在每个循环扫描周期内往dis_buff[]扔数据!很明显阁下的程序是每来一个扫描周期就按位送数据,当送到第三位的时候大家就会发现,第三位不变了,因为什么?因为我们已经附了初值给他,这就导致了一个什么问题呢?就是当秒计数到六十的时候,分不会进位!
回复 支持 反对

使用道具 举报

9#
发表于 2014-7-23 14:18:39 | 只看该作者
不错,我来赞一个。  多多学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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