#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程序是哪兒出問題了。
|