📄 ledhex.c
字号:
/****************************************************************************
* File:LEDHEX.C
* 功能:LED数码管显示0-F字符,同时控制LED1、LED2、LED3、LED4显示对应的16进行值。
* 说明:将跳线器JP8、JP9、JP11短接。
****************************************************************************/
#include "config.h"
/* PWM周期及占空比设置值 */
#define CYCLE_DATA 256 //256
#define DUTY_CYCLE_DATA 128 //1
/* 设置 LED 长和宽*/
#define W 32
#define H 16
#define CLK (0x1<<0)
#define STR (0x1<<1)
#define DR (0x1<<2)
#define DG (0x1<<3)
#define THEGPIO 0x000000ff
/*
void turarray(ObjLed,ResLed,aa)
uint32 *ResLed,*ObjLed,aa;
{
uint32 *pt,*qt,k,m,n;
pt=ObjLed;
qt=ResLed;
n=aa;
for(k=0,m=0;k<4;k++,m++)
*(pt+(n+k)) = *(qt+(n+22-2*m));
for(k=4,m=0;k<8;k++,m++)
*(pt+(n+k)) = *(qt+(n+23-2*m));
for(k=8,m=0;k<12;k++,m++)
*(pt+(n+k)) = *(qt+(n+6-2*m));
for(k=12,m=0;k<16;k++,m++)
*(pt+(n+k)) = *(qt+(n+7-2*m));
for(k=16,m=0;k<20;k++,m++)
*(pt+(n+k)) = *(qt+(n+30-2*m));
for(k=20,m=0;k<24;k++,m++)
*(pt+(n+k)) = *(qt+(n+31-2*m));
for(k=24,m=0;k<28;k++,m++)
*(pt+(n+k)) = *(qt+(n+14-2*m));
for(k=28,m=0;k<32;k++,m++)
*(pt+(n+k)) = *(qt+(n+15-2*m));
return;
}
void turarray(ObjLed,ResLed,n)
int ObjLed[],ResLed[],n;
{
int k,m;
for(k=0,m=0;k<4;k++,m++)
ObjLed[k+n] = ResLed[22+n-2*m];
for(k=4,m=0;k<8;k++,m++)
ObjLed[k+n] = ResLed[23+n-2*m];
for(k=8,m=0;k<12;k++,m++)
ObjLed[k+n] = ResLed[6+n-2*m];
for(k=12,m=0;k<16;k++,m++)
ObjLed[k+n] = ResLed[7+n-2*m];
for(k=16,m=0;k<20;k++,m++)
ObjLed[k+n] = ResLed[30+n-2*m];
for(k=20,m=0;k<24;k++,m++)
ObjLed[k+n] = ResLed[31+n-2*m];
for(k=24,m=0;k<28;k++,m++)
ObjLed[k+n] = ResLed[14+n-2*m];
for(k=28,m=0;k<32;k++,m++)
ObjLed[k+n] = ResLed[15+n-2*m];
return;
} */
/****************************************************************************
* 名称:main()
* 功能:控制LED数码管显示,并控制LED1、LED2、LED3、LED4显示。
****************************************************************************/
int main(void)
{
uint32 i,j,kk,k,m,p,q,nn,Temp,TempA,TempB,TempC;
uint32 PTMP,PTMPH,LEDPIN[512],LEDP[512];
static int LedTempA[64], LedTemp[64],LedTempB[64];
static int LedData[64]={
/*中*/ 0x01,0x00,0x01,0x00,0x21,0x08,0x3F,0xFC,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,
0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
/*文*/ 0x02,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x08,0x20,0x08,0x20,0x08,0x20,0x04,0x40,
0x04,0x40,0x02,0x80,0x01,0x00,0x02,0x80,0x04,0x60,0x18,0x1E,0xE0,0x08,0x00,0x00,
/*测*/// 0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
// 0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,
/*试*/// 0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
// 0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00
// 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
// 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
// 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
// 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
// 显示为16*16
PLLCFG = 0x24; //设置60MHz
PLLCON = 0x03;
PLLFEED = 0xaa;
PLLFEED = 0x55;
VPBDIV = 0x01; // 全速(不分频)
PINSEL0 = 0x00080000; // 设置PWM6连接到P0.9管脚
PINSEL1 = 0x00000000; // 设置PWM5连接到P0.21管脚 0x00000400;
PWMPR = 0x00; // 不分频,计数频率为Fpclk
PWMMCR = 0x02; // 设置PWMMR0匹配时复位PWMTC
PWMMR0 = CYCLE_DATA; // 设置PWM周期
PWMMR6 = DUTY_CYCLE_DATA; // 设置PWM占空比
PWMLER = 0x41; // PWMMR0、PWMMR6锁存
PWMPCR = 0x4000; // 允许PWM6输出,单边PWM
PWMTCR = 0x09; // 启动定时器,PWM使
IODIR = THEGPIO; // I/O 端口的方向选择
IOCLR = THEGPIO;
kk = 0;
p = 0;
IOSET = DG;
IOSET = DR;
for(k=0;k<64;k++)
{
LedTempA[k]=0x00;
LedTempB[k] = LedData[k];
}
while(1)
{
for(k=0;k<64;k++)
LedTempB[k] = LedData[k];
for(nn=0;nn<36;nn++)
{
for(kk=0;kk<32;kk+=2) //循环左移
{
TempA=LedTempB[kk]; //0
TempC=TempA;
TempB=LedTempB[kk+1];
Temp=TempA<<0x01;
if((TempB & 0x80)==0x80)
LedTempB[kk] = Temp|0x01;
else LedTempB[kk] = Temp;
TempA=LedTempB[kk+1]; //1
TempB=LedTempB[kk+32];
Temp =TempA << 1;
if((TempB & 0x80) ==0x80)
LedTempB[kk+1] = Temp|0x01;
else LedTempB[kk+1] = Temp;
TempA=LedTempB[kk+32]; //32
TempB=LedTempB[kk+33];
Temp =TempA << 1;
if((TempB & 0x80) ==0x80)
LedTempB[kk+32] = Temp|0x01;
else LedTempB[kk+32] = Temp;
TempA=LedTempB[kk+33]; //33
Temp =TempA << 0x01;
LedTempB[kk+33] = Temp;
TempA=LedTempA[kk+33]; // 移入
TempB=TempA;
Temp =TempA<<0x01;
if((TempC & 0x80)==0x80)
LedTempA[kk+33]=Temp|0x01;
else LedTempA[kk+33]=Temp;
TempA=LedTempA[kk+32];
TempC=TempA;
Temp =TempA << 0x01;
if((TempB & 0x80) ==0x80)
LedTempA[kk+32] = Temp|0x01;
else LedTempA[kk+32] = Temp;
TempA=LedTempA[kk+1];
TempB=TempA;
Temp =TempA << 0x01;
if((TempC & 0x80)==0x80)
LedTempA[kk+1] = Temp|0x01;
else LedTempA[kk+1] = Temp;
TempA=LedTempA[kk];
Temp =TempA << 0x01;
if((TempB & 0x80)==0x80)
LedTempA[kk] = Temp|0x01;
else LedTempA[kk] = Temp;
Temp = TempA = TempB = TempC =0;
}
/*
for(kk=0;kk<32;kk+=2) //循环右移
{
TempA=LedTempB[kk];
TempC=TempA;
Temp=TempA>>0x01;
LedTempB[kk] = Temp;
TempA=LedTempB[kk+1];
TempB=TempA;
Temp =TempA >> 0x01;
if((TempC & 0x01)==1)
LedTempB[kk+1] = Temp|0x80;
else LedTempB[kk+1] = Temp;
TempA=LedTempB[kk+32];
TempC=TempA;
Temp =TempA >> 0x01;
if((TempB & 0x01)==1)
LedTempB[kk+32] = Temp|0x80;
else LedTempB[kk+32] = Temp;
TempA=LedTempB[kk+33];
TempB=TempA;
Temp =TempA >> 0x01;
if((TempC & 0x01)==1)
LedTempB[kk+33] = Temp|0x80;
else LedTempB[kk+33] = Temp;
TempA=LedTempA[kk]; // 移入
TempC=TempA;
Temp =TempA>>0x01;
if((TempB & 0x01)==1)
LedTempA[kk]=Temp|0x80;
else LedTempA[kk]=Temp;
TempA=LedTempA[kk+1];
TempB=TempA;
Temp =TempA >> 0x01;
if((TempC & 0x01)==1)
LedTempA[kk+1] = Temp|0x80;
else LedTempA[kk+1] = Temp;
TempA=LedTempA[kk+32];
TempC=TempA;
Temp =TempA >> 0x01;
if((TempB & 0x01)==1)
LedTempA[kk+32] = Temp|0x80;
else LedTempA[kk+32] = Temp;
TempA=LedTempA[kk+33];
TempB=TempA;
Temp =TempA >> 0x01;
if((TempC & 0x01)==1)
LedTempA[kk+33] = Temp|0x80;
else LedTempA[kk+33] = Temp;
Temp = TempA = TempB = TempC =0;
}
*/
for(k=0,m=0;k<4;k++,m++)
LedTemp[k] = LedTempA[22-2*m];
for(k=4,m=0;k<8;k++,m++)
LedTemp[k] = LedTempA[23-2*m];
for(k=8,m=0;k<12;k++,m++)
LedTemp[k] = LedTempA[6-2*m];
for(k=12,m=0;k<16;k++,m++)
LedTemp[k] = LedTempA[7-2*m];
for(k=16,m=0;k<20;k++,m++)
LedTemp[k] = LedTempA[30-2*m];
for(k=20,m=0;k<24;k++,m++)
LedTemp[k] = LedTempA[31-2*m];
for(k=24,m=0;k<28;k++,m++)
LedTemp[k] = LedTempA[14-2*m];
for(k=28,m=0;k<32;k++,m++)
LedTemp[k] = LedTempA[15-2*m];
for(k=32+0,m=0;k<32+4;k++,m++)
LedTemp[k] = LedTempA[32+22-2*m];
for(k=32+4,m=0;k<32+8;k++,m++)
LedTemp[k] = LedTempA[32+23-2*m];
for(k=32+8,m=0;k<32+12;k++,m++)
LedTemp[k] = LedTempA[32+6-2*m];
for(k=32+12,m=0;k<32+16;k++,m++)
LedTemp[k] = LedTempA[32+7-2*m];
for(k=32+16,m=0;k<32+20;k++,m++)
LedTemp[k] = LedTempA[32+30-2*m];
for(k=32+20,m=0;k<32+24;k++,m++)
LedTemp[k] = LedTempA[32+31-2*m];
for(k=32+24,m=0;k<32+28;k++,m++)
LedTemp[k] = LedTempA[32+14-2*m];
for(k=32+28,m=0;k<32+32;k++,m++)
LedTemp[k] = LedTempA[32+15-2*m];
/*
turarray(LedTemp,LedData,0);
turarray(LedTemp,LedData,32); */
for(kk=0;kk<33;kk+=32)
{
for(i=kk,p=0;i<kk+16;i++) //H i<16 // for(i=k,p=0;i<k+8;i++) //H i<16
{
PTMP = LedTemp[i];
PTMPH = LedTemp[i+16];
if(p>=16)
p = 0;
for(j=0;j<8;j++) //W
{
q=j;
LEDPIN[p] = ((PTMP & (0x1 << q) ) >> q) << 3;
if(LEDPIN[p]== 0x00)
IOSET = DG;
else
IOCLR = DG;
LEDP[p] = ((PTMPH & (0x1 << q) ) >> q) << 2;
if(LEDP[p]== 0x00)
IOSET = DR;
else
IOCLR = DR;
IOSET = CLK;
for(k=0;k<10;k++);
IOCLR = CLK;
p++;
}
}
}
IOSET = STR;
for(k=0;k<10;k++);
IOCLR = STR;
PWMMR6 = 128;
PWMLER = 0x41; // PWMMR0、PWMMR6锁存
PWMPCR = 0x4000; // 允许PWM6输出,单边PWM
PWMTCR = 0x09; // 启动定时器,PWM使
for(k=0;k<4000000;k++);
} //nn++
} //while
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -