#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
sbit DIN=P1^7; //MAX7219 DIN串行数据输入端
sbit CLK=P1^6; //MAX7219 CLK 时钟线
sbit LD=P1^5; //MAX7219 LOAD片选端
sbit RET_813=P3^2; //813 的6脚
void timer_ms(u8 tim)
{
u8 i;
while(tim--)
{
for(i=0;i<200;i++); //延时1ms
}
}
void w_max7219(u8 addr,u8 wdata)
{
u8 j;
u8 i;
u8 temp;
i=2;
LD=0;
while(i<16)
{
if(i<8)
{
temp=addr; //先写入MAX7219内部寄存器地址,再向内部寄存器写入操作数值
}
else
{
temp=wdata;
}
for(j=0;j<8;j++)
{
CLK=0;
if(temp&0x80)
{
DIN=1; //先发送数据的最高位
}
else
{
DIN=0;
}
_nop_();
CLK=1;
_nop_();
temp<<=1;
}
i=i+8;
}
LD=1;
}
void init_max7219()
{
w_max7219(0x0c,0x01); //操作方式,0x00为低功耗模式,0x01为正常操作模式
w_max7219(0x0f,0x00); //显示状态,0x00为正常显示,0x01为显示测试
w_max7219(0x0b,0x07); //8位扫描显示,取值范围0x01~0x07
w_max7219(0x09,0x00); //译码方式,0x00为不译码
w_max7219(0x0a,0x07); //显示亮度,取值范围0~f
timer_ms(2);
}
void main()
{
u16 m;
init_max7219();
while(1)
{
// w_max7219(0X01,0X0F);
// w_max7219(0X02,0X0E);
// w_max7219(0X03,0X0D);
// w_max7219(0X04,0X0C);
// w_max7219(0X05,0X10);
// w_max7219(0X06,0X50);
// w_max7219(0X07,0XA0);
//w_max7219(0X08,0XF0);
m++;
if(m>15000)
{
m=0;
RET_813=!RET_813; //看门狗工作指示灯
}
}
}
这个程序是用MAX219控制LED发光二极管,现在出现问题,
只要main函数中注释掉的w_max7219(0X01,0X0F); 这种函数 如果不注释,看门狗的工作指示灯就不亮了,也就是程序死循环了
当注释后,再编译,看门狗正常闪烁,程序正常走, 所以请大侠帮忙看下这个7219程序是哪儿出问题了。
|