单片机串口通信接收数据转换的问题
用stc89c516单片机开发板的16x16led点阵显示上位机输入的汉字 数字和字母,led屏1s刷屏一次显示下一个字,现在上位机输入字模做好了,显示一个字是发送给单片机128字节的数据,单片机能显示已经编程的字,求怎样编程用单片机串口接收上位机的数据然后生成32个元素的数组,我编程的接收数组是错误的
接收的数据要转换成的数组格式如下:
{
0x08,0x08,0x08,0x38,0xC8,0x08,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x08,0x08,0x00,
0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x40,0x40,0x80,0x80,0x00,
};
串口初始化和中断程序在最后
全部代码如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SE=P3^4;
sbit RCLK=P3^5;
sbit SCLK=P3^6;
uchar leddata[128],num;
void delay(uint j)
{
while(j--);
}
uchar code ledwei[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
};
uchar code ledduan1[]=
{
/*-- 文字: 文 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x08,0x08,0x38,0xC8,0x08,0x09,0x0E,0x08,0x08,0xC8,0x38,0x08,0x08,0x08,0x00,
0x80,0x80,0x40,0x40,0x20,0x11,0x0A,0x04,0x0A,0x11,0x20,0x40,0x40,0x80,0x80,0x00,
};
uchar code ledduan2[]=
{
/*-- 文字: 杰 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x08,0x08,0x88,0x48,0x28,0x18,0xFF,0x18,0x28,0x48,0x88,0x08,0x08,0x00,0x00,
0x82,0x42,0x31,0x00,0x00,0x10,0x60,0x07,0x10,0x60,0x00,0x00,0x11,0xE2,0x02,0x00,
};
uchar code ledduan3[]=
{
/*-- 文字: 你 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x18,0x0F,0x08,0xC8,0x08,0x08,0x28,0x18,0x00,
0x01,0x00,0x00,0xFF,0x00,0x10,0x0C,0x03,0x40,0x80,0x7F,0x00,0x01,0x06,0x18,0x00,
};
uchar code ledduan4[]=
{
/*-- 文字: 好 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,
};
void HC595SendData(uchar BT4,uchar BT3,uchar BT2,uchar BT1)
{
uchar i;
for(i=0;i<8;i++)
{
SE=BT4>>7;
BT4<<=1;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
}
for(i=0;i<8;i++)
{
SE=BT3>>7;
BT3<<=1;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
}
for(i=0;i<8;i++)
{
SE=BT2>>7;
BT2<<=1;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
}
for(i=0;i<8;i++)
{
SE=BT1>>7;
BT1<<=1;
SCLK=0;
_nop_();
_nop_();
SCLK=1;
}
RCLK=0;
_nop_();
_nop_();
RCLK=1;
}
void displaycycle(uchar ledduan[])
{
uint k=0;
uint l=0;
for(l=0;l<100;l++)
{
for(k=0;k<16;k++)
{
HC595SendData(~ledwei[k+16],~ledwei[k],ledduan[16+k],ledduan[k]);
}
delay(100);
}
}
void UsartInit()
{
TMOD=0x20;
TH1=0xF3;
TL1=0xF3;
PCON=0x80;
TR1=1;
SCON=0x50;
ES=1;
EA=1;
}
void main()
{
UsartInit();
displaycycle(leddata);
while(1)
{
displaycycle(ledduan1);
displaycycle(ledduan2);
displaycycle(ledduan3);
displaycycle(ledduan4);
}
}
void Usart() interrupt 4
{
if(RI)
{
RI=0;
leddata[num]=SBUF;
num++;
if(num>=127)
num=0;
}
}