想用8个0x11点亮上半个屏幕(16行)每行应该是0001000100010001001....即3个灯灭1个灯亮重复16次
但实际却是1111111111111111111....整个屏幕都在发光
请大神看下代码,出出主意
#include<STC12C5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit IA =P2^0;
sbit IB =P2^1;
sbit IC =P2^2;
sbit ID =P2^3;
#define scan0 {IA=0;IB=0;IC=0;ID=0;}
#define scan1 {IA=1;IB=0;IC=0;ID=0;}
#define scan2 {IA=0;IB=1;IC=0;ID=0;}
#define scan3 {IA=1;IB=1;IC=0;ID=0;}
#define scan4 {IA=0;IB=0;IC=1;ID=0;}
#define scan5 {IA=1;IB=0;IC=1;ID=0;}
#define scan6 {IA=0;IB=1;IC=1;ID=0;}
#define scan7 {IA=1;IB=1;IC=1;ID=0;}
#define scan8 {IA=0;IB=0;IC=0;ID=1;}
#define scan9 {IA=1;IB=0;IC=0;ID=1;}
#define scan10 {IA=0;IB=1;IC=0;ID=1;}
#define scan11 {IA=1;IB=1;IC=0;ID=1;}
#define scan12 {IA=0;IB=0;IC=1;ID=1;}
#define scan13 {IA=1;IB=0;IC=1;ID=1;}
#define scan14 {IA=0;IB=1;IC=1;ID=1;}
#define scan15 {IA=1;IB=1;IC=1;ID=1;}
sbit SH=P2^7;
sbit ST=P2^6;
sbit R1=P1^0;
sbit R2=P1^1;
sbit G1=P1^2;
sbit G2=P1^3;
sbit OE=P2^5;
void scan(unsigned char Value)
{switch(Value)
{case 0: scan0;break;
case 1: scan1;break;
case 2: scan2;break;
case 3: scan3;break;
case 4: scan4;break;
case 5: scan5;break;
case 6: scan6;break;
case 7: scan7;break;
case 8: scan8;break;
case 9: scan9;break;
case 10:scan10;break;
case 11:scan11;break;
case 12:scan12;break;
case 13:scan13;break;
case 14:scan14;break;
case 15:scan15;break;
default:break;
}
}
void WriteR1(unsigned char byte)
{
unsigned int i;
for(i=0;i<8;i++)
{
SH=1;
R1=byte&(0x80>>i);
SH=0;
}
}
void WriteR2(unsigned char byte)
{
unsigned int i;
for(i=0;i<8;i++)
{
SH=1;
R2=byte&(0x80>>i);
SH=0;
}
}
void WriteG1(unsigned char byte)
{
unsigned int i;
for(i=0;i<8;i++)
{
SH=0;
G1=byte&(0x80>>i);
SH=1;
}
}
void WriteG2(unsigned char byte)
{
unsigned int i;
for(i=0;i<8;i++)
{
SH=0;
G2=byte&(0x80>>i);
SH=1;
}
}
void main()
{
while(1)
{
unsigned int i,j;
for(i=0;i<16;i++) //16DDé¨Ãè
{
OE=0;
for(j=0;j<8;j++){
WriteR1(0x11);
WriteR2(0x00);
WriteG1(0x00);
WriteG2(0x00);
}
ST=0;
scan(i);
ST=1;
OE=1;
}
}
}
|