如下方的程序红色部分。我有个疑问,这样子执行的话,不相当于左移了两位吗? 请大神指导,谢谢!
#include
#define uchar unsigned char
uchar i,t,d;
sbit WEI=P2^7;
sbit DUAN=P2^6;
sbit love_clk=P2^4;
sbit love_data=P2^5;
uchar code TAB[]={//0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏
0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xC1,0xFF, //L
0xE3,0xDD,0xDD,0xDD,0xDD,0xDD,0xE3,0xFF, //O
0xDD,0xDD,0xDD,0xDD,0xDD,0xEB,0xF7,0xFF, //V
0xC1,0xFD,0xFD,0xC1,0xFD,0xFD,0xC1,0xFF, //E
0xff,0xc9,0xb6,0xbe,0xdd,0xeb,0xf7,0xff, //心号
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //空屏
};
delay(uchar t)
{
while (t--);
}
void out164(unsigned char k)
{
unsigned char i;
for(i=0;i<8;i++) //因为是1字节是8位,所以循环8次
{
love_data=k&0x80; //将要发送的数据与上0X80(也就是取最高位)送到数据引脚上
love_clk=0; //时钟引脚加低电平,以便下次拉高便可产生上升沿
love_clk=1; //低电平到高电平边沿触发到来,并行数据输出至74hc164的Q0-Q7
k<<=1; //将发送的数据左移1位
}
}
/*void guandz(void)
{
out164(0x00);
}
*/
/* //--让所有led不亮
void guanled(void)
{
P0=0x00; //P0口全送高低平,让所有段都不亮
DUAN=1; //让u1 74hc573处于直通状态,也就是输入0,输出也是0,输入1输出也是1
DUAN=0; //锁存 也就是保持74hc573现在这个时刻的输出状态一直不变
P0=0xFF;
P0=0xFF; //P0口送高电平,也就是关闭所有数码管的位选
WEI=1; //让位选的这个u2 74hc573处于直通状态,也就是输入0,输出也是0,输入1输出也是1
WEI=0; //锁存 也就是保持74hc573现在这个时刻的输出状态一直不变
}
*/
void main()
{
uchar N,T;
P2=0x75;
while(1)
{
for(N=0;N<40;N++) //循环扫描一遍40帧
for(T=0;T<60;T++) //移动速度 以后可做缓冲
{
d=0x01;
//out164(d);
for(i=0;i<8;i++)
{
P0=TAB[i+N];
delay(100);
d=d<<1|d>>7; //
P0=0xff; // 消隐,很重要,不加要红一片
out164(d);
}
}
}
}
|