单片机串口通信接收数据转换的问题

lee11112 2020-04-07 09:10:57
用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;
}
}
...全文
334 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ba_wang_mao 2020-04-12
  • 打赏
  • 举报
回复
引用 1 楼 m0_37230817 的回复:
你这种上位机传送显示字模数据的方法数据量大,容易受干扰,不如改成上位机只传送显示位置,字符编码由下位机根据字符编码在字库芯片里找字模在规定位置显示,如文字少也可以用字模软件自建字库。


正解。通过通信传输字库点阵确实不是个好方法。

应该通过通信方式传输汉字字符串,单片机接收到后,在单片机的ROM或FLASH 查找字库字模,然后一 一显示即可。这样做程序还通用,自然。
xuyaqi029 2020-04-08
  • 打赏
  • 举报
回复
你这种上位机传送显示字模数据的方法数据量大,容易受干扰,不如改成上位机只传送显示位置,字符编码由下位机根据字符编码在字库芯片里找字模在规定位置显示,如文字少也可以用字模软件自建字库。
m0_37230817 2020-04-08
  • 打赏
  • 举报
回复
你这种上位机传送显示字模数据的方法数据量大,容易受干扰,不如改成上位机只传送显示位置,字符编码由下位机根据字符编码在字库芯片里找字模在规定位置显示,如文字少也可以用字模软件自建字库。

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧