Board logo

标题: 74HC595驱动问题!! [打印本页]

作者: yuchengze    时间: 2016-12-22 21:16     标题: 74HC595驱动问题!!

本帖最后由 yuchengze 于 2016-12-27 12:11 编辑

先上代码:

#include <STC15F2K60S2.H>

#include "intrins.h"

// LED字模表
unsigned char code LED_0F[] =

{// 0     1      2       3    4     5      6       7    8     9      A       b    C    d      E    F    -
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};

//-----------------------------------------------------------------------------
// 函数原形定义
#define uchar unsigned char

void main (void);                    // 主函数
void LED4_Display (void);            // LED显示
void LED_OUT(uchar X);                // LED单字节串行移位函数
        
uchar xs,haom,hm;

unsigned int num;
sbit DIO = P3^4;                //串行数据输入
sbit RCLK  = P3^3;                //时钟脉冲信号——上升沿有效
sbit SCLK = P3^2;                //打入信号————上升沿有效

//-----------------------------------------------------------------------------
// 全局变量
uchar LED[8];    //用于LED的8位显示缓存

void Timer0Init(void)        //5毫秒@6.000MHz
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0xD0;        //设置定时初值
    TH0 = 0x8A;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0=1;
    EA=1;
}
//*****************************************************************************
// 主程序
//
void main (void)

{


    Timer0Init();   

    while(1)
    {
   

    }

}

                           
void LED4_Display (void)
{
   

    uchar qian,bai,shi,ge;

     qian=num%10000/1000;
    bai=num%1000/100;
    shi=num%100/10;
    ge=num%10;

     switch(xs)
     {
         

           case 0:
                    //显示第1位
                    LED_OUT(LED_0F[ge]);   

                    LED_OUT(0x01);        
               

                    RCLK = 0;
                    RCLK = 1;
                   xs=1;
                         break;
           case 1:
                    //显示第2位                    
                    LED_OUT(LED_0F[shi]);   

                    LED_OUT(0x02);        
               

                    RCLK = 0;
                    RCLK = 1;
                   xs=2;
                   break;
           case 2:
                    //显示第3位
                    LED_OUT(LED_0F[bai]);            
                    LED_OUT(0x04);   

               

                    RCLK = 0;
                    RCLK = 1;
                   xs=3;
                   break;
           case 3:
                    //显示第4位               

                    LED_OUT(LED_0F[qian]);            
                    LED_OUT(0x08);        
                                               
                    RCLK = 0;
                    RCLK = 1;
                   xs=0;
                   break;
     }





}

void LED_OUT(uchar X)
{
    uchar i;
    for(i=8;i>=1;i--)
    {
        if (X&0x80) DIO=1; else DIO=0;
        X<<=1;
        SCLK = 0;
        SCLK = 1;
    }
}

void tm0_isr() interrupt 1 using 1
{
    LED4_Display ();

    haom++;   

    if(haom==200)
    {  
        num++;  haom=0;
       hm=~hm;
    }
}

现在是》显示第1位,也就是“ge”一直是0,其他位正常,如果把其他位的数据也换成“ge”就两位都可以正常显示,不知道哪出问题啊?




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0