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

📄 点阵demo代码.c

📁 跑马灯的矩阵方案
💻 C
字号:
//** device:pic16f73**//
#include	<pic.h>
unsigned char num,A1,A1_num,CNT,mode;
//num为当前显示的灯数,A1为刚A/D出来的累进.
//CNT为中断计数,mode为显示的模式
#define 	LED[0]   	RC0			
//标志位
#define 	LATCH   	RB3			
//LATCH信号位
#define 	SIN     	RB1			
//serial-in信号位
#define 	CLK     	RB2			
//clock信号位
unsigned char time,t;
//定义时间的变量

//**延时程序**//
void delay_1ms(unsigned int k)
{
	unsigned int n,p;
	for(p=0;p<k;p++)
	for(n=0;n<50;n++)
		{
		NOP();
		}
}
void delay_ms(void)
{
unsigned char k;
for(k=0;k<2;k++)
	{
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
		NOP();
	}
}
delay_cnt(unsigned char cnt)
 {
unsigned char n,j;
for(n=0;n<cnt;n++)
	for(j=0;j<10;j++)
	{
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	asm("nop");
	}
 }
//**中断设置程序**//
void interrupt isr(void)
{
 	GIE=0;
	INTF=0;
	PORTC=0XFF;
	delay_1ms(300);
	PORTC=0X00;

	while(RB0==0)
	{
	delay_1ms(50);
//	delay_ms();
	while(RB0==0)
	{}
	}

	switch(CNT)
		{
		case 1:mode=2;CNT=2;break;
		case 2:mode=3;CNT=3;break;
		case 3:mode=4;CNT=4;break;
		case 4:mode=5;CNT=5;break;
		case 5:mode=6;CNT=6;break;
		case 6:mode=7;CNT=7;break;
		case 7:mode=1;CNT=1;break;
		};
	INTF=0;
	GIE=1;
}
//**将16位数字串行输入到16个输出口的程序**//
 void run(unsigned char a,unsigned char b)
{
//start
	SIN=0;
	LATCH=0;

//1 bit
	if(0x80&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//2 bit
	CLK=0;
	if(0X40&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//3 bit
	CLK=0;
	if(0X20&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//4 bit
	CLK=0;
	if(0X10&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//5 bit
	CLK=0;
	if(0X08&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//6 bit
	CLK=0;
	if(0X04&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//7 bit
	CLK=0;
	if(0X02&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//8 bit
	CLK=0;
	if(0X01&a)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//9 bit
	CLK=0;
	if(0x01&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//10 bit
	CLK=0;
	if(0X02&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//11 bit
	CLK=0;
	if(0X04&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//12 bit
	CLK=0;
	if(0X08&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//13 bit
	CLK=0;
	if(0X10&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//14 bit
	CLK=0;
	if(0X20&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//15 bit
	CLK=0;
	if(0X40&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//16 bit
	CLK=0;
	if(0X80&b)
	{SIN=1;}
	else SIN=0;
	CLK=1;
//Stop
	CLK=0;
	SIN=0;
	LATCH=1;
	asm("nop");
	LATCH=0;	
}
//**将内容显示到整个屏幕的扫描程序**//
void output(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char e,unsigned char f,unsigned char g,unsigned char h)
{
	while(time--)
		{
			RC0=0;
			run(a,0x01);
			delay_cnt(10);

			RC0=1;
			run(b,0x02);
			delay_cnt(10);

			RC0=0;
			run(c,0x04);
			delay_cnt(10);

			RC0=1;
			run(d,0x08);
			delay_cnt(10);

			RC0=0;
			run(e,0x10);
			delay_cnt(10);

			RC0=1;
			run(f,0x20);
			delay_cnt(10);

			RC0=0;
			run(g,0x40);
			delay_cnt(10);

			RC0=1;	
			run(h,0x80);
			delay_cnt(9);
		}
}

//******屏幕全亮******//
void allstar(void)
{
	t=2;
	time=t;
	/*Light all LED */
	output(0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff);
}
//******心型效果******//
void heart(void)
{
	t=100;
	/*display heart*/
	time=t;
	output(0x00,0x38,0x44,0x42,0x21,0x42,0x44,0x38);
	t=10;
	/*display full heart*/
	time=t;
	output(0x00,0x38,0x7c,0x7e,0x2f,0x7e,0x7c,0x38);
}
//******屏幕闪烁******//
void shine(void)
{	
	t=12;
	time=t;
	output(0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55);

	time=t;
	output(0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa);	
}
//*******显示数字(0~9)*******//
void number(void)
{
	t=15;
	/*display 0 */
	time=t;
	output(0x00,0x00,0x3E,0x41,0x41,0x3E,0x00,0x00);
	/*display 1 */
	time=t;
	output(0x00,0x00,0x00,0x21,0x7F,0x01,0x00,0x00);	
	/*display 2 */
	time=t;
	output(0x00,0x00,0x23,0x45,0x49,0x31,0x00,0x00);	
	/*display 3 */
	time=t;
	output(0x00,0x00,0x22,0x49,0x49,0x36,0x00,0x00);	
	/*display 4 */
	time=t;
	output(0x00,0x00,0x0C,0x14,0x24,0xFF,0x04,0x00);	
	/*display 5 */
	time=t;
	output(0x00,0x00,0x72,0x51,0x51,0x4E,0x00,0x00);	
	/*display 6 */
	time=t;
	output(0x00,0x00,0x3E,0x49,0x49,0x49,0x06,0x00);	
	/*display 7 */
	time=t;
	output(0x00,0x00,0x40,0x4F,0x70,0x40,0x00,0x00);	
	/*display 8 */
	time=t;
	output(0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00);	
	/*display 9 */
	time=t;
	output(0x00,0x00,0x30,0x49,0x49,0x3E,0x00,0x00);	
	
}
//*******显示字母A~G*******//
void alphabet(void)
{
	t=15;
	/*display A */
	time=t;
	output(0x00,0x00,0x01,0x1F,0x64,0x1F,0x01,0x00);
	/*display B */
	time=t;
	output(0x00,0x00,0x41,0x7F,0x51,0x51,0x2E,0x00);	
	/*display C */
	time=t;
	output(0x00,0x00,0x3E,0x41,0x41,0x41,0x62,0x00);	
	/*display D */
	time=t;
	output(0x00,0x00,0x41,0x7F,0x41,0x41,0x3E,0x00);	
	/*display E */
	time=t;
	output(0x00,0x00,0x41,0x7F,0x49,0x49,0x63,0x00);	
	/*display F */
	time=t;
	output(0x00,0x00,0x41,0x7F,0x49,0x5C,0x60,0x00);	
	/*display G */
	time=t;
	output(0x00,0x00,0x3E,0x41,0x45,0x46,0x04,0x00);	
}
//*******交叉闪烁效果*******//
void chazi(void)
{	
	t=6;
	time=t;
	output(0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81);
	time=t;
	output(0x42,0xA5,0x5A,0x24,0x24,0x5A,0xA5,0x42);	
	time=t;
	output(0x24,0x18,0x81,0x42,0x42,0x81,0x18,0x24);	
	time=t;
	output(0x18,0x00,0x00,0x81,0x81,0x00,0x00,0x18);	
}

//*******回型闪烁效果*******//
void huixing(void)
{	
	t=6;
	time=t;
	output(0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF);
	time=t;
	output(0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00);	
	time=t;
	output(0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00);	
	time=t;
	output(0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00);
	time=t;
	output(0x00,0x00,0x3C,0x24,0x24,0x3C,0x00,0x00);	
	time=t;
	output(0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00);	
}

//********主程序********//
main(void)
{
	//初始设置
	{
//中断初始化
	INTCON=0b00010000;
	// 关总中断
	OPTION=0b00000000;
	ADIF=0;
//	ADIE=1;
	PEIE=1;//?
	GIE=0;
	T0IE=0;
	RBIE=0;

//INT
	INTEDG=1;
	INTF=0;
	INTE=1;

//	RBPU=0;//

//A/D初始化
	ADCON1=0X01;
	// Vref=RA3,其它口均为模拟量输入.
	ADCON0=0X01;
	// AD时钟源ADCS1:ADCS0=00=Fosc/2;CHS2:CHS0=000=RA0/AN1,选RA0为当前A/D通道;ADON=1,AD ON.

//IO口初始化
	TRISA=0X3F;
	//PORA全为输入口.
	TRISC=0X00;
	PORTC=0X00;
	TRISB=0Xf1;	
	
	num=0;
	ADCON0=0X02;

	delay_cnt(20);
	delay_cnt(20);
	CLK=1;
	delay_cnt(20);
	CLK=0;
	CNT=1;
	//变量初始化
	mode=1;

/*******RB INT******/
	GIE=1;//
	}
//主循环
while(1)
{
//PORTC=0X00;
	switch(mode)
		{
		case 1:allstar();break;	
			//全亮
		case 2:heart();break;	
			//心型效果
		case 3:shine();break;
			//屏幕闪烁
		case 4:chazi();break;
			//交叉闪烁
		case 5:huixing();break;
			//回型闪烁
		case 6:number();break;
			//显示数字
		case 7:alphabet();break;
			//显示字母
		};
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -