矩阵16*64显示附带程序,原理讲解

本程序电路是通过八个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();

}

}

 

}

}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值