//=============================================
#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;
}
}
}
|