⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led.c

📁 基于atmega8l的16×16双色点阵控制
💻 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 + -