本程序电路是通过八个595级联输出控制16个8*8点阵,将八个595的数据接收引脚串联起来,将第一个595的串口接到P3.0,后面每一级的595串口输入引脚都接到前一级的Q7’端,实现级联。将595的移位寄存器控制引脚、储存寄存器引脚并联起来,通过P1.6和P3.1控制,将八个595的Q1到Q7分别接到8*8矩阵的13脚,3脚,4脚,10脚,6脚,11脚,15脚,16脚,并且将上下两个矩阵的13脚,3脚,4脚,10脚,6脚,11脚,15脚,16脚并联起来,输出通过74hc154的4~16位译码器控制位选,将154的16个输出端分为两个8排,一排控制上面八个位扫描,一排控制下面位扫描,电路接法1-9,2-14,3-8,4-12,5-4,6-7,7-2,8-5。9到17脚也是这么接的,本电路将154的g1端接到了P1.7,所以启动的时候要把P1.7拉低,将595的mr接到了P1.5所以我开始将P1.5拉高,八个本电路将将因电路并非本人设计,所以在此就不上传电路图了
/**************************************************************************************
* 16*64点阵的
***************************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit SRCLK=P3^1;
sbit RCLK=P1^6;
sbit SER=P3^0;
sbit _74HC595_MR=P1^5;
sbit _74HC154_G1=P1^7;
bit DataOver;
u8 hu[4][8]={
{0x7F,0x7B,0x77,0x17,0x7E,0x7D,0x7D,0x17},
{0xD7,0xDB,0xD8,0x1B,0xDB,0xFB,0xFB,0xFF},
{0xFF,0x87,0xB7,0xB4,0xB7,0x87,0xB7,0xB4},
{0xB5,0x85,0xB5,0xB4,0xB5,0xBB,0xAB,0xDD},/*"湖",0*/
};
u8 gong[4][8]={
{0xFF,0xFF,0x01,0x7F,0x7F,0x7F,0x7F,0x7F},
{0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0xFF,0xFF},
{0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF},/*"工",0*/
};
u8 dian[4][8]={
{0x7F,0x7F,0x7F,0x03,0x7B,0x7B,0x7B,0x03},
{0x7B,0x7B,0x7B,0x03,0x7B,0x7F,0x7F,0xFF},
{0xFF,0xFF,0xFF,0xE0,0xEF,0xEF,0xEF,0xE0},
{0xEF,0xEF,0xEF,0xE0,0xAF,0xBF,0xBF,0x80},/*"电",0*/
};
u8 xie[4][8]={
{0xFB,0xFB,0xFB,0xFB,0x20,0xFB,0xFB,0xBB},
{0xBB,0xDB,0xEB,0xFB,0x7B,0x7B,0xBB,0xDB},
{0xFE,0xFE,0xFE,0xFE,0xF0,0xF6,0xF6,0xE6},
{0xD6,0xB6,0xB6,0xF6,0xF7,0xF7,0xF5,0xFB},/*"协",0*/
};
u8 jing[4][8]={
{0xF7,0xF7,0x56,0xD5,0xE5,0xF7,0x40,0xF3},
{0xE3,0xD5,0xD5,0xF6,0xF7,0xF7,0xF7,0xF7},
{0xFB,0xFB,0x80,0xFB,0xC0,0xFB,0x80,0xFF},
{0xC0,0xDE,0xC0,0xDE,0xC0,0xDE,0xD6,0xEE},/*"精",0*/
};
u8 xue[4][8]={
{0xBB,0x77,0x77,0xFF,0x01,0xFD,0xFE,0x07},
{0xFF,0x7F,0x00,0x7F,0x7F,0x7F,0x5F,0xBF},
{0xEF,0xEF,0xF7,0xFB,0x80,0xBF,0xDF,0xF8},
{0xFD,0xFE,0x80,0xFF,0xFF,0xFF,0xFF,0xFF},/*"学",0*/
};
u8 ledwei[2][8]={{0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8},/*15-8*/
{0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0},/*7-0*/};
/*******************************************************************************
* 函数名 : Hc595SendByte(u8 dat)
* 函数功能 : 向74HC595发送一个字节的数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)//595先写串口高位
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat&0x01;
dat>>=1;
SRCLK=1;
SRCLK=0;
}
}
void _74HC595_RCLK(void)
{
RCLK=1;
RCLK=0;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i,j,k,m=500;
_74HC595_MR=0;
_74HC154_G1=1;
_nop_();
_74HC595_MR=1;
_74HC154_G1=0;
while(1)
{
while(m--)
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
P1=(P1|0x0f)&*(*(ledwei+j)+i);
Hc595SendByte(*(*(hu+j)+i)); //发送段选数据
Hc595SendByte(*(*(hu+j+2)+i)); //发送段选数据
Hc595SendByte(*(*(gong+j)+i)); //发送段选数据
Hc595SendByte(*(*(gong+j+2)+i)); //发送段选数据
Hc595SendByte(*(*(dian+j)+i)); //发送段选数据
Hc595SendByte(*(*(dian+j+2)+i)); //发送段选数据
Hc595SendByte(*(*(xie+j)+i)); //发送段选数据
Hc595SendByte(*(*(xie+j+2)+i)); //发送段选数据
_74HC595_RCLK();
for(k=0;k<8;k++)
{
Hc595SendByte(0xff); //消隐
}
_74HC595_RCLK();
}
}
m=500;
while(m--)
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
P1=(P1|0x0f)&*(*(ledwei+j)+i);
Hc595SendByte(*(*(jing+j)+i)); //发送段选数据
Hc595SendByte(*(*(jing+j+2)+i)); //发送段选数据
Hc595SendByte(*(*(gong+j)+i)); //发送段选数据
Hc595SendByte(*(*(gong+j+2)+i)); //发送段选数据
Hc595SendByte(*(*(dian+j)+i)); //发送段选数据
Hc595SendByte(*(*(dian+j+2)+i)); //发送段选数据
Hc595SendByte(*(*(xue+j)+i)); //发送段选数据
Hc595SendByte(*(*(xue+j+2)+i)); //发送段选数据
_74HC595_RCLK();
for(k=0;k<8;k++)
{
Hc595SendByte(0xff); //消隐
}
_74HC595_RCLK();
}
}
}
}