求大神帮我看下程序,好人一生平安
这个是无线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”赋值的原因;小弟不才,大恩大德,没齿难忘。 有么有人可以帮帮我啊?谢谢啦 {:dizzy:}{:dizzy:}{:dizzy:}{:dizzy:} 打酱油的路过。。。
顺便建议楼主去看看基础的东西,如串口。 {:cry:}没人帮吗? 这肯定是毕业设计。。。。。 好好看看寄存器。呵呵。 如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
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++)。
剩下的自己琢磨吧。
还真有人有耐心看这种东西哦,pfpf 如果是毕业设计又好像显得简单了点 944522464 发表于 2013-3-23 21:27 static/image/common/back.gif
如果是毕业设计又好像显得简单了点
您能看懂吗?给我说下原理好不好?谢谢啊 cyr_hongfeng 发表于 2013-3-23 20:42 static/image/common/back.gif
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信 ...
谢谢您的回答,{:cry:} 感激不尽 cyr_hongfeng 发表于 2013-3-23 20:42 static/image/common/back.gif
如果这个程序是拿来学习参考的,建议不要看了,程序写的不好。
1、SCON和PCON都是单片机的寄存器,串口通信 ...
您好,请问您知不知道为什么要接收到0x53 0x54 0x52 这3个字节,然后再接收到0x48 0x45 0x41 0x44后,才是有用数据?这6个数据又是怎么来的? 君倾野 发表于 2013-3-24 09:57 static/image/common/back.gif
您好,请问您知不知道为什么要接收到0x53 0x54 0x52 这3个字节,然后再接收到0x48 0x45 0x41 0x44后,才 ...
通信协议防止出错和误动作 hongli3154 发表于 2013-3-24 10:15 static/image/common/back.gif
通信协议防止出错和误动作
这冀个数字可以任意改的吗?还是固定的? 君倾野 发表于 2013-3-24 10:36 static/image/common/back.gif
这冀个数字可以任意改的吗?还是固定的?
主机和从几都要用一样的协议,要改的话主从都要改的 哦哦 大概懂了 谢谢大神哈{:lol:} hongli3154 发表于 2013-3-24 10:38 static/image/common/back.gif
主机和从几都要用一样的协议,要改的话主从都要改的
您知不知道“NUM=Byte_read(0x1E00);//读取EEPROM,获取显示汉字的个数” 这段程序的用法?为什么读取地址0x1E00就能知道显示汉字的个数呢?
那个是字数在EEPROM中的地址,没认真看程序 还真没耐心看 hehan 发表于 2013-3-24 11:15 static/image/common/back.gif
还真没耐心看
我知道看起来很烦,大神们有时间就帮帮忙救下小弟吧,好不好 hongli3154 发表于 2013-3-24 11:07 static/image/common/back.gif
那个是字数在EEPROM中的地址,没认真看程序
TMOD = 0x20; //工作在mode 1
请问这里注释是不是错了,是不是要改成“工作T1作为定时器,工作在方式2?” {:mad:}好烦啊 看的好累,又看不懂{:mad:} 不是自己写的一般不想看 我又来了好尴尬 没人回{:sad:} 我可是把希望都放在阿莫大神上面了大神们救救我吧{:cry:} {:dizzy:}{:dizzy:}{:dizzy:} 又是我一个人,,,,, 君倾野 发表于 2013-3-26 10:48 static/image/common/back.gif
又是我一个人,,,,,
看我给你的消息
加475061702 你这一上来就贴这么长代码,好人被你弄头晕了。 cumtgao 发表于 2013-3-26 14:30 static/image/common/back.gif
你这一上来就贴这么长代码,好人被你弄头晕了。
尴尬。。。那怎么办 能看懂一些咯呵呵 程序写的不好 要好好活着。。。 加油{:3_59:} 这个程序就参考一下,SCON=0x50是01010000对应的SM1为1,10位的UART,可变;对应的REN=1,是启动串口,剩下一个你对照这种方法自己理出来 {:3_50:}
页:
[1]