📄 led.c
字号:
#include <iom8v.h>
#include <macros.h>
#include <math.h>
#define SCLK1(YesOrNo) (YesOrNo ? (PORTD |= (1<<(PD4))) : (PORTD &=~ (1<<(PD4))))
#define RCLK1(YesOrNo) (YesOrNo ? (PORTD |= (1<<(PD3))) : (PORTD &=~ (1<<(PD3))))
#define SER1(YesOrNo) (YesOrNo ? (PORTD |= (1<<(PD2))) : (PORTD &=~ (1<<(PD2))))
#define GG1(YesOrNo) (YesOrNo ? (PORTB |= (1<<(PB7))) : (PORTB &=~ (1<<(PB7))))
#define SCLK2(YesOrNo) (YesOrNo ? (PORTC |= (1<<(PC0))) : (PORTC &=~ (1<<(PC0))))
#define RCLK2(YesOrNo) (YesOrNo ? (PORTC |= (1<<(PC1))) : (PORTC &=~ (1<<(PC1))))
#define SER2(YesOrNo) (YesOrNo ? (PORTC |= (1<<(PC2))) : (PORTC &=~ (1<<(PC2))))
#define GG2(YesOrNo) (YesOrNo ? (PORTB |= (1<<(PB6))) : (PORTB &=~ (1<<(PB6))))
static unsigned char ucLineCnt;
static unsigned int Count;
unsigned int unDisRedBuf[16];//red
unsigned int unDisGreenBuf[16];//green
void HC595_Int(void);//595上电初始化
void Display(void);
//void Delay_1ms(void);
void main(void)
{
unsigned char i;
HC595_Int();//初始化
for(i = 0; i< 16; i++)
{
unDisRedBuf[i] = 0xb38f;
unDisGreenBuf[i] = 0x4c7f;
}
//设置1mS循环一次,然后调用Display,
//显示是unDisRedBuf[16]和unDisGreenBuf[16]里面数据。
//为1时显示,例:unDisRedBuf[0]=0xffff,则红色第一行全部亮。
while(1)
{
Count++;
Display();
// Delay_1ms();
if( ( Count & 0x07ff ) == 0x0400)
{
for(i = 0; i< 16; i++)
{
unDisRedBuf[i] = ( unDisRedBuf[i] <<1 ) | ( unDisRedBuf[i] >> 15 );
unDisGreenBuf[i] = ( unDisGreenBuf[i] <<1 ) | ( unDisGreenBuf[i] >> 15 );
}
}
}
}
void HC595_Int(void)
{
DDRB = 0xff;
DDRC = 0xff;
DDRD = 0xff;
GG1(0);
GG2(0);
SCLK1(0);
SCLK2(0);
RCLK1(0);
RCLK2(0);
}
//--------------------------------------
void Delay_1ms(void)
{
unsigned char a, b;
for (a = 0; a > 2; a++)
{
for (b = 0; b > 250; b++)
{ ; }
}
}
//----------------------------------------
void Display(void)
{
unsigned char lineFact;
unsigned char i;
lineFact = (ucLineCnt & 0x0f);
ucLineCnt++;
for (i=0; i < 8; i++)//choose the line,0 is display
{
( lineFact == ( i + 8 ) ) ? SER1(0) : SER1(1);
( lineFact == i ) ? SER2(0) : SER2(1);
SCLK1(0);
SCLK2(0);
SCLK1(1);
SCLK2(1);
}
for (i=0; i<16; i++)//unDisGreenBuf is 1 then display
{
(unDisGreenBuf[lineFact] & (1<<i)) ? SER1(0) : SER1(1);
(unDisRedBuf[lineFact] & (1<<i)) ? SER2(0) : SER2(1);
SCLK1(0);
SCLK2(0);
SCLK1(1);
SCLK2(1);
}
RCLK1(0);
RCLK2(0);
RCLK1(1);
RCLK2(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -