接收端代码:仅显示发送字母"H"。
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
#define LEDDZ_COL_PORT P0 //点阵列控制端口
//定义74HC595控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit LCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
u8 h_row[8]={0x00,0x7E,0x10,0x10,0x10,0x10,0x7E,0x00};//LED点阵显示H的行数据
u8 h_col[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//LED点阵显示H的列数据
/***************延时函数*********************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/********** 初始化串口设置************************/
void UART_init()
{
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 0xFD; // 波特率9600,晶振11.0592MHz
TL1 = 0xFD;
SCON = 0x50;
TR1 = 1; // 启动定时器1
// 串口中断使能
}
/*******向74HC595写入一个字节的数据************/
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{
SER=dat>>7;//优先传输一个字节中的高位
dat<<=1;//将低位移动到高位
SRCLK=0; //移位寄
delay_10us(1);
SRCLK=1;
delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
LCLK=1;
delay_10us(1);
LCLK=0;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}
/************ 接收数据********************/
void UART_receive()
{
u8 i=0;
u8 j;
while(RI==0); //等待接收完成
j=SBUF;
RI=0;
while (1) {
if(j=='1'){
for(i=0;i<8;i++)//循环8次扫描8行、列
{
LEDDZ_COL_PORT=h_col[i];//传送列选数据
hc595_write_data(h_row[i]);//传送行选数据
delay_10us(100);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
}
}
void main()
{
UART_init();
while(1)
{
UART_receive();
}
}