打印
[AVR单片机]

ATmega128控制74595实现跑马灯

[复制链接]
3154|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hvcb_hlj|  楼主 | 2009-7-16 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//=============================================

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define sbi(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit)) 
#define cbi(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit))
#include <avr/signal.h>
#include <stdlib.h>
#include <inttypes.h>
//=============================================
#define set_rclk_in() sbi(DDRB,PB0);//rclk为锁存脉冲输入
#define set_rclk_in1() sbi(PORTB,PB0);//rclk输入高
#define set_rclk_in0() cbi(PORTB,PB0);//rclk输入低

#define set_srclk_in() sbi(DDRB,PB1);//srclk为移位脉冲输入
#define set_srclk_in1() sbi(PORTB,PB1);//srclk输入高
#define set_srclk_in0() cbi(PORTB,PB1);//srclk输入低

#define set_ser_in() sbi(DDRB,PB2);//ser输入
#define set_ser_in1() sbi(PORTB,PB2);//ser输入高
#define set_ser_in0() cbi(PORTB,PB2);//ser输入低

void delay_us(uint16_t x)  //x=1对应3.03us

    while(x) 
    { 
        x--; 
    } 

void delay_ms(uint8_t xtal)
{
    uint8_t i;
    for(i=1;i<(uint8_t)(xtal*143-2);i++)
    {;}
}


//--------向前面板指示灯595写一个字节数据
void ser_out(uint8_t dat)
{


    set_rclk_in();//设置PE3为输出
    set_srclk_in();//设置PE2为输出
    set_ser_in();//设置PE4输出

    int i;
    for(i=0;i<8;i++)
    {
        if(dat&0x80)
        {
            set_ser_in0();//ser输入低
        }
        else
        {
            set_ser_in1();//ser输入高
        }
        set_srclk_in1();//srclk输入高
        set_srclk_in0();//srclk输入低
        dat<<=1;
    } 
    
        set_rclk_in1();//PE3输出高,rclk输入高,锁存内容到锁存器,指示灯显示
    set_rclk_in0();//PE2输出低,srclk输入低
}



//===============主程序===============
void main (void)
{
    uint8_t i,j,m,data;
    for(;;)
    {
        data=1;
        for(i=0;i<=7;i++)
        {
            for(j=0;j<=250;j++)
            {
                delay_ms(255);
            }
            ser_out(data);
            data=data<<1;
            
        }
        
        data=0x80;
        for(i=0;i<=7;i++)
        {
            for(j=0;j<=250;j++)
            {
                delay_ms(255);
            }
            ser_out(data);
            data=data>>1;
            
        }
    }
}

相关帖子

沙发
bear15888| | 2009-8-2 10:46 | 只看该作者
本帖最后由 bear15888 于 2009-8-2 10:49 编辑

程序借用了。

使用特权

评论回复
板凳
admin| | 2009-8-2 10:59 | 只看该作者
//=============================================

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define sbi(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit))
#define cbi(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit))
#include <avr/signal.h>
#include <stdlib.h>
#include <inttypes.h>
//=============================================
#define set_rclk_in() sbi(DDRB,PB0);//rclk为锁存脉冲输入
#define set_rclk_in1() sbi(PORTB,PB0);//rclk输入高
#define set_rclk_in0() cbi(PORTB,PB0);//rclk输入低

#define set_srclk_in() sbi(DDRB,PB1);//srclk为移位脉冲输入
#define set_srclk_in1() sbi(PORTB,PB1);//srclk输入高
#define set_srclk_in0() cbi(PORTB,PB1);//srclk输入低

#define set_ser_in() sbi(DDRB,PB2);//ser输入
#define set_ser_in1() sbi(PORTB,PB2);//ser输入高
#define set_ser_in0() cbi(PORTB,PB2);//ser输入低

void delay_us(uint16_t x)  //x=1对应3.03us
{
    while(x)
    {
        x--;
    }
}
void delay_ms(uint8_t xtal)
{
    uint8_t i;
    for(i=1;i<(uint8_t)(xtal*143-2);i++)
    {;}
}


//--------向前面板指示灯595写一个字节数据
void ser_out(uint8_t dat)
{


    set_rclk_in();//设置PE3为输出
    set_srclk_in();//设置PE2为输出
    set_ser_in();//设置PE4输出

    int i;
    for(i=0;i<8;i++)
    {
        if(dat&0x80)
        {
            set_ser_in0();//ser输入低
        }
        else
        {
            set_ser_in1();//ser输入高
        }
        set_srclk_in1();//srclk输入高
        set_srclk_in0();//srclk输入低
        dat<<=1;
    }
   
        set_rclk_in1();//PE3输出高,rclk输入高,锁存内容到锁存器,指示灯显示
    set_rclk_in0();//PE2输出低,srclk输入低
}



//===============主程序===============
void main (void)
{
    uint8_t i,j,m,data;
    for(;;)
    {
        data=1;
        for(i=0;i<=7;i++)
        {
            for(j=0;j<=250;j++)
            {
                delay_ms(255);
            }
            ser_out(data);
            data=data<<1;
            
        }
        
        data=0x80;
        for(i=0;i<=7;i++)
        {
            for(j=0;j<=250;j++)
            {
                delay_ms(255);
            }
            ser_out(data);
            data=data>>1;
            
        }
    }
}

使用特权

评论回复
地板
bear15888| | 2009-8-2 11:13 | 只看该作者
void main(void)
{
  unsigned char i;
  unsigned int DS;
  unsigned char Data=0111111;
   DDRB=0X0F;
   PORTB=0X0F;                              //将B口0,1,2脚做输出用

while(1)
{
   
  for(i=0;i<8;i++)
  {
    PORTB=(0<<PB2);             //先置为低
    DS=Data&0x80;               //取数据的最高位
    PORTB=(DS<<PB1);            //将某位的值赋给PB1
      Data<<= 1;                  //将数据的次高位移到最高位,为下一次取数据做准备
    PORTB=(1<<PB2);             //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
    delay(10);
  }
  PORTB=(0<<PB0);          //先置为低
  PORTB=(1<<PB0);         //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。  
  }  
}

楼主,不知可否帮忙看看,哪有错误?在一位数码管上只循环点亮一次就不亮了,不知道是哪里的时序出了错!

使用特权

评论回复
5
bear15888| | 2009-8-2 19:43 | 只看该作者
哎,还是热心人少哦。上面的问题,自己已经解决!

使用特权

评论回复
6
gaohq| | 2009-8-2 19:48 | 只看该作者
没有while(1)吧,

我这时才看到。
我也是初学。

使用特权

评论回复
7
auzxj| | 2009-8-2 20:20 | 只看该作者
6# gaohq
for(;;)是什么?

使用特权

评论回复
8
bear15888| | 2009-8-3 09:06 | 只看该作者
7# auzxj

和while(1)的功能一样,换个面具活着而已

使用特权

评论回复
9
auzxj| | 2009-8-3 09:33 | 只看该作者
8# bear15888
呵呵,我那是在对 我楼上的gaohq进行启发式。。。。

使用特权

评论回复
10
bear15888| | 2009-8-5 09:30 | 只看该作者
9# auzxj

不好意思,小的误会了@!

使用特权

评论回复
11
naotaoya| | 2009-8-10 08:55 | 只看该作者
程序接过来瞄一下!:lol

使用特权

评论回复
12
欧阳青云| | 2009-8-10 23:15 | 只看该作者
借用

使用特权

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

本版积分规则

3

主题

4

帖子

0

粉丝