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