搜索
bottom↓
回复: 23
打印 上一主题 下一主题

气死我了,74hc595的驱动函数调了2天,它就是不显示,位选都成功了,就是595的驱动函数有问

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2010-10-17 16:58:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编译软件ICC6.31a
m48单片机
位选采用138译码器实现,程序是没问题的

#include <iom48v.h>
#include <macros.h>
#include ".\head\ICC_AVRPORTBit.h"
#include ".\head\Delay.h"

#define uint8 unsigned char

//74HC595的端口定义
#define Hc595_data PORTB_PB2
#define Hc595_clk  PORTB_PB1
#define Hc595_stcp PORTB_PB0  //片选

//74HC138的端口定义
#define Hc138_A0  PORTB_PB3
#define Hc138_A1  PORTB_PB4
#define Hc138_A2  PORTB_PB5

const uint8 LedDisplayCode[]=
{
    0xC0,/*0*/
    0xF9,/*1*/
    0xA4,/*2*/
    0xB0,/*3*/
    0x99,/*4*/
    0x92,/*5*/
    0x82,/*6*/
    0xF8,/*7*/
    0x80,/*8*/
    0x90,/*9*/
    0x88,/*A*/
    0x83,/*b*/
    0xC6,/*C*/
    0xA1,/*d*/
    0x86,/*E*/
    0x8E,/*F*/
    0xBF,/*-*/
};

void Hc595_send_byte(unsigned char byte)
{
     unsigned char i;
     for(i=0;i<8;i++)
     {
         
          Hc595_data=byte&(0x80>>i);
          Hc595_clk=0;
          Delay_nus(5);
          Hc595_clk=1;         
     }
     Delay_nus(5);
     Hc595_clk=0;
     Delay_nus(5);
     Hc595_stcp=0;
     Delay_nus(5);
     Hc595_stcp=1;
}
/*
void Hc595_send_int(uint8 data)
{
     unsigned char int_l,int_h;
     int_l=data;    //取低4位
     int_h=data>>4;      //取高4位
     Hc595_send_byte(int_l);
     Hc595_send_byte(int_h);
     Hc595_stcp=1;
     Hc595_stcp=0;
}*/

void Select_LED_Bit(uint8 Bit_Num)
{
    switch(Bit_Num)
    {
        case 0:
               Hc138_A2=0;
               Hc138_A1=0;
               Hc138_A0=0;
               break;
        case 1:
               Hc138_A2=0;
               Hc138_A1=0;
               Hc138_A0=1;
               break;
        case 2:
               Hc138_A2=0;
               Hc138_A1=1;
               Hc138_A0=0;
               break;
        case 3:
               Hc138_A2=0;
               Hc138_A1=1;
               Hc138_A0=1;
               break;
        case 4:
               Hc138_A2=1;
               Hc138_A1=0;
               Hc138_A0=0;
               break;
        case 5:
               Hc138_A2=1;
               Hc138_A1=0;
               Hc138_A0=1;
               break;
       case 6:
               Hc138_A2=1;
               Hc138_A1=1;
               Hc138_A0=0;
               break;
       case 7:
               Hc138_A2=1;
               Hc138_A1=1;
               Hc138_A0=1;
               break;               
    }
}
void main()
{
    uint8 i;
    DDRB=0XFF;
    PORTB=0XFF;
        while (1)
        {
                //for(i=0;i<8;i++)
        //{
             Select_LED_Bit(7);
             //Hc595_send_int(LedDisplayCode);
             Hc595_send_byte(0x86);            
             //Delay_nms(100);           
       // }
        }
}

出0入0汤圆

2
发表于 2010-10-17 17:26:13 | 只看该作者
都这年代了,还研究M48?我们都改51了
既然程序没有问题,贴出来看个屁啊,还是把电路也贴出来看看吧

出0入0汤圆

3
 楼主| 发表于 2010-10-17 18:57:07 | 只看该作者
回复【1楼】xiaobendan 仲跻东
-----------------------------------------------------------------------

1、说话太不文明了

2、51也8块以上,48也10块以上,性能却差很多,而且48也不是不可能不降了

出0入0汤圆

4
发表于 2010-10-17 19:41:14 | 只看该作者
STC的貌似4元起

出0入0汤圆

5
发表于 2010-10-17 20:24:05 | 只看该作者
mega88和48似乎降价了哦   项目上之前没办法直接全部替换掉  前天又购买了几百片  一片11块  应该降价了不少了

出0入0汤圆

6
发表于 2010-10-17 20:33:48 | 只看该作者
早就  STC 啦!   程序不想看, 你还是看看时序,还有你的电路好了。。。。

出0入0汤圆

7
 楼主| 发表于 2010-10-17 20:45:16 | 只看该作者
大哥们我的程序问题在哪里啊?别先讨论钱的问题啊

我刚仿真了,595的并行输出始终是高电平,这是怎么回事啊

出0入0汤圆

8
发表于 2010-10-17 21:42:45 | 只看该作者
for(i=0;i<8;i++)
     {
         
          Hc595_data=byte&(0x80>>i);
          Hc595_clk=0;
          Delay_nus(5);  
          Hc595_clk=1;           
     }


你这是构造下降沿.另外你的电路图呢?

出0入4汤圆

9
发表于 2010-10-17 21:49:19 | 只看该作者
595时序对么?

出0入0汤圆

10
发表于 2010-10-17 22:15:35 | 只看该作者
看看这个吧,很简单的东西。。。

74HC595驱动程序2例
程 序 匠 人 发表于 2005-11-10 20:37:00  阅读全文(8125) | 回复(0) | 引用通告(4) | 编辑


给个74HC595的"慢动作"
  
  
void WriteSIOByte(unsigned char val)
{
unsigned char i;
  ACC = val;
  for (i = 8; i > 0; i --) {
    SRCLK = 0;//拉低74HC595时钟
    _rrca_();//右移一位数据
    SER = CY;//发送74HC595一位串行数据
    SRCLK = 1;//拉高74HC595时钟
    _nop_();//延时
  }
  SER = 1;//释放数据总线
//以下3条指令若在多字节时,应该移入多字节全发送完后在执行此3条指令
  RCLK = 0;
  _nop_();//延时
  RCLK = 1;//打入并行数据
}



74ls595"速射"
  
  
hotpower

  for(i = 0; i < buffsize; i ++){
    SBUF = siobuff;
    while(TI == 0);
    TI = 0;
  }
  RCLK = 0;
  _nop_();//延时
  RCLK = 1;//打入并行数据

出0入0汤圆

11
 楼主| 发表于 2010-10-18 13:42:39 | 只看该作者
回复【7楼】rainyss
-----------------------------------------------------------------------


(原文件名:1.jpg)


(原文件名:2.jpg)

出0入0汤圆

12
发表于 2010-10-18 20:13:46 | 只看该作者
回复【10楼】xtaens
-----------------------------------------------------------------------

看不清.看我的吧.


(原文件名:无标题.gif)

出0入0汤圆

13
 楼主| 发表于 2010-10-18 21:49:19 | 只看该作者
回复【11楼】rainyss
-----------------------------------------------------------------------

1、电路图是没有问题的,他是一个开发版原理图
2、请问:
for(i=0;i<8;i++)  
     {  
           
          Hc595_data=byte&(0x80>>i);  
          Hc595_clk=0;   
          Hc595_clk=1;            
     }
Hc595_data 的值应该只有0和1两个值,但是假如0x40&0x50=0x40, Hc595_data=0x40;
后Hc595_data的值是0x40呢还是别的数呢(如为1),我的编译软件为ICC6.31a,Hc595_data的值与编译软件有关系吗

谢谢啊

出0入0汤圆

14
发表于 2010-10-19 00:22:55 | 只看该作者
Hc595_clk=0;   
for(i=0;i<8;i++)   
{   
            
     Hc595_data=byte&(0x80>>i);   
     Hc595_clk=1;            
     Hc595_clk=0;   
}

还有12脚HCLK和13脚OE你都处理没有?

出0入0汤圆

15
 楼主| 发表于 2010-10-19 16:32:30 | 只看该作者
1、13脚我是接地了的
2、12脚的操作在下面函数的for循环后也是处理的了

void Hc595_send_byte(unsigned char byte)
{
     unsigned char i;
     for(i=0;i<8;i++)
     {
         
          Hc595_data=byte&(0x80>>i);
          Hc595_clk=0;
          Delay_nus(5);  
          Hc595_clk=1;           
     }
     Delay_nus(5);  
     Hc595_clk=0;
     Delay_nus(5);  
     Hc595_STCp=0;
     Delay_nus(5);  
     Hc595_STCp=1;
}

出0入0汤圆

16
 楼主| 发表于 2010-10-19 16:33:56 | 只看该作者
回复【13楼】rainyss
-----------------------------------------------------------------------

Hc595_data=byte&(0x80>>i);
这句话是参考马朝老师354页的写法改的,不知改的正确与否?????

出0入0汤圆

17
发表于 2010-10-19 17:00:48 | 只看该作者
void Hc595_send_byte(unsigned char byte)
{
     unsigned char i;
     unsigned char shift=0x80;
     for(i=0;i<8;i++)
     {
                 Hc595_clk=0;
                 
          if(byte&shift)                 
          {Hc595_data=1;}
          else
          {Hc595_data=0;}
                    
          Hc595_clk=1;
          shift>>=1;           
     }
     Delay_nus(5);  
     Hc595_clk=0;
     Delay_nus(5);  
     Hc595_STCp=0;
     Delay_nus(5);  
     Hc595_STCp=1;
}
你可以这样写试试 感觉你的那个函数有问题,还有就是把延时加大 试试,另一个就是查查 并口数据出使能的地方是不是时序配合有问题。

出0入54汤圆

18
发表于 2010-10-19 17:13:12 | 只看该作者
我一直用的时候常态SCK和RCK都是低电平,改成常态高电平时有问题,后面没有去研究了

出0入0汤圆

19
发表于 2010-10-19 20:21:46 | 只看该作者
Hc595_data=byte&(0x80>>i);  
          Hc595_clk=0;  
          Delay_nus(5);   
          Hc595_clk=1;      


这种时序个人认为是不妥的,最好是产生上升沿后返回低电平.也许各人习惯不同吧.

出0入0汤圆

20
 楼主| 发表于 2010-10-19 21:43:14 | 只看该作者
问题终于找出来了:
原来是Hc595_data=byte&(0x80>>i)在作怪,改成
if(byte&0x80)
     Hc595_data=1;
else
     Hc595_data=0;

就可以了,下面是全部的源代码,其中去掉延时程序也跑得很happy。

思考:Hc595_data=byte&(0x80>>i)在不同的编译软件上的结果是不是相同的呢(如马朝老师写的那种写法,软件为cvavr)
结论:以后为了万无一失还是写成这样吧,防止不同的编译器对他的理解不同
if(byte&0x80)
     Hc595_data=1;
else
     Hc595_data=0;
以上是我的观点,正确与否请大家指正


#include <iom48v.h>
#include <macros.h>
#include ".\head\ICC_AVRPORTBit.h"
#include ".\head\Delay.h"

#define uint8 unsigned char

//74HC595的端口定义
#define Hc595_data PORTB_PB2
#define Hc595_clk  PORTB_PB1
#define Hc595_stcp PORTB_PB0  //片选

//74HC138的端口定义
#define Hc138_A0  PORTB_PB3
#define Hc138_A1  PORTB_PB4
#define Hc138_A2  PORTB_PB5

const uint8 LedDisplayCode[]=
{
    0xC0,/*0*/
    0xF9,/*1*/
    0xA4,/*2*/
    0xB0,/*3*/
    0x99,/*4*/
    0x92,/*5*/
    0x82,/*6*/
    0xF8,/*7*/
    0x80,/*8*/
    0x90,/*9*/
    0x88,/*A*/
    0x83,/*b*/
    0xC6,/*C*/
    0xA1,/*d*/
    0x86,/*E*/
    0x8E,/*F*/
    0xBF,/*-*/
};

void Hc595_send_byte(unsigned char byte)
{
     unsigned char i;
     for(i=0;i<8;i++)
     {
          if(byte&0x80)
               Hc595_data=1;
          else
               Hc595_data=0;
          //Hc595_data=byte&(0x80>>i);//不知道这句话为什么不行
          byte <<=1;
          Hc595_clk=0;
          Hc595_clk=1;     
     }
     Hc595_stcp=0;
     Hc595_stcp=1;

}

/*
void Hc595_send_int(uint8 data)
{
     unsigned char int_l,int_h;
     int_l=data;    //取低4位
     int_h=data>>4;      //取高4位
     Hc595_send_byte(int_l);
     Hc595_send_byte(int_h);
     Hc595_stcp=1;
     Hc595_stcp=0;
}*/

void Select_LED_Bit(uint8 Bit_Num)
{
    switch(Bit_Num)
    {
        case 0:
               Hc138_A2=0;
               Hc138_A1=0;
               Hc138_A0=0;
               break;
        case 1:
               Hc138_A2=0;
               Hc138_A1=0;
               Hc138_A0=1;
               break;
        case 2:
               Hc138_A2=0;
               Hc138_A1=1;
               Hc138_A0=0;
               break;
        case 3:
               Hc138_A2=0;
               Hc138_A1=1;
               Hc138_A0=1;
               break;
        case 4:
               Hc138_A2=1;
               Hc138_A1=0;
               Hc138_A0=0;
               break;
        case 5:
               Hc138_A2=1;
               Hc138_A1=0;
               Hc138_A0=1;
               break;
       case 6:
               Hc138_A2=1;
               Hc138_A1=1;
               Hc138_A0=0;
               break;
       case 7:
               Hc138_A2=1;
               Hc138_A1=1;
               Hc138_A0=1;
               break;               
    }
}
void main()
{
    uint8 i;
    DDRB=0XFF;
    PORTB=0XFF;
    while (1)
   {
        for(i=0;i<8;i++)
        {
             Select_LED_Bit(i);
             Hc595_send_byte(LedDisplayCode);           
             Delay_nms(300);           
        }
    }
}
头像被屏蔽

出0入0汤圆

21
发表于 2011-12-29 16:59:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

22
发表于 2012-3-26 12:50:34 | 只看该作者
mark  一下下

出0入0汤圆

23
发表于 2012-6-6 12:52:50 | 只看该作者
#include <iom8.h>
#include "SPI595.h"

__flash unsigned char Table[]={  
                0x03,  //"0"
                0x9F,  //"1"
                0x25,  //"2"
                0x0D,  //"3"
                0x99,  //"4"
                0x49,  //"5"
                0x41,  //"6"
                0x1F,  //"7"
                0x01,  //"8"
                0x09,  //"9"
                0x11,  //"A"
                0xC1,  //"B"
                0x63,  //"C"
                0x85,  //"D"
                0x61,  //"E"
                0x71,  //"F"
                0x91,  //"H"
                0xE3,  //"L"
                0x13,  //"n"
                0x83,  //"u"
                0x31,  //"P"
                0xC5,  //"o"
                0xFD,  //"-"
                0xFF,  //close
};

__flash unsigned char Bit_Tab[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //NPN

unsigned char DisBuffer[8] = {1,2,3,4,5,6,7,8};

#pragma vector = SPI_STC_vect
__interrupt void SPI_isr(void)
{
        volatile static unsigned char Loop=0,LedCycle=0;
        _CLI();
        if(Loop == 0)
        {
                SPDR = Bit_Tab[LedCycle];
                Loop = 1;
        }
        else
        {
                if(Loop == 1)
                {
                        SPDR = Table[DisBuffer[LedCycle]];
                        Loop = 3;
                }
                else
                {
                        Loop = 0;
                        ST_CLKHigh;
                        _NOP();
                        _NOP();
                        _NOP();
                        _NOP();
                        ST_CLKLow;
                        SPDR = 0x00;
                        LedCycle++;
                        LedCycle &= 0x7;
                }
        }
        _SEI();
}

void SPI_MasterInit(void)
{
        PORTB|= (1<<PB2) | (1<<PB5) | (1<<PB7);
        DDRB |= (1<<PB2) | (1<<PB5) | (1<<PB7);
        // SPI initialization
        // SPI Type: Master
        // SPI Clock Rate: 2*2000.000 kHz
        // SPI Clock Phase: Cycle Start
        // SPI Clock Polarity: Low
        // SPI Data Order: MSB First
        SPCR=0xD1;
        SPSR=0x00;
        _NOP();
        _NOP();
        SPDR = 0xff;
}
在中断里调 用的,用M8

出0入0汤圆

24
发表于 2012-6-8 08:32:19 | 只看该作者
Hc595_data=byte&(0x80>>i)在不同的编译软件上的结果是不是相同的呢



because assigning a non-bit value to a bit type is undefined in C.

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

本版积分规则

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

GMT+8, 2024-5-2 15:16

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

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