本帖最后由 sujingliang 于 2023-11-25 08:30 编辑
前言
一、上位机程序
- 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[128];
- unsigned char xdata str[64];
-
- 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[32*i+2*k+1]); //左或右半部分
- HC595(~Table_BUFF[32*i+2*k+0]); //左或右半部分
-
- }
-
- 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[FLASH_ADDR_BASE+offset];
- return dat;
- }
-
-
- //连续移位
- void shiftBuff()
- {
- unsigned char i;
- for(i=0;i<96;i++)
- {
- Table_BUFF[i]=Table_BUFF[i+32];
- //Table_BUFF[i-1]=Table_BUFF[i-32];
- }
- 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[i*32+j*2]=Table_BUFF[i*32+j*2+2];
- Table_BUFF[i*32+j*2+1]=Table_BUFF[i*32+j*2+3];
- }
- for(i=0;i<4;i++)
- for(j=16-shiftTime;j<16;j++)
- {
- Table_BUFF[i*32+j*2+1]=0x00;
- Table_BUFF[i*32+j*2]=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[i]=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++;
- }
-
- }
复制代码
|