#include<reg52.h>
#include<intrins.h>
sbit DATA2=P1^0;// l数据
sbit CLK2=P1^1; // l时钟移位
sbit CLR2=P1^2; // l复位
sbit DATA1=P0^0; // h数据
sbit CLK1=P0^1; // h时钟移位
sbit CLR1=P0^2; // h复位
sbit lcd1=P2^2;
unsigned char code e[8] ={0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C}; //心
unsigned char code a[8] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,}; //例
void yshi (unsigned int t)
{
unsigned char e;
while(t--)
{
for(e=59;e>0;e--); //一次500us
}
}
void led_send_data(unsigned char cdata) //移位行数据
{
unsigned char i=0x00;
for(i=0;i<8;i++)
{
CLR1=1; CLK1=0;
DATA1=cdata&0x80;
cdata<<=1; _nop_();
CLK1=1; _nop_();
}
CLK1=0;
}
void l_164_l(unsigned char cdata) //移位例数据
{
unsigned char i=0x00;
for(i=0;i<8;i++)
{
CLR2=1; CLK2=0;
DATA2=cdata&0x80; cdata<<=1;
_nop_(); CLK2=1; _nop_();
}
CLK2=0;
}
main()
{
TMOD=0X01; TH0=0XFc; TL0=0X67;
TR0=1; EA=1 ; ET0=1;
while (1);
}
void zd ()interrupt 1 //中断
{
unsigned char w,l;
static unsigned char p;
CLR1=0; //行的 164输出清0;
TH0=0Xf8; TL0=0X44;
led_send_data(0x00); l_164_l(0xff); //行的164输出清0。。例的164输出全为了;正常行为高电平,例为低电平可点亮。
switch (p)
{
case 0: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break; //把 led_send_data(w); l_164_l(l) 颠倒位置可变为上半部串红,下半部正常。
case 1: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break;
case 2: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break;
case 3: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break;
case 4: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break;
case 5: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break;
case 6: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p++;break;
case 7: {w=e[p]; l=a[p]; led_send_data(w); l_164_l(l);} ;p=0;break;
default:break;
}
}
各位老师,我用两个74HC164分别控制8*8点阵屏的行例与纵例,不知为什么有左半边串红,如果把中断case 里led_send_data(w); l_164_l(l) 颠倒位置可变为上半部串红,下半部正常。请老师帮我申看程序,批导指导。。谢谢
|