这个是无线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”赋值的原因;小弟不才,大恩大德,没齿难忘。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
您知不知道 “ NUM=Byte_read(0x1E00);//读取EEPROM,获取显示汉字的个数” 这段程序的用法?为什么读取地址0x1E00 就能知道显示汉字的个数呢?
一周热门 更多>