📄 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 + -