sujingliang 发表于 2023-11-24 22:01:59

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]
查看完整版本: STC89C52RC驱动 16x64LED点阵模块驱动记录(六)PYTHON上位机串口通信并显示