搜索
bottom↓
回复: 37

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

[复制链接]

出0入0汤圆

发表于 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 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”赋值的原因;小弟不才,大恩大德,没齿难忘。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-3-23 16:13:50 | 显示全部楼层
有么有人可以帮帮我啊?谢谢啦

出0入0汤圆

 楼主| 发表于 2013-3-23 17:06:42 | 显示全部楼层

出0入0汤圆

发表于 2013-3-23 17:20:21 | 显示全部楼层
打酱油的路过。。。

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

出0入0汤圆

 楼主| 发表于 2013-3-23 19:49:24 | 显示全部楼层
没人帮吗?

出0入0汤圆

发表于 2013-3-23 20:09:34 | 显示全部楼层
这肯定是毕业设计。。。。。

出0入0汤圆

发表于 2013-3-23 20:25:04 来自手机 | 显示全部楼层
好好看看寄存器。呵呵。

出0入0汤圆

发表于 2013-3-23 20:42:06 | 显示全部楼层
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信时要设置的,具体SCON = 0x50 和PCON = 0x80是设置为什么看一下书就可以了,PCON = 0x80应该是波特率倍增。
2、程序主要分为2部分:
一个部分是串口中断接收,只要串口接收到数据就会进入中断处理函数,
UART_TxRxBuf[UART_Receive_Count] = 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[8]开始才是要显示的字的字模,一个字需要32个字节,所以要接收32个字节for(n=0;n<32;n++)。

剩下的自己琢磨吧。


出0入0汤圆

发表于 2013-3-23 21:07:14 | 显示全部楼层
还真有人有耐心看这种东西哦,pfpf

出0入0汤圆

发表于 2013-3-23 21:27:47 | 显示全部楼层
如果是毕业设计又好像显得简单了点

出0入0汤圆

 楼主| 发表于 2013-3-24 09:32:21 | 显示全部楼层
944522464 发表于 2013-3-23 21:27
如果是毕业设计又好像显得简单了点

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

出0入0汤圆

 楼主| 发表于 2013-3-24 09:37:21 | 显示全部楼层
cyr_hongfeng 发表于 2013-3-23 20:42
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信 ...

谢谢您的回答, 感激不尽

出0入0汤圆

 楼主| 发表于 2013-3-24 09:57:14 | 显示全部楼层
cyr_hongfeng 发表于 2013-3-23 20:42
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信 ...

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

出0入0汤圆

发表于 2013-3-24 10:15:08 | 显示全部楼层
君倾野 发表于 2013-3-24 09:57
您好,请问您知不知道为什么要接收到0x53 0x54 0x52 这3个字节,然后再接收到0x48 0x45 0x41 0x44后,才 ...

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

出0入0汤圆

 楼主| 发表于 2013-3-24 10:36:15 | 显示全部楼层
hongli3154 发表于 2013-3-24 10:15
通信协议防止出错和误动作

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

出0入0汤圆

发表于 2013-3-24 10:38:38 | 显示全部楼层
君倾野 发表于 2013-3-24 10:36
这冀个数字可以任意改的吗?还是固定的?

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

出0入0汤圆

 楼主| 发表于 2013-3-24 10:57:11 | 显示全部楼层
哦哦 大概懂了 谢谢大神哈

出0入0汤圆

 楼主| 发表于 2013-3-24 10:59:30 | 显示全部楼层
hongli3154 发表于 2013-3-24 10:38
主机和从几都要用一样的协议,要改的话主从都要改的

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

出0入0汤圆

发表于 2013-3-24 11:07:38 | 显示全部楼层
那个是字数在EEPROM中的地址,没认真看程序

出0入0汤圆

发表于 2013-3-24 11:15:12 来自手机 | 显示全部楼层
还真没耐心看

出0入0汤圆

 楼主| 发表于 2013-3-24 11:17:12 | 显示全部楼层
hehan 发表于 2013-3-24 11:15
还真没耐心看

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

出0入0汤圆

 楼主| 发表于 2013-3-24 12:18:02 | 显示全部楼层
hongli3154 发表于 2013-3-24 11:07
那个是字数在EEPROM中的地址,没认真看程序

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

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

出0入0汤圆

 楼主| 发表于 2013-3-24 14:43:53 | 显示全部楼层
好烦啊

出0入0汤圆

 楼主| 发表于 2013-3-24 19:51:13 | 显示全部楼层
看的好累,又看不懂

出0入0汤圆

发表于 2013-3-24 20:09:17 | 显示全部楼层
不是自己写的一般不想看

出0入0汤圆

 楼主| 发表于 2013-3-25 10:02:04 | 显示全部楼层
我又来了  好尴尬 没人回

出0入0汤圆

 楼主| 发表于 2013-3-25 10:28:41 | 显示全部楼层
我可是把希望都放在阿莫大神上面了  大神们救救我吧

出0入0汤圆

 楼主| 发表于 2013-3-25 19:40:25 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2013-3-26 10:48:41 | 显示全部楼层
又是我一个人,,,,,

出0入0汤圆

发表于 2013-3-26 12:20:40 | 显示全部楼层
君倾野 发表于 2013-3-26 10:48
又是我一个人,,,,,

看我给你的消息
加475061702

出0入0汤圆

发表于 2013-3-26 14:30:46 | 显示全部楼层
你这一上来就贴这么长代码,好人被你弄头晕了。

出0入0汤圆

 楼主| 发表于 2013-3-27 16:39:30 | 显示全部楼层
cumtgao 发表于 2013-3-26 14:30
你这一上来就贴这么长代码,好人被你弄头晕了。

尴尬。。。那怎么办

出0入0汤圆

 楼主| 发表于 2013-3-28 10:58:11 | 显示全部楼层
能看懂一些咯  呵呵

出0入0汤圆

发表于 2013-3-28 11:36:55 来自手机 | 显示全部楼层
程序写的不好

出0入0汤圆

 楼主| 发表于 2013-3-28 21:01:45 | 显示全部楼层
要好好活着。。。

出0入0汤圆

 楼主| 发表于 2013-3-28 21:02:18 | 显示全部楼层
加油

出0入0汤圆

发表于 2013-11-3 09:55:46 | 显示全部楼层
这个程序就参考一下,SCON=0x50是01010000对应的SM1为1,10位的UART,可变;对应的REN=1,是启动串口,剩下一个你对照这种方法自己理出来

出0入0汤圆

发表于 2013-11-3 10:13:38 | 显示全部楼层
     
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 06:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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