求大神帮我看下程序,好人一生平安

2020-01-26 12:48发布

  这个是无线led汉字屏设计,程序有些看不懂

1.显示部分的程序


//点阵控制引脚定义
sbit CLK=P3^6;
sbit STB=P3^5;
sbit RED=P3^4;
//点阵显示变量定义
unsigned int G=0;  
unsigned int k=0;
unsigned int  b=0;
unsigned char n=0,m=0;
unsigned int  x=0,y=0;

/**********************************
                   LED点阵显示函数
**********************************/
void displayRED()
{
        unsigned char i,c,temp;
        k=G;       
        x=G*32;

        for(i=0;i<32;i+=2)//行扫描,16行扫描
        {
                b=x+i;//计算读数据的地址
                temp=~Byte_read(b);//从EEPROM中读出将要显示的数据
                temp=temp<<n;
            for(c=n;c<8;c++)//向74HC595传送数据,8-n个位
                   {
                        CLK=0;//CLK拉低
                        temp=temp<<1;//temp移位
                     RED=CY;//RED输出数据
                        CLK=1;//CLK拉高
                }

                temp=~Byte_read(b+1);//从EEPROM中读出将要显示的数据
                temp=temp<<m;
            for(c=m;c<8;c++)//向74HC595传送数据,8-m个位
                   {       
                        CLK=0;//CLK拉低
                        temp=temp<<1;//temp移位
                     RED=CY;//RED输出数据
                        CLK=1;//CLK拉高
                }
///////////////////////////////////
                for(k=G+1;k<G+4;k++)
                {        b=k*32+i;
                        temp=~Byte_read(b);//从EEPROM中读出将要显示的数据
                    for(c=0;c<8;c++)//向74HC595传送数据,1字节
                           {
                                CLK=0;//CLK拉低
                                temp=temp<<1;//temp移位
                             RED=CY;//RED输出数据
                                CLK=1;//CLK拉高
                        }
                        temp=~Byte_read(b+1);//从EEPROM中读出将要显示的数据
                    for(c=0;c<8;c++)//向74HC595传送数据,1字节
                           {
                                CLK=0;//CLK拉低
                                temp=temp<<1;//temp移位
                             RED=CY;//RED输出数据
                                CLK=1;//CLK拉高
                        }
                }
///////////////////////////////////
                k=G+4;       
                b=k*32+i;
                temp=~Byte_read(b);//从EEPROM中读出将要显示的数据
                for(c=0;c<n;c++)//向74HC595传送数据,n个位
                {
                        CLK=0;//CLK拉低
                        temp=temp<<1;//temp移位
                     RED=CY;//RED输出数据
                        CLK=1;//CLK拉高
                }
                temp=~Byte_read(b+1);//从EEPROM中读出将要显示的数据
                for(c=0;c<m;c++)//向74HC595传送数据,m个位
                {
                        CLK=0;//CLK拉低
                        temp=temp<<1;//temp移位
                     RED=CY;//RED输出数据
                        CLK=1;//CLK拉高
                }
//////////////////////////
                P1=i/2;//P1口扫描
                //STB产生一个脉冲,595输出数据
                STB=0;
                STB=1;
        }
}
/***************END******************/



2.           串口点阵程序
**********************************/
#include "STC12C5A60S2.h"
#include "EEPROM.h"
#include "INTRINS.H"
#include "display.c"
#define MOVESPEED        30//每帧显示20遍,修改这里可以改变滚动速度,,d数值越大滚动越慢   
unsigned char UART_Receive_Count = 0;        //串口接收数据计数变量
bit UART_Receive_Flag = 0;                                //串口接收标志位
char UART_TxRxBuf[66];                                        //数据缓存区
unsigned int NUM;                                                //EEPROM中汉字的个数
/**********************************
                   串口初始化函数
**********************************/
void UART_Init(void)
{
        TMOD = 0x20;                //工作在mode 1
        TL1  = 0xFA;                                       
        TH1  = 0xFA;                //波特率19200 (22.1184M)
        SCON = 0x50;               
        PCON = 0x80;               
        TR1  = 1;                        //打开计数器
    ES = 1;                                //打开串口中断
        EA = 1;                                //打开中断允许开关
}

/**********************************
                    主函数
**********************************/
void main()
{
        unsigned char w;
        UART_Init(); //串口初始化
start:
        NUM=Byte_read(0x1E00);//读取EEPROM,获取显示汉字的个数
//主循环
        while(1)
    {
                for(G=0;G<NUM-4;G++)
                {
                        n=0;m=0;
                        for(;n<8;n++)
                                for(w=0;w<MOVESPEED;w++)//修改这里可以改变滚动速度
                                        displayRED();
                        for(;m<8;m++)
                                for(w=0;w<MOVESPEED;w++)//修改这里可以改变滚动速度
                                        displayRED();

                        if(UART_Receive_Flag==1)//串口有数据
                        {
                                ES = 0;//关闭串口中断
                                if(UART_TxRxBuf[0]==0x53)
                                if(UART_TxRxBuf[1]==0x54)
                                if(UART_TxRxBuf[2]==0x52)
                                {       
                                        while(1)//进入等待状态,开始接受数据       
                                        {
                                                if(UART_Receive_Flag==1)//有数据传来
                                                {        ES = 0;//关闭串口中断
                                                        if(UART_TxRxBuf[0]==0x48)
                                                        if(UART_TxRxBuf[1]==0x45)
                                                        if(UART_TxRxBuf[2]==0x41)
                                                        if(UART_TxRxBuf[3]==0x44)//是帧头"HEAD"
                                                        {       
                                                                if(UART_TxRxBuf[6]==0x01)//是第一帧数据
                                                                {        NUM=UART_TxRxBuf[4]+1;//一共有多少汉字
                                                                        Sector_erase(0x0000);//擦除扇区
                                                                        Sector_erase(0x0200);//擦除扇区
                                                                        Sector_erase(0x0400);//擦除扇区
                                                                        Sector_erase(0x0600);//擦除扇区
                                                                        Sector_erase(0x0800);//擦除扇区
                                                                        Sector_erase(0x0A00);//擦除扇区
                                                                        Sector_erase(0x0C00);//擦除扇区
                                                                        Sector_erase(0x0E00);//擦除扇区
                                                                        Sector_erase(0x1000);//擦除扇区
                                                                        Sector_erase(0x1200);//擦除扇区
                                                                        Sector_erase(0x1400);//擦除扇区
                                                                        Sector_erase(0x1600);//擦除扇区
                                                                        Sector_erase(0x1800);//擦除扇区
                                                                        Sector_erase(0x1A00);//擦除扇区
                                                                        Sector_erase(0x1C00);//擦除扇区
                                                                        Sector_erase(0x1E00);//擦除扇区
                                                                        Byte_program(0x1E00,UART_TxRxBuf[4]);//写入EEPROM中
                                                                }
                               
                                                                NUM=(UART_TxRxBuf[6]-1)*32;//计算存储地址
                                                                for(n=0;n<32;n++)//往EEPROM中写入32字节的数据       
                                                                {        m=UART_TxRxBuf[n+8];
                                                                        Byte_program(n+NUM,m);
                                                                }
                                                        }
                                                        UART_Receive_Flag=0;//标志位清零
                                                        UART_Receive_Count=0;//计数清零
                                                        ES = 1;//打开串口中断
                                                        if(UART_TxRxBuf[4]==UART_TxRxBuf[6]) goto start;//跳转
                                                }
                                        }
                                }
                                UART_Receive_Flag=0;//标志位清零
                                UART_Receive_Count=0;//计数清零
                                ES = 1;//打开串口中断
                        }       
            }
   }
}
/**********************************
                   串口中断
**********************************/
void UART_INT() interrupt 4
{        if(RI)
        {        unsigned int count = 0xFFFF;
                while(1)
                {        while(!RI)
                        {        if(count == 0)
                                {        UART_Receive_Flag=1;RI = 0;
                                        UART_Receive_Count=0;return ;
                                }
                                count--;
                        }
                        UART_TxRxBuf[UART_Receive_Count] = SBUF;
                        UART_Receive_Count++;
                        RI = 0;
                }
        }               
}
/***************END******************/


求大神和我说下这个程序的主要意思?就是它是怎么运行的,怎么通过无线显示出汉字的,还有那些“SCON = 0x50;               
        PCON = 0x80”赋值的原因;小弟不才,大恩大德,没齿难忘。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
37条回答
hehan
1楼-- · 2020-01-29 00:18
还真没耐心看
君倾野
2楼-- · 2020-01-29 05:43
 精彩回答 2  元偷偷看……
君倾野
3楼-- · 2020-01-29 11:13
hongli3154 发表于 2013-3-24 11:07
那个是字数在EEPROM中的地址,没认真看程序

TMOD = 0x20;                //工作在mode 1

请问这里注释是不是错了,是不是要改成“工作T1作为定时器,工作在方式2?”
君倾野
4楼-- · 2020-01-29 11:37
好烦啊
君倾野
5楼-- · 2020-01-29 13:13
看的好累,又看不懂
lijia115003
6楼-- · 2020-01-29 15:05
不是自己写的一般不想看

一周热门 更多>