如下搞了一个测试程序,显示怎么也不正确,按理说最后一个字节固定了0xff,应该是屏的最后25-32列全亮,现在反而是4行全亮。还有,如果地址固定一个值(某行),屏反而不显示了
#include "STC8C.h"
sbit ADDR_A =P3^5;
sbit ADDR_B =P3^4;
sbit ADDR_C =P3^3;
sbit ADDR_D =P3^2;
sbit CLK =P4^6;
sbit LAT =P0^7;
sbit OE =P0^6;
sbit R_dat =P0^4;
sbit G_dat =P0^3;
struct FONT_DATA
{
unsigned char dat[32];
};
struct FONT_DATA code Font_Data[] =
{
{
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x02,0x40,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x02,0x40,0x01,0x80,0x00,0x00,0x00,0x00, /*'0',0*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x03,0xE0,0x00,0x00,0x00,0x00, /*'1',1*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x04,0x20,0x04,0x20,0x04,0x20,0x00,0x20,
0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x20,0x07,0xE0,0x00,0x00,0x00,0x00, /*'2',2*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x04,0x20,0x04,0x20,0x00,0x20,0x00,0x40,
0x01,0x80,0x00,0x40,0x00,0x20,0x04,0x20,0x04,0x20,0x03,0xC0,0x00,0x00,0x00,0x00, /*'3',3*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x00,0xC0,0x01,0x40,0x02,0x40,
0x02,0x40,0x04,0x40,0x07,0xF0,0x00,0x40,0x00,0x40,0x01,0xF0,0x00,0x00,0x00,0x00, /*'4',4*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0x80,
0x04,0x40,0x00,0x20,0x00,0x20,0x04,0x20,0x04,0x40,0x03,0x80,0x00,0x00,0x00,0x00, /*'5',5*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x02,0x40,0x04,0x00,0x04,0x00,0x05,0xC0,
0x06,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x02,0x20,0x01,0xC0,0x00,0x00,0x00,0x00, /*'6',6*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x04,0x20,0x00,0x40,0x00,0x40,0x00,0x80,
0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00, /*'7',7*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x04,0x20,0x04,0x20,0x04,0x20,0x02,0x40,
0x01,0x80,0x02,0x40,0x04,0x20,0x04,0x20,0x04,0x20,0x03,0xC0,0x00,0x00,0x00,0x00, /*'8',8*/
},
{
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x60,0x03,0xA0,0x00,0x20,0x00,0x20,0x02,0x40,0x01,0x80,0x00,0x00,0x00,0x00, /*'9',9*/
},
};
unsigned char bdata Address;
sbit Addr_A=Address^0;
sbit Addr_B=Address^1;
sbit Addr_C=Address^2;
sbit Addr_D=Address^3;
void TMR1_Isr() interrupt 3 // 1ms定时
{
unsigned char i,j;
ADDR_A=Addr_A;
ADDR_B=Addr_B;
ADDR_C=Addr_C;
ADDR_D=Addr_D; // 扫描行地址,如果固定为0000或其他值,屏幕什么也显示不出呢,郁闷
OE=1;
j=Address<<1;
ACC=Font_Data[0].dat[j]; // 0,一行中第一个字节,此处是要显示 0 1 ,16*16点阵
for (i=8;i>0;i--)
{
G_dat=ACC&0x80;
R_dat=0;
CLK=0;
CLK=1;
}
j++;
ACC=Font_Data[0].dat[j]; // 0
for (i=8;i>0;i--)
{
G_dat=ACC&0x80;
R_dat=0;
CLK=0;
CLK=1;
}
j=Address<<1;
ACC=Font_Data[1].dat[j]; // 1
for (i=8;i>0;i--)
{
G_dat=ACC&0x80;
R_dat=0;
CLK=0;
CLK=1;
}
j++;
ACC=Font_Data[1].dat[j]; // 1
for (i=8;i>0;i--)
{
// G_dat=ACC&0x80;
G_dat=1;
R_dat=0;
CLK=0;
CLK=1;
}
LAT=0;
LAT=1;
OE=0;
Address++;
Address&=0x0f;
}
void TMR1_Init(void)
{
TR1=0;
TMOD&=0x0f; // 16 bit timer
TH1=0xd1;
TL1=0x20;
AUXR|=0x40;
TR1=1;
ET1=1;
}
void RST_WDT(void)
{
WDT_CONTR=0x3a;
}
void System_Init(void)
{
P_SW2=0x80;
XOSCCR=0xc0; // Ñ¡ÓÃÍⲿ¾§Õñ
while (!(XOSCCR&1));
CLKDIV=0x00;
CKSEL=0x01;
P_SW2=0x00;
P0M1=0x00;P0M0=0xff;
P1M1=0x00;P1M0=0x00;
P2M1=0x00;P2M0=0x00;
P3M1=0x00;P3M0=0x3c;
P4M1=0x00;P4M0=0x40;
P5M1=0x00;P5M0=0x00;
}
main()
{
IE=0;
System_Init();
TMR1_Init();
EA=1;
while (1)
{
RST_WDT();
}
} |