#include
__CONFIG(0x3B31);
#defineA0RB0
#defineA1RB1
#defineCSRB2
#defineLERD0
#defineWRRD6
#defineRDRD7
constunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//0-F-全滅-共陽極數(shù)碼管
unsignedchartmp[]={0,0,0,0,0,0,0,0};
voiddelay1ms(unsignedintx)
{
unsignedchari;
for(;x>0;x--)
for(i=0;i<165;i++);
}
voidinit()
{
TRISB=0x00;
PORTB=0x00;
TRISD=0x00;
PORTD=0x00;
LE=0;WR=1;RD=1;//關(guān)373,禁止8255讀寫
}
voidinit_8255()
{
LE=1;A1=1;A0=1;CS=0;//開373,發(fā)送寫控制器命令,CS片選允許
LE=0;//鎖住373,保持A1.A0,CS
PORTB=0x80;//發(fā)送控制命令
WR=0;//打開寫入8255信號
NOP();NOP();
}
voidwrite_data(unsignedcharcomm,unsignedchardata)//comm:0=A,1=B,2=C
{
if(comm==0)
{
WR=1;
LE=1;A1=0;A0=0;CS=0;
LE=0;
PORTB=data;
WR=0;
NOP();NOP();
}
if(comm==1)
{
WR=1;
LE=1;A1=0;A0=1;CS=0;
LE=0;
PORTB=data;
WR=0;
NOP();NOP();
}
if(comm==2)
{
WR=1;
LE=1;A1=1;A0=0;CS=0;
LE=0;
PORTB=data;
WR=0;
NOP();NOP();
}
}
voiddisplay()
{
unsignedchari,LED;
LED=0x01;
for(i=0;i<8;i++)
{
write_data(0,tab[tmp[i]]);
write_data(1,LED);
LED<<=1;
delay1ms(2);
write_data(1,0x00);
}
}
voidmain()
{
unsignedchari,j,RR[24];
init();
init_8255();
while(1)
{
for(i=0;i<24;i++)//全部賦值為16,即顯示為空,此處可精減,但演示用無所謂了
RR[i]=16;
RR[8]=2;RR[9]=0;RR[10]=0;RR[11]=9;RR[12]=0;RR[13]=7;RR[14]=1;RR[15]=2;
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)//將RR[16]開始內(nèi)部賦值tmp[]
tmp[i]=RR[16+i];
for(i=0;i<23;i++)
display();
for(i=23;i>0;i--)//此處將RR[]右移一位數(shù)組
RR[i+1]=RR[i];
}
}
}