君倾野 发表于 2013-3-23 15:30:04

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

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

1.显示部分的程序


//点阵控制引脚定义
sbit CLK=P3^6;
sbit STB=P3^5;
sbit RED=P3^4;
//点阵显示变量定义
unsigned int G=0;
unsigned int k=0;
unsigned intb=0;
unsigned char n=0,m=0;
unsigned intx=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;                                        //数据缓存区
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==0x53)
                                if(UART_TxRxBuf==0x54)
                                if(UART_TxRxBuf==0x52)
                                {       
                                        while(1)//进入等待状态,开始接受数据       
                                        {
                                                if(UART_Receive_Flag==1)//有数据传来
                                                {        ES = 0;//关闭串口中断
                                                        if(UART_TxRxBuf==0x48)
                                                        if(UART_TxRxBuf==0x45)
                                                        if(UART_TxRxBuf==0x41)
                                                        if(UART_TxRxBuf==0x44)//是帧头"HEAD"
                                                        {       
                                                                if(UART_TxRxBuf==0x01)//是第一帧数据
                                                                {        NUM=UART_TxRxBuf+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);//写入EEPROM中
                                                                }
                               
                                                                NUM=(UART_TxRxBuf-1)*32;//计算存储地址
                                                                for(n=0;n<32;n++)//往EEPROM中写入32字节的数据       
                                                                {        m=UART_TxRxBuf;
                                                                        Byte_program(n+NUM,m);
                                                                }
                                                        }
                                                        UART_Receive_Flag=0;//标志位清零
                                                        UART_Receive_Count=0;//计数清零
                                                        ES = 1;//打开串口中断
                                                        if(UART_TxRxBuf==UART_TxRxBuf) 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 = SBUF;
                        UART_Receive_Count++;
                        RI = 0;
                }
        }               
}
/***************END******************/


求大神和我说下这个程序的主要意思?就是它是怎么运行的,怎么通过无线显示出汉字的,还有那些“SCON = 0x50;               
        PCON = 0x80”赋值的原因;小弟不才,大恩大德,没齿难忘。

君倾野 发表于 2013-3-23 16:13:50

有么有人可以帮帮我啊?谢谢啦

君倾野 发表于 2013-3-23 17:06:42

{:dizzy:}{:dizzy:}{:dizzy:}{:dizzy:}

Tliang 发表于 2013-3-23 17:20:21

打酱油的路过。。。

顺便建议楼主去看看基础的东西,如串口。

君倾野 发表于 2013-3-23 19:49:24

{:cry:}没人帮吗?

tbkmcjl 发表于 2013-3-23 20:09:34

这肯定是毕业设计。。。。。

jxcylxh 发表于 2013-3-23 20:25:04

好好看看寄存器。呵呵。

cyr_hongfeng 发表于 2013-3-23 20:42:06

如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信时要设置的,具体SCON = 0x50 和PCON = 0x80是设置为什么看一下书就可以了,PCON = 0x80应该是波特率倍增。
2、程序主要分为2部分:
一个部分是串口中断接收,只要串口接收到数据就会进入中断处理函数,
UART_TxRxBuf = SBUF;
UART_Receive_Count++;
这两句就是把接收到的数据依次存放到全局数组UART_TxRxBuf[]中。第一部分干的就是这个事。
第二部分就是主函数处理,主函数中首先 NUM=Byte_read(0x1E00);//读取EEPROM,获取显示汉字的个数,
for(G=0;G<NUM-4;G++)应该是一次只能显示4个字,然后调用displayRED();来显示。
最后就是对串口接收到的数据进行处理,把有效的数据存入EEPROM中。
看它的意思,应该是要先接收到0x53 0x54 0x52 这3个字节,然后再接收到0x48 0x45 0x41 0x44后,才是有用数据,从UART_TxRxBuf开始才是要显示的字的字模,一个字需要32个字节,所以要接收32个字节for(n=0;n<32;n++)。

剩下的自己琢磨吧。


电源模块 发表于 2013-3-23 21:07:14

还真有人有耐心看这种东西哦,pfpf

944522464 发表于 2013-3-23 21:27:47

如果是毕业设计又好像显得简单了点

君倾野 发表于 2013-3-24 09:32:21

944522464 发表于 2013-3-23 21:27 static/image/common/back.gif
如果是毕业设计又好像显得简单了点

您能看懂吗?给我说下原理好不好?谢谢啊

君倾野 发表于 2013-3-24 09:37:21

cyr_hongfeng 发表于 2013-3-23 20:42 static/image/common/back.gif
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信 ...

谢谢您的回答,{:cry:} 感激不尽

君倾野 发表于 2013-3-24 09:57:14

cyr_hongfeng 发表于 2013-3-23 20:42 static/image/common/back.gif
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信 ...

您好,请问您知不知道为什么要接收到0x53 0x54 0x52 这3个字节,然后再接收到0x48 0x45 0x41 0x44后,才是有用数据?这6个数据又是怎么来的?

hongli3154 发表于 2013-3-24 10:15:08

君倾野 发表于 2013-3-24 09:57 static/image/common/back.gif
您好,请问您知不知道为什么要接收到0x53 0x54 0x52 这3个字节,然后再接收到0x48 0x45 0x41 0x44后,才 ...

通信协议防止出错和误动作

君倾野 发表于 2013-3-24 10:36:15

hongli3154 发表于 2013-3-24 10:15 static/image/common/back.gif
通信协议防止出错和误动作

这冀个数字可以任意改的吗?还是固定的?

hongli3154 发表于 2013-3-24 10:38:38

君倾野 发表于 2013-3-24 10:36 static/image/common/back.gif
这冀个数字可以任意改的吗?还是固定的?

主机和从几都要用一样的协议,要改的话主从都要改的

君倾野 发表于 2013-3-24 10:57:11

哦哦 大概懂了 谢谢大神哈{:lol:}

君倾野 发表于 2013-3-24 10:59:30

hongli3154 发表于 2013-3-24 10:38 static/image/common/back.gif
主机和从几都要用一样的协议,要改的话主从都要改的

您知不知道“NUM=Byte_read(0x1E00);//读取EEPROM,获取显示汉字的个数”   这段程序的用法?为什么读取地址0x1E00就能知道显示汉字的个数呢?

hongli3154 发表于 2013-3-24 11:07:38

那个是字数在EEPROM中的地址,没认真看程序

hehan 发表于 2013-3-24 11:15:12

还真没耐心看

君倾野 发表于 2013-3-24 11:17:12

hehan 发表于 2013-3-24 11:15 static/image/common/back.gif
还真没耐心看

我知道看起来很烦,大神们有时间就帮帮忙救下小弟吧,好不好

君倾野 发表于 2013-3-24 12:18:02

hongli3154 发表于 2013-3-24 11:07 static/image/common/back.gif
那个是字数在EEPROM中的地址,没认真看程序

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

请问这里注释是不是错了,是不是要改成“工作T1作为定时器,工作在方式2?”

君倾野 发表于 2013-3-24 14:43:53

{:mad:}好烦啊

君倾野 发表于 2013-3-24 19:51:13

看的好累,又看不懂{:mad:}

lijia115003 发表于 2013-3-24 20:09:17

不是自己写的一般不想看

君倾野 发表于 2013-3-25 10:02:04

我又来了好尴尬 没人回{:sad:}

君倾野 发表于 2013-3-25 10:28:41

我可是把希望都放在阿莫大神上面了大神们救救我吧{:cry:}

君倾野 发表于 2013-3-25 19:40:25

{:dizzy:}{:dizzy:}{:dizzy:}

君倾野 发表于 2013-3-26 10:48:41

又是我一个人,,,,,

hongli3154 发表于 2013-3-26 12:20:40

君倾野 发表于 2013-3-26 10:48 static/image/common/back.gif
又是我一个人,,,,,

看我给你的消息
加475061702

cumtgao 发表于 2013-3-26 14:30:46

你这一上来就贴这么长代码,好人被你弄头晕了。

君倾野 发表于 2013-3-27 16:39:30

cumtgao 发表于 2013-3-26 14:30 static/image/common/back.gif
你这一上来就贴这么长代码,好人被你弄头晕了。

尴尬。。。那怎么办

君倾野 发表于 2013-3-28 10:58:11

能看懂一些咯呵呵

男小北 发表于 2013-3-28 11:36:55

程序写的不好

君倾野 发表于 2013-3-28 21:01:45

要好好活着。。。

君倾野 发表于 2013-3-28 21:02:18

加油{:3_59:}

加油——蜗牛 发表于 2013-11-3 09:55:46

这个程序就参考一下,SCON=0x50是01010000对应的SM1为1,10位的UART,可变;对应的REN=1,是启动串口,剩下一个你对照这种方法自己理出来

lans0625 发表于 2013-11-3 10:13:38

{:3_50:}   
页: [1]
查看完整版本: 求大神帮我看下程序,好人一生平安