找回密码
 立即注册
查看: 284|回复: 0

STC89C52RC驱动 16x64LED点阵模块驱动记录(六)PYTHON上位机串口通信并显示

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-07 08:04:39

17

主题

65

回帖

1674

积分

金牌会员

积分
1674
发表于 2023-11-24 22:01:59 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2023-11-25 08:30 编辑

前言

上位机为PYTHON程序。


一、上位机程序
  1. import serial
  2. import time
  3. ser = serial.Serial('COM14', 19200)
  4. print('start......')
  5. with open('peom.txt', 'r') as f:
  6.     for line in f:
  7.         print(line)
  8.         ser.write(line.encode('gbk'))#encode,才能发
  9.         ser.write(b'\x01')#用\x01做结束符
  10.         time.sleep(5)
  11. ser.close()
  12. print('over.')
复制代码
二、单片机部分
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include <string.h>
  5. #define FLASH_ADDR_BASE 0x0000
  6. sbit SH_CP = P1^5;
  7. sbit DS = P2^7;
  8. sbit ST_CP = P1^6;
  9. sbit SST29EE020_CE = P3^4;        //SST29EE020,0有效
  10. sbit A17=P3^3;              //SST29EE020 的高2位
  11. sbit A16=P3^2;              //SST29EE020 的高2位
  12. bit a17,a16;               
  13. typedef unsigned int Uint16;
  14. typedef unsigned char Uint8;
  15. unsigned char xdata Table_BUFF[128];
  16. unsigned char xdata str[64];
  17. unsigned int pStr=0,pStr1,shiftTime;
  18. int GetGBCode_from_EEPROM(unsigned char* pBuffer,const unsigned char * c);
  19. void prepareBuff();
  20. Uint8 FlashRead(Uint16 offset);
  21. void UART_int(Uint16 baud);
  22. void Senddata(Uint8 dat);
  23. void delayms(unsigned int m)
  24. {
  25.         int i,j;
  26.         for(i=0; i<m; i++)
  27.                 for(j=0; j<120; j++);
  28. }
  29. //595就是串行输入,凑足8个并行输出,SH_CP上升沿管串行输入
  30. void HC595(unsigned char dat)
  31. {
  32.         unsigned char j;
  33.         for(j=0;j<8;j++)
  34.         {
  35.                 SH_CP = 0;        //为移位准备
  36.                 DS = dat & 0x01;        //先低位
  37.                 dat=dat>>1;
  38.                 SH_CP =1;          //上升沿,移位
  39.         }
  40. }
  41. //在16x64LED屏上显示4个汉字,下面函数名没改
  42. void Matrix16x16(unsigned char num)
  43. {
  44.         unsigned char k,i;
  45.         unsigned int m,n;
  46.         unsigned char Char_num=1;
  47.         //Char_num=4;//m是用来做移字用的,因为目前字是静止的,所以人为设成4,减少循环
  48.         for(m=0;m<Char_num;m++)
  49.         {
  50.                 for(n=0;n<32;n++)    //为了字不闪
  51.                 {
  52.                         
  53.                         for(k=0;k<16;k++)    //行扫描
  54.                         {
  55.                                 for(i=0;i<num;i++)    //一行中的左右半部分显示
  56.                                 {
  57.                                     HC595(~Table_BUFF[32*i+2*k+1]);                //左或右半部分
  58.                                         HC595(~Table_BUFF[32*i+2*k+0]);                //左或右半部分
  59.                                 }
  60.                                 
  61.                                 ST_CP = 0;
  62.                                 ST_CP = 1; //板上8个595一起,SC_CP上升沿并行输出,凑足8个串行一起并行输入
  63.                                 P1=k;    //74HC154(4-16译码器),控制行,只用到P1口低4位,决定74HC154的16输出引脚中哪个是低电平有效
  64.                                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  65.                                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  66.                                 P1=0xff;    //74HC154输出完,马上关
  67.                         }
  68.                 }
  69.         }
  70. }
  71. //从FLASH(EEPROM)中读一个汉字的字模32个字节
  72. int GetGBCode_from_EEPROM(unsigned char* pBuffer,const unsigned char * c)
  73. {
  74.     unsigned char GBH,GBL,i;
  75.     unsigned int pos,temp;
  76.     GBH=*c;     /* 取高8位数据 */
  77.     GBL=*(c+1);  /* 取低8位数据 */
  78.         temp=((GBH-0xa1)*94+GBL-0xa1);
  79.                
  80.         pos = temp*32 ;
  81.         
  82.     //判断偏移在哪个64k中,决定a17,a16取值。
  83.         if (temp<0x800){a17=0;a16=0;}
  84.         else if ((temp>=0x800)&&(temp<0x1000)){a17=0;a16=1;}
  85.         else if ((temp>=0x1000)&&(temp<0x1800)){a17=1;a16=0;}
  86.         else if ((temp>=0x1800)&&(temp<0x2000)){a17=1;a16=1;}
  87.             
  88.         for(i=0;i<32;i++)
  89.         {
  90.                 *pBuffer++=FlashRead(pos++);        //循环读32个字节,一个中文字模
  91.         }
  92.    return 0;  
  93. }
  94. //按地址从FLASH(EEPROM)中读一个字节
  95. Uint8 FlashRead(Uint16 offset)
  96. {
  97.         Uint8 dat;
  98.         A17=a17;
  99.         A16=a16;
  100.         dat=XBYTE[FLASH_ADDR_BASE+offset];
  101.         return dat;
  102. }
  103. //连续移位
  104. void shiftBuff()
  105. {
  106.         unsigned char i;
  107.         for(i=0;i<96;i++)
  108.         {
  109.                 Table_BUFF[i]=Table_BUFF[i+32];
  110.                 //Table_BUFF[i-1]=Table_BUFF[i-32];
  111.         }
  112.         GetGBCode_from_EEPROM(Table_BUFF+96,str+pStr);
  113.         pStr=pStr+2;
  114.         if(pStr>=strlen(str)) pStr=0;
  115. }
  116. //向上移动
  117. void shiftUpBuff()
  118. {
  119.         unsigned char i,j;
  120.         
  121.         shiftTime++;
  122.         for(i=0;i<4;i++)
  123.         for(j=0;j<16-shiftTime;j++)
  124.         {
  125.                 Table_BUFF[i*32+j*2]=Table_BUFF[i*32+j*2+2];
  126.                 Table_BUFF[i*32+j*2+1]=Table_BUFF[i*32+j*2+3];
  127.         }
  128.         for(i=0;i<4;i++)
  129.         for(j=16-shiftTime;j<16;j++)
  130.         {
  131.                         Table_BUFF[i*32+j*2+1]=0x00;
  132.                         Table_BUFF[i*32+j*2]=0x00;
  133.         }
  134.         if(shiftTime>=16){
  135.                 shiftTime=0;
  136.                 prepareBuff();
  137.         }
  138.         
  139.         
  140. }
  141. //准备显示的buff,4个字的字模
  142. void prepareBuff()
  143. {
  144.         unsigned char i;
  145.         for(i=0;i<4;i++)
  146.         {
  147.                         GetGBCode_from_EEPROM(Table_BUFF+i*32,str+pStr);
  148.                         pStr=pStr+2;    //pStr指向str中下一个要字符的位置,中文占2个字节,所以加2.
  149.         }
  150.         if(pStr>=strlen(str)) pStr=0;
  151. }
  152. void main(){
  153.         Uint8 i;
  154.         UART_int(9600);        //这里设的是9600,但是由于6T使能,快了一倍,上位机需要选用19200波特率。
  155.         EA =1;
  156.         
  157.     SST29EE020_CE=0;        //SST29EE020一直有效
  158.         prepareBuff();
  159.         
  160.         pStr1=0;
  161.         for(i=0;i<strlen(str);i++)
  162.                 str[i]=0x00;
  163.         while(1){
  164.                 if(!RI)//串口空闲的时候,把收到的信息显示出来
  165.                 {
  166.                         if(*(str+pStr1-1)!=0x01)
  167.                         {
  168.                                 pStr=0;//pStr是用来记录str的显示起始位置
  169.                                 prepareBuff();
  170.                                 for(i=0;i<10;i++)
  171.                                 {
  172.                                        
  173.                                         Matrix16x16(4);
  174.                     shiftBuff();
  175.                                 }
  176.                                 pStr1=0;//pStr1是用来记录串口输入数据的个数
  177.                         
  178.                         }
  179.                 }
  180.                
  181.         }
  182. }
  183. void UART_int(Uint16 baud)
  184. {
  185.         TMOD = (TMOD&0X0F)|0X20;
  186.         TH1 = 256-11059200/32/12/baud;
  187.         TL1        = TH1;
  188.         TR1 = 1;
  189.         ET1 = 0;
  190.         SCON = 0X50;
  191.         ES        = 1;
  192. }
  193. void Senddata(Uint8 dat)
  194. {
  195.         SBUF =dat;
  196.         while(TI==0);
  197.         TI =0;
  198.         
  199. }
  200. void UART() interrupt 4
  201. {
  202.         if(RI)
  203.         {         
  204.                         RI = 0;
  205.                         *(str+pStr1) = SBUF;  //将接收到的数据存入缓冲区中
  206.                         pStr1++;
  207.         }
  208. }
复制代码
86818ee28b6b45fcbdb98cb703b489a4.jpg



回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 14:44 , Processed in 0.111172 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表