打印
[AVR单片机]

M16驱动HC595LED数码管显示不正常!

[复制链接]
2160|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
smart_avr|  楼主 | 2008-12-23 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
老师好!
我写了个驱动595数码管显示的代码,不知道怎么回事,总是不显示。LED数码管显示的都是4个"8.",数码管全亮。您看看这个这个代码是否有问题呢?谢谢!!


#include <avr/io.h>
#include <util/delay.h> 


#define uchar unsigned char
#define uint unsigned int
/*
PA4-PA7 为共阳数码管位选控制端,PB5 为595数据端,PB6为595移位时钟,
PB7 为595锁存时钟端
*/

unsigned char temp;
/***************************************************************
函 数 名:void Send_595(unsigned char data)
功   能:送数据进595
说   明:模拟SPI
入口参数:data 
返 回 值:无 
****************************************************************/
void SendData_595(void)
{
  unsigned char i;
  
    for (i = 0; i < 8; i++)
      {
          
            if (temp & 0x80)
              {
                PORTB |= _BV(PB5);//数据为1,就发送1
              }
            else
              {    
                PORTB &= ~(_BV(PB5));//数据为0,就发送0
              }
    
          PORTB &= ~(_BV(PB6));//上升沿将数据移位到寄存器
        
          PORTB |= _BV(PB6);
          
          temp <<= 1;  //将待发送的数据左移移位,  
        
      }

}

/***************************************************************
函 数 名:void Output_595(unsigned char Odata)
功   能:数据从595的并行口输出
说   明:
入口参数:Odata 
返 回 值:无 
****************************************************************/
void OutputData_595(void)
{
    PORTB &= ~(_BV(PB7));//
  
    PORTB |= _BV(PB7);//
    
}

int main(void)
{
 
 DDRA = 0XFF;
 PORTA = 0XFF;
 
 PORTB=0xFF;      
 DDRB=0xFF;        // 
 
 PORTA &= ~(_BV(PA4)|_BV(PA5)|_BV(PA6)|_BV(PA7));//PA4-PA7接数码管位选,共阳

 
 while(1)
   {
     temp = 0x3c;  //要发送的数据,0 显示代码
     SendData_595();//发送数据到595
    OutputData_595();//输出到595显示

   }
   return (0);

相关帖子

沙发
xwj| | 2008-12-23 11:19 | 只看该作者

temp试全局变量,移位后被改变了哦

          temp <<= 1;  //将待发送的数据左移移位, 

使用特权

评论回复
板凳
smart_avr|  楼主 | 2008-12-23 12:56 | 只看该作者

temp <<= 1;

什么意思啊?移位后准备发送下一位啊,!这个代码我在C51里可以驱动显示。M16就显示乱码了。。

使用特权

评论回复
地板
smart_avr|  楼主 | 2008-12-24 12:57 | 只看该作者

用C51驱动能正常显示了。用M16还没有显示。

#include <reg52.h>
#include <intrins.h>

#define         uint     unsigned int
#define     uchar     unsigned char

void OutputData_595 (void);
void  SendData_595    (void);

sbit     SDATA_595     =     P2^0;
sbit     SCLK_595     =     P2^1;
sbit     SRCLK_595     =     P2^2;

sbit     wei_one     =      P2^3;
sbit     wei_two     =      P2^4;

unsigned char temp;

void  SendData_595    (void)
{
    unsigned char j;
    
    for (j = 0; j < 8; j++)
    {
        if (temp & 0x80)
            {
                SDATA_595 = 1;
                }
        else
            {
                SDATA_595 = 0;
                }
         SCLK_595 = 0;
         SCLK_595 = 1;
         temp <<= 1;                
    }
    


void OutputData_595 (void)
{
    SRCLK_595 = 0;
    _nop_();
    SRCLK_595 = 1;
        
}

void main(void)
{

    wei_two = 0;//位选选通
    wei_one = 0;
    
    while(1)
    {
        temp = 0x92;//发送要显示的内容"5"
        SendData_595();
        OutputData_595();
    }
        
}

使用特权

评论回复
5
xyarm| | 2009-1-16 15:11 | 只看该作者

这样试试

void SendData_595(void)
{
  unsigned char i;
  
    for (i = 0; i < 8; i++)
      {
          
            if (temp & 0x80)
              {
                PORTB |= _BV(PB5);//数据为1,就发送1
              }
            else
              {    
                PORTB &= ~(_BV(PB5));//数据为0,就发送0
              }
    
          PORTB &= ~(_BV(PB6));//上升沿将数据移位到寄存器
        
          PORTB |= _BV(PB6);
          
          temp <<= 1;  //将待发送的数据左移移位,  
        
      }
    PORTB &= ~(_BV(PB7));//------------------------
  
    PORTB |= _BV(PB7);//--------------------------
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

55

帖子

0

粉丝