#include<reg51.h>
#include<intrins.h>
#define uchar8 unsigned char
#define uint16 unsigned int
sbit SEG_SELECT=P1^7;
sbit BIT_SELECT=P1^6;
sbit SH595=P1^2;
sbit ST595=P1^1;
sbit DA595=P1^0;
sbit KEY1=P3^4;
sbit KEY2=P3^5;
sbit KEY3=P3^6;
sbit KEY4=P3^7;
uchar8 r[8]={0x00,0x3E,0x2A,0xFF,0xAA,0xBE,0xC0,0x00}; //“电”字图案
uchar8 code c[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //列扫描
uchar8 code Bit_Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选
uchar8 code Disp_Tab[] = {0x5b,0x3f,0x06,0x6f,0x3f,0x6d,0x5b,0x3f}; //段选
void moveup(void) //上移函数
{
uchar8 i;
for(i=0;i<8;i++)
r[i]=_cror_(r[i],1);
}
void moveleft() //左移函数
{
uchar8 i,save;
save=r[0];
for(i=0;i<7;i++)
{
r[i]=r[i+1];
}
r[7]=save;
}
void moveright(void) //右移函数
{
uchar8 i,save;
save=r[7];
for(i=0;i<7;i++)
{
r[7-i]=r[7-1-i];
}
r[0]=save;
}
void movedowan(void) //下移函数
{
uchar8 i;
for(i=0;i<8;i++)
r[i]=_crol_(r[i],1);
}
void Delayms(uint16 ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<4;j++);
}
void closesmg(void) //关闭数码管函数
{
SEG_SELECT=1;P0=0x00;SEG_SELECT=0;
BIT_SELECT=1;P0=0xff;BIT_SELECT=0;
SEG_SELECT=1;P0=0x00;SEG_SELECT=0;
}
void chuan(uchar8 dat) //点阵行寄存与输出函数
{
uchar8 i;
SH595=1;
for(i=0;i<8;i++)
{
if(dat&0x80)
DA595=1;
else
DA595=0;
dat=dat<<1;
SH595=0;
_nop_();_nop_();
SH595=1;
}
ST595=0;
_nop_();_nop_();
ST595=1;
}
void main()
{
while(1)
{
static uchar8 i=0,j,nmode;
static uint16 jtime;
nmode=4;
jtime++;
if(100==jtime)
{
jtime=0;
if(0==KEY1)
nmode=0;
if(0==KEY2)
nmode=1;
if(0==KEY3)
nmode=2;
if(0==KEY4)
nmode=3;
switch(nmode)
{
case 0:moveup();break;
case 1:movedowan();break;
case 2:moveleft();break;
case 3:moveright();break;
}
}
for(j=0;j<8;j++)
{
chuan(0x00);
SEG_SELECT=1;
P0=0x00;
SEG_SELECT=0;
BIT_SELECT=1;
P0=Bit_Tab[j];
BIT_SELECT=0;
P0=0x00;
SEG_SELECT=1;
P0=Disp_Tab[j];
SEG_SELECT=0;
Delayms(1);
}
Delayms(2);
closesmg();
P0=0xff;
chuan(r[i]);
P0=c[i];
Delayms(15);
i++;
if(8==i)
i=0;
}
}
|