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

📄 led.c

📁 max7219驱动的led数码管显示程序
💻 C
字号:
#include <pic.h>

void delay_wobble(void);		//声明延时去抖函数
void initMax7219(void);		//声明初始化管理LED显示的max7219;
void SendDataToMax7219(unsigned char RegisterAddress,unsigned char RegisterData);//传送数据给max7219;
void init(void);				//初始化;

main()
{
	int i,j;
	init();
	for(i=100;i>0;i--)
	{
		for(j=100;j>0;j--)
		{
			NOP();
			NOP();
		}
	}
	for(i=1;i<=8;i++)
	{
		SendDataToMax7219(i ,i);//数码管初始化显示均为0
		for(j=10000;j>0;j--)
		{
			NOP();
			NOP();
		}
	}
	while(1);
}

void init()
{
	int i;
	TRISA = 0xFF;	//A口设置为输入
	PORTA = 0x00;	//clrf PORTA
	PORTC = 0x00;	//clrf PORTC
	TRISC = 0x00;	//C口设置为输出
	TRISB = 0x00; 	//B口设置为输出,rb1为控制max7219的脉冲;
	PORTB = 0x00;	//clrf PORTB
	INTCON = 0x00; 	//设置中断;
	T1CON = 0x00; //;timer1 forbidden;clrf T1CON
	RCSTA = 0x00; //clrf RCSTA
	initMax7219(); //初始化7219
	NOP();
	NOP();
	for(i=1;i<=8;i++)
	{
		SendDataToMax7219(i ,0);//数码管初始化显示均为0
	}
}

//max7219的初始化;
void  initMax7219(void)
{
	volatile unsigned char InitRegisterAdress,InitRegisterData;//存储max的寄存器地址和数据的变量;
	InitRegisterAdress = 0x0C; //选中寄存器'SHUTDOWN',其地址为0CH寄存器'SHUTDOWN'赋初值
	InitRegisterData = 0x01; //设为正常显示状态
	SendDataToMax7219(InitRegisterAdress,InitRegisterData);

	InitRegisterAdress = 0x0F; //选中寄存器'DISPLAY TEST',其地址为0FH,寄存器'DISPLAY TEST'赋初值
	InitRegisterData = 0x00; //设为正常显示状态;00
	SendDataToMax7219(InitRegisterAdress,InitRegisterData);
	
	InitRegisterAdress = 0x0B; //选中寄存器'SCAN LIMIT',其地址为0BH,寄存器'SCAN LIMIT'赋初值
	InitRegisterData = 0x07; //点亮0~7四个数码管
	SendDataToMax7219(InitRegisterAdress,InitRegisterData);

	InitRegisterAdress = 0x09; //选中寄存器'DECODE MODE',其地址为09H,寄存器'DECODE MODE'赋初值
 	InitRegisterData = 0xFF; //选B码译码方式NO
	SendDataToMax7219(InitRegisterAdress,InitRegisterData);

	InitRegisterAdress = 0x0A; //选中寄存器'INTENSITY',其地址为0AH,寄存器'INTENSITY'赋初值
 	InitRegisterData = 0x0F; //显示亮度选择最亮(31/32)
	SendDataToMax7219(InitRegisterAdress,InitRegisterData);

    return;
}

//数码管显示函数;
void SendDataToMax7219(unsigned char RegisterAddress ,unsigned char RegisterData)
{   
	int i;
	volatile unsigned char DISP_DIGTMP; //数码管位变量;("地址")
	volatile unsigned char DISP_SEGTMP; //数码管段变量;("数据")
    volatile unsigned char DATA_TMP;
    
	DISP_DIGTMP = RegisterAddress;
    DISP_SEGTMP = RegisterData;
    
	RB1 = 0; //设置max7219,允许其接受数据;BCF PORTB,1
    RC6 = 0; //初始化脉冲电压为低;BCF PORTC,6

//将数据进行右移7次,取出DISP_DIG其中数据;
	for(i=0;i<8;i++)
	{
		DATA_TMP = DISP_DIGTMP&0x80; // 将数据按位进行与操作,以便取出每位数据;
       
  		if(DATA_TMP) 
		{
			RC4 = 1; //如果低位为1,则数据送1;
 		//产生一个上升沿,以便将数据送到max7219;
			RC6 = 1; //脉冲为高电平;
				   ;
				   ;
				   ;
                    //3个空操作,以便形成上升沿;
			RC6 = 0;//脉冲为低电平;
		}
        else
		{
			RC4 = 0; //为0则送数据0;
 		//产生一个上升沿,以便将数据送到max7219;
			RC6 = 1; //脉冲为高电平;
				   ;
				   ;
				   ;
					//3个空操作,以便形成上升沿;
			RC6 = 0;//脉冲为低电平;
		}
		DISP_DIGTMP <<=1 ; //左移1位;
	}


	//将数据进行右移7次,取出DISP_SEG其中数据;
	for(i=0;i<8;i++)
	{
		DATA_TMP = DISP_SEGTMP&0x80; // 将数据按位进行与操作,以便取出每位数据;
       
  		if(DATA_TMP) 
		{
			RC4 = 1; //如果低位为1,则数据送1;
 		//产生一个上升沿,以便将数据送到max7219;
			RC6 = 1; //脉冲为高电平;
				   ;
				   ;
    			   ;
                    //3个空操作,以便形成上升沿;
			RC6 = 0;//脉冲为低电平;
		}
        else
		{
			RC4 = 0; //为0则送数据0;
 		//产生一个上升沿,以便将数据送到max7219;
			RC6 = 1; //脉冲为高电平;
				   ;
				   ;
                   ;
					//3个空操作,以便形成上升沿;
			RC6 = 0;//脉冲为低电平;
		}
		DISP_SEGTMP <<=1 ; //左移1位;
	}
 
    //一次传送数据结束,给max7219一个高电平告诉其数据传送结束;可以进行一次数据显示;
	RB1 = 1;
}

⌨️ 快捷键说明

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