搜索
bottom↓
回复: 2

数码管循环显示

[复制链接]

出0入0汤圆

发表于 2015-6-5 09:42:45 | 显示全部楼层 |阅读模式
谁帮我看看下面这段程序,3位数码管通过1片595控制显示的程序。。我现在遇到个问题就是 我想让他先显示U1.0,然后d01,最后A02,
当时我现在却是这么显示的如下:3位数码管第1位显示U,第2位,第3位不显示。
                               然后第1位不显示,第2位显示1. 第三位不显示
                               最后第1,2位不显示  第3位显示0.
                                                         d01,和A02也是这么显示的。就好像跑马灯一样。
我把程序贴出来了。谁帮我看看。怎么修改成 U1.0在3位数码一起显示,然后过1秒后,切换到d01显示1秒种,最后切换到A02显示1秒钟,然后又从U1.0开始显示,依次循环。

#include <stc12c5a.h>
#include <intrins.h>


#define  NOP() _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_() /* 定义空指令 */


//74HC595引脚控制
sbit MOSIO =P0^1;  //串行数据线   //14脚
sbit R_CLK =P0^2;  //数据并行输出控制  //12脚
sbit S_CLK =P0^3;  //串行时钟线  //11脚

//数码管位选控制
sbit ADDR0 = P1^3;   //第0位数码管
sbit ADDR1 = P1^2;   //第1位数码管
sbit ADDR2 = P1^1;   //第2位数码管

unsigned char code LedChar[] = { //数码管字形码
                                ~0xC0, ~0xF9, ~0xA4, ~0xB0, ~0x99,
                                ~0x92, ~0x82, ~0xF8, ~0x80, ~0x90,
                                 0x77,0x7c,0x39,0x5e,0x79,0x71,0x3e
};

unsigned char LedBuff[9] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};   //数码管显示缓冲区,开始都不点亮

//全局变量

unsigned char i = 0; //动态扫描索引



void HC595SendData(unsigned char SendVal);

void ADC_Process();

void Delay1000ms();       
       


void main()
{
       while(1)
    {        
         ADC_Process();       
    }
}
/*********************************************************************************************************
** 函数名称: HC595SendData
** 功能描述: 向SPI总线发送数据
*********************************************************************************************************/
void HC595SendData(unsigned char SendVal)
{  
    unsigned char i;
               
    for(i=0;i<8;i++)
    {
        if((SendVal<<i)&0x80) MOSIO=1; //set dataline high  0X80  最高位与SendVal左移的最高位 进行逻辑运算
        else MOSIO=0;                                   // 如果为真 MOSIO = 1  

        S_CLK=0;  
        NOP();         //短暂延时产生一定宽度的脉冲信号
        NOP();         //短暂延时
        S_CLK=1;
    }
    R_CLK=0; //set dataline low
    NOP();  //短暂延时
    NOP();  //短暂延时
    R_CLK=1;         //
}


/***********************************************

************************************************/
void ADC_Process()
{   
    LedBuff[0] = LedChar[16];        //显示U
    LedBuff[1] = LedChar[1]|0x80; //显示1.
    LedBuff[2] = LedChar[0];        //显示0

    LedBuff[3] = LedChar[13];     //显示d
    LedBuff[4] = LedChar[0];      //显示0
    LedBuff[5] = LedChar[1];     //显示1
   
    LedBuff[6] = LedChar[10];   //显示A
    LedBuff[7] = LedChar[0];    //显示0
    LedBuff[8] = LedChar[2];   //显示2
   
    HC595SendData(0x00);      //消影
   
    switch(i)
    {
        case 0: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; HC595SendData(LedBuff[0]);
                Delay1000ms();break;
        case 1: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i++; HC595SendData(LedBuff[1]);
                Delay1000ms();break;
        case 2: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; i++; HC595SendData(LedBuff[2]);
                Delay1000ms();break;

        case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; HC595SendData(LedBuff[3]);
                Delay1000ms();break;
        case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i++; HC595SendData(LedBuff[4]);
                Delay1000ms(); break;
        case 5: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; i++; HC595SendData(LedBuff[5]);
                Delay1000ms();break;
        
        case 6: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; HC595SendData(LedBuff[6]);
                Delay1000ms();break;
        case 7: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i++; HC595SendData(LedBuff[7]);
                Delay1000ms(); break;
        case 8: ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; i=0; HC595SendData(LedBuff[8]);
                Delay1000ms();break;
        default :break;
    }     
}



void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-6-5 09:59:34 | 显示全部楼层
跑马灯因为Delay1000ms()太久了,应改为延时2ms左右
void ADC_Process()//显示处理
{
ADDR2 = 0; ADDR1 = 1; ADDR0 = 1;HC595SendData(LedBuff[0]);Delay2ms();HC595SendData(0);
ADDR2 = 1; ADDR1 = 0; ADDR0 = 1;HC595SendData(LedBuff[1]);Delay2ms();HC595SendData(0);
ADDR2 = 1; ADDR1 = 1; ADDR0 = 0;HC595SendData(LedBuff[2]);Delay2ms();HC595SendData(0);       
}
void main()
{
    while(1)
    {     
        LedBuff[0] = LedChar[16];        //显示U
            LedBuff[1] = LedChar[1]|0x80; //显示1.
            LedBuff[2] = LedChar[0];        //显示0   
        for(i=0;i<167;i++)ADC_Process();

        LedBuff[0] = LedChar[13];     //显示d
            LedBuff[1] = LedChar[0];      //显示0
            LedBuff[2] = LedChar[1];     //显示1  
        for(i=0;i<167;i++)ADC_Process();

        LedBuff[0] = LedChar[10];   //显示A
            LedBuff[1] = LedChar[0];    //显示0
            LedBuff[2] = LedChar[2];   //显示2  
        for(i=0;i<167;i++)ADC_Process();
      
    }
}

出0入0汤圆

 楼主| 发表于 2015-6-5 10:38:14 | 显示全部楼层
lcw_swust 发表于 2015-6-5 09:59
跑马灯因为Delay1000ms()太久了,应改为延时2ms左右
void ADC_Process()//显示处理
{

我弄好了。实在是非常感谢你对我的帮助。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 19:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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