STC89C52RC驱动 16x64LED点阵模块驱动记录(六)PYTHON上位机串口通信并显示
本帖最后由 sujingliang 于 2023-11-25 08:30 编辑前言上位机为PYTHON程序。
一、上位机程序
import serial
import time
ser = serial.Serial('COM14', 19200)
print('start......')
with open('peom.txt', 'r') as f:
for line in f:
print(line)
ser.write(line.encode('gbk'))#encode,才能发
ser.write(b'\x01')#用\x01做结束符
time.sleep(5)
ser.close()
print('over.')
二、单片机部分
#include <STC89C5xRC.H>
#include <intrins.h>
#include <absacc.h>
#include <string.h>
#define FLASH_ADDR_BASE 0x0000
sbit SH_CP = P1^5;
sbit DS = P2^7;
sbit ST_CP = P1^6;
sbit SST29EE020_CE = P3^4; //SST29EE020,0有效
sbit A17=P3^3; //SST29EE020 的高2位
sbit A16=P3^2; //SST29EE020 的高2位
bit a17,a16;
typedef unsigned int Uint16;
typedef unsigned char Uint8;
unsigned char xdata Table_BUFF;
unsigned char xdata str;
unsigned int pStr=0,pStr1,shiftTime;
int GetGBCode_from_EEPROM(unsigned char* pBuffer,const unsigned char * c);
void prepareBuff();
Uint8 FlashRead(Uint16 offset);
void UART_int(Uint16 baud);
void Senddata(Uint8 dat);
void delayms(unsigned int m)
{
int i,j;
for(i=0; i<m; i++)
for(j=0; j<120; j++);
}
//595就是串行输入,凑足8个并行输出,SH_CP上升沿管串行输入
void HC595(unsigned char dat)
{
unsigned char j;
for(j=0;j<8;j++)
{
SH_CP = 0; //为移位准备
DS = dat & 0x01; //先低位
dat=dat>>1;
SH_CP =1; //上升沿,移位
}
}
//在16x64LED屏上显示4个汉字,下面函数名没改
void Matrix16x16(unsigned char num)
{
unsigned char k,i;
unsigned int m,n;
unsigned char Char_num=1;
//Char_num=4;//m是用来做移字用的,因为目前字是静止的,所以人为设成4,减少循环
for(m=0;m<Char_num;m++)
{
for(n=0;n<32;n++) //为了字不闪
{
for(k=0;k<16;k++) //行扫描
{
for(i=0;i<num;i++) //一行中的左右半部分显示
{
HC595(~Table_BUFF); //左或右半部分
HC595(~Table_BUFF); //左或右半部分
}
ST_CP = 0;
ST_CP = 1; //板上8个595一起,SC_CP上升沿并行输出,凑足8个串行一起并行输入
P1=k; //74HC154(4-16译码器),控制行,只用到P1口低4位,决定74HC154的16输出引脚中哪个是低电平有效
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
P1=0xff; //74HC154输出完,马上关
}
}
}
}
//从FLASH(EEPROM)中读一个汉字的字模32个字节
int GetGBCode_from_EEPROM(unsigned char* pBuffer,const unsigned char * c)
{
unsigned char GBH,GBL,i;
unsigned int pos,temp;
GBH=*c; /* 取高8位数据 */
GBL=*(c+1);/* 取低8位数据 */
temp=((GBH-0xa1)*94+GBL-0xa1);
pos = temp*32 ;
//判断偏移在哪个64k中,决定a17,a16取值。
if (temp<0x800){a17=0;a16=0;}
else if ((temp>=0x800)&&(temp<0x1000)){a17=0;a16=1;}
else if ((temp>=0x1000)&&(temp<0x1800)){a17=1;a16=0;}
else if ((temp>=0x1800)&&(temp<0x2000)){a17=1;a16=1;}
for(i=0;i<32;i++)
{
*pBuffer++=FlashRead(pos++); //循环读32个字节,一个中文字模
}
return 0;
}
//按地址从FLASH(EEPROM)中读一个字节
Uint8 FlashRead(Uint16 offset)
{
Uint8 dat;
A17=a17;
A16=a16;
dat=XBYTE;
return dat;
}
//连续移位
void shiftBuff()
{
unsigned char i;
for(i=0;i<96;i++)
{
Table_BUFF=Table_BUFF;
//Table_BUFF=Table_BUFF;
}
GetGBCode_from_EEPROM(Table_BUFF+96,str+pStr);
pStr=pStr+2;
if(pStr>=strlen(str)) pStr=0;
}
//向上移动
void shiftUpBuff()
{
unsigned char i,j;
shiftTime++;
for(i=0;i<4;i++)
for(j=0;j<16-shiftTime;j++)
{
Table_BUFF=Table_BUFF;
Table_BUFF=Table_BUFF;
}
for(i=0;i<4;i++)
for(j=16-shiftTime;j<16;j++)
{
Table_BUFF=0x00;
Table_BUFF=0x00;
}
if(shiftTime>=16){
shiftTime=0;
prepareBuff();
}
}
//准备显示的buff,4个字的字模
void prepareBuff()
{
unsigned char i;
for(i=0;i<4;i++)
{
GetGBCode_from_EEPROM(Table_BUFF+i*32,str+pStr);
pStr=pStr+2; //pStr指向str中下一个要字符的位置,中文占2个字节,所以加2.
}
if(pStr>=strlen(str)) pStr=0;
}
void main(){
Uint8 i;
UART_int(9600); //这里设的是9600,但是由于6T使能,快了一倍,上位机需要选用19200波特率。
EA =1;
SST29EE020_CE=0; //SST29EE020一直有效
prepareBuff();
pStr1=0;
for(i=0;i<strlen(str);i++)
str=0x00;
while(1){
if(!RI)//串口空闲的时候,把收到的信息显示出来
{
if(*(str+pStr1-1)!=0x01)
{
pStr=0;//pStr是用来记录str的显示起始位置
prepareBuff();
for(i=0;i<10;i++)
{
Matrix16x16(4);
shiftBuff();
}
pStr1=0;//pStr1是用来记录串口输入数据的个数
}
}
}
}
void UART_int(Uint16 baud)
{
TMOD = (TMOD&0X0F)|0X20;
TH1 = 256-11059200/32/12/baud;
TL1 = TH1;
TR1 = 1;
ET1 = 0;
SCON = 0X50;
ES = 1;
}
void Senddata(Uint8 dat)
{
SBUF =dat;
while(TI==0);
TI =0;
}
void UART() interrupt 4
{
if(RI)
{
RI = 0;
*(str+pStr1) = SBUF;//将接收到的数据存入缓冲区中
pStr1++;
}
}
页:
[1]