利用stm32407單片機驅動兩塊16*32點陣屏,實現中英文顯示及中心對齊、向左移動。led屏為4掃,親測穩定可用。
void hub12DataSerialInput(uint8_t data){
uint8_t i;
for( i = 0; i < 8; i++){
if(data & 0x80){
HIGH_HUB12_DR;
//HIGH_HUB12_DG;
}else{
LOW_HUB12_DR;
//LOW_HUB12_DG;
}
LOW_HUB12_CLK;
HIGH_HUB12_CLK;
data = data << 1;
}
}
void hub12SelectRows(uint8_t rows){
switch(rows){
case 0:
LOW_HUB12_A;
LOW_HUB12_B;
break;
case 1:
HIGH_HUB12_A;
LOW_HUB12_B;
break;
case 2:
LOW_HUB12_A;
HIGH_HUB12_B;
break;
case 3:
HIGH_HUB12_A;
HIGH_HUB12_B;
break;
default:
break;
}
}
//刷新點陣
uint8_t hub12Data[128] = {
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
extern uint8_t hub12TempData[512];
extern uint8_t hub12_dynamic_flag;
//led屏移位模塊
void hub12DataMove(void){
uint16_t i,j;
uint8_t flag_1,flag_2;
if(hub12_dynamic_flag == 1){
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8] & 0x80);
hub12TempData[i*8 + 7 + 128] = (hub12TempData[i*8 + 7 + 128] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1] & 0x80);
hub12TempData[i*8+j] = (hub12TempData[i*8+j] << 1) |(flag_2 >> 0x07);
}
}
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8 + 128] & 0x80);
hub12TempData[i*8 + 7] = (hub12TempData[i*8 + 7] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1 + 128] & 0x80);
hub12TempData[i*8+j + 128] = (hub12TempData[i*8+j + 128] << 1) |(flag_2 >> 0x07);
}
}
}
else if(hub12_dynamic_flag == 2){
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8] & 0x80);
hub12TempData[i*8 + 7 + 256] = (hub12TempData[i*8 + 7 + 256] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1] & 0x80);
hub12TempData[i*8+j] = (hub12TempData[i*8+j] << 1) |(flag_2 >> 0x07);
}
}
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8 + 128] & 0x80);
hub12TempData[i*8 + 7] = (hub12TempData[i*8 + 7] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1 + 128] & 0x80);
hub12TempData[i*8+j + 128] = (hub12TempData[i*8+j + 128] << 1) |(flag_2 >> 0x07);
}
}
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8 + 256] & 0x80);
hub12TempData[i*8 + 7 + 128] = (hub12TempData[i*8 + 7 + 128] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1 + 256] & 0x80);
hub12TempData[i*8+j + 256] = (hub12TempData[i*8+j + 256] << 1) |(flag_2 >> 0x07);
}
}
}
else{
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8] & 0x80);
hub12TempData[i*8 + 7 + 384] = (hub12TempData[i*8 + 7 + 384] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1] & 0x80);
hub12TempData[i*8+j] = (hub12TempData[i*8+j] << 1) |(flag_2 >> 0x07);
}
}
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8 + 128] & 0x80);
hub12TempData[i*8 + 7] = (hub12TempData[i*8 + 7] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1 + 128] & 0x80);
hub12TempData[i*8+j + 128] = (hub12TempData[i*8+j + 128] << 1) |(flag_2 >> 0x07);
}
}
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8 + 256] & 0x80);
hub12TempData[i*8 + 7 + 128] = (hub12TempData[i*8 + 7 + 128] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1 + 256] & 0x80);
hub12TempData[i*8+j + 256] = (hub12TempData[i*8+j + 256] << 1) |(flag_2 >> 0x07);
}
}
for(i = 0;i < 16; i++){
flag_1 = (hub12TempData[i*8 + 384] & 0x80);
hub12TempData[i*8 + 7 + 256] = (hub12TempData[i*8 + 7 + 256] << 1)|(flag_1 >>0x07);
for(j = 0; j < 8 - 1;j++){
flag_2 = (hub12TempData[i*8+j + 1 + 384] & 0x80);
hub12TempData[i*8+j + 384] = (hub12TempData[i*8+j + 384] << 1) |(flag_2 >> 0x07);
}
}
}
memcpy(hub12Data,hub12TempData,sizeof(hub12Data));
}
//led屏驅動顯示模塊
void hub12Display(uint16_t bright){
uint8_t i,s;
for( s = 0; s < 4; s++){ //顯示4行
hub12SelectRows(s);
LOW_HUB12_LAT;
for( i = 0; i < 8; i++){
hub12DataSerialInput(hub12Data[i + 32 * 3 + s * 8]);
hub12DataSerialInput(hub12Data[i + 32 * 2 + s * 8]);
hub12DataSerialInput(hub12Data[i + 32 * 1 + s * 8]);
hub12DataSerialInput(hub12Data[i + 32 * 0 + s * 8]);
if (ETH_CheckFrameReceived())
{
LwIP_Pkt_Handle();
}
}
HIGH_HUB12_LAT;
LOW_HUB12_OE;
Delay_nus(bright);
HIGH_HUB12_OE;
}
}
//確定文字移動速度,防止cpu空轉,采用滴答時鐘延時判斷
void hub12DataMovePrpcess(uint16_t running_period)
{
static uint32_t runningLEDTick = 0;
if (timeout( runningLEDTick, running_period))
{
if(hub12_dynamic_flag != 0){
hub12DataMove();
}
runningLEDTick = local_ticktime();
}
}
/***************主函數調用以下函數即可*****************/
hub12Display(600);
hub12DataMovePrpcess(65);
|