27,374
社区成员
发帖
与我相关
我的任务
分享
#include <REG52.H>
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr AUXR = 0x8e;
sfr WDT_CONTR = 0xc1;
//sbit CLR_WDT = WDT_CONTR^4;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P01=P0^1;
unsigned char DispBuf[]={0,0,0,0};
unsigned char DispTemp1[4],DispTemp2[4];
unsigned int ChangeTM;
unsigned char i,j;
bit C_Flag;
#define WDT_EN WDT_CONTR=0x55
#define CLR_WDT WDT_CONTR|=0x10
#define D1_2 1/2
#define D3_4 3/2
#define D5_6 5/2
#define D7_8 7/2
#define D9_10 9/2
#define D11_12 11/2
#define D13_14 13/2
#define D15_16 15/2
#define D17_18 17/2
#define D19_20 19/2
#define D21_22 21/2
#define D23_24 23/2
#define D25_26 25/2
#define D27_28 27/2
#define D29_30 29/2
#define D31_32 31/2
#define D33_34 33/2
#define D35_36 35/2
#define D37_38 37/2
#define D39_40 39/2
#define D41_42 41/2
#define D43_44 43/2
#define D45_46 45/2
#define D47_48 47/2
#define D49_50 49/2
//======================================================
// 延时函数(MS)
//======================================================
void DelayXms(unsigned char n) //@12.000MHz
{
unsigned char i, j;
while(n)
{
CLR_WDT;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
n--;
}
}
//======================================================
// LED底层输出
//======================================================
void LEDDrive()
{
P25=DispBuf[0]&0x01;
P24=DispBuf[0]&0x02;
P23=DispBuf[0]&0x04;
P22=DispBuf[0]&0x08;
P21=DispBuf[0]&0x10;
P20=DispBuf[0]&0x20;
P37=DispBuf[0]&0x40;
P36=DispBuf[0]&0x80;
P35=DispBuf[1]&0x01;
P34=DispBuf[1]&0x02;
P33=DispBuf[1]&0x04;
P32=DispBuf[1]&0x08;
P31=DispBuf[1]&0x10;
P30=DispBuf[1]&0x20;
P01=DispBuf[1]&0x40;
P17=DispBuf[1]&0x80;
P16=DispBuf[2]&0x01;
P15=DispBuf[2]&0x02;
P14=DispBuf[2]&0x04;
P13=DispBuf[2]&0x08;
P12=DispBuf[2]&0x10;
P11=DispBuf[2]&0x20;
P10=DispBuf[2]&0x40;
P27=DispBuf[2]&0x80;
P26=DispBuf[3]&0x01;
}
//======================================================
// 带进位数据左移
//======================================================
unsigned char RLC(unsigned char Temp)
{
unsigned int V_Temp;
V_Temp = Temp;
V_Temp<<=1;
if(C_Flag)V_Temp|=0x01;
C_Flag=V_Temp&0x0100;
return V_Temp&0xff;
}
//======================================================
// 带进位数据右移
//======================================================
unsigned char RRC(unsigned char Temp)
{
unsigned int V_Temp;
V_Temp = (unsigned int)Temp<<7;
if(C_Flag)V_Temp|=0x8000;
C_Flag=V_Temp&0x0080;
return V_Temp>>8;
}
//======================================================
// 点亮所有LED灯
//======================================================
void LedAllOn(unsigned int xms)
{
DispBuf[0]=0xff;
DispBuf[1]=0xff;
DispBuf[2]=0xff;
DispBuf[3]=0xff;
LEDDrive();
DelayXms(xms);
}
//======================================================
// 关闭所有LED灯
//======================================================
void LedAllOff(unsigned int xms)
{
DispBuf[0]=0x00;
DispBuf[1]=0x00;
DispBuf[2]=0x00;
DispBuf[3]=0x00;
LEDDrive();
DelayXms(xms);
}
//======================================================
// 关闭所有LED灯
//======================================================
void LedAllOffA(unsigned int xms)
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
DelayXms(xms);
}
//======================================================
// 模式0:全部灯闪烁
//======================================================
void DisplayMode0(void)
{
LedAllOn(250);
LedAllOff(250);
LedAllOn(250);
LedAllOff(250);
LedAllOn(250);
LedAllOn(250);
LedAllOff(250);
}
//======================================================
// 模式1:双灯加速流动,最后快速流动20圈
//======================================================
void DisplayMode1(void)
{
LedAllOff(0);
i=100;
while(i)
{
for(j=0;j<25;j++)
{
DispBuf[j>>3] |= 0x01<<(j&0x07);
LEDDrive();
DelayXms(i);
i--;
DispBuf[j>>3] = 0x00;
if(i==0)break;
}
}
for(i=0;i<3;i++)
{
for(j=0;j<25;j++)
{
DispBuf[j>>3] |= 0x01<<(j&0x07);
LEDDrive();
DelayXms(1);
DispBuf[j>>3] = 0x00;
}
}
}
//======================================================
// 模式2:双灯灭
//======================================================
void DisplayMode2(void)
{
LedAllOn(200);
for(j=0;j<25;j++)
{
DispBuf[j>>3] &= ~(0x01<<(j&0x07));
LEDDrive();
DelayXms(30);
DispBuf[j>>3] = 0xff;
}
for(j=0;j<25;j++)
{
DispBuf[(24-j)>>3] &= ~(0x01<<((24-j)&0x07));
LEDDrive();
DelayXms(30);
DispBuf[(24-j)>>3] = 0xff;
}
}
//======================================================
// 模式3:依次灭灯(顺时针)
//======================================================
void DisplayMode3(void)
{
LedAllOff(0);
LedAllOn(1);
for(j=0;j<25;j++)
{
DispBuf[j>>3] &= ~(0x01<<(j&0x07));
LEDDrive();
DelayXms(60);
}
}
//======================================================
// 模式4:依次亮灯(逆时针)
//======================================================
void DisplayMode4(void)
{
LedAllOff(1);
for(j=0;j<25;j++)
{
DispBuf[(24-j)>>3] |= 0x01<<((24-j)&0x07);
LEDDrive();
DelayXms(60);
}
}
//======================================================
// 模式5:间隔点亮
//======================================================
void DisplayMode5(void)
{
for(j=0;j<4;j++)
{
DispBuf[0]=0x55;
DispBuf[1]=0x55;
DispBuf[2]=0x55;
DispBuf[3]=0x55;
LEDDrive();
DelayXms(150);
DispBuf[0]=0xaa;
DispBuf[1]=0xaa;
DispBuf[2]=0xaa;
DispBuf[3]=0xaa;
LEDDrive();
DelayXms(150);
}
}