74HC595驱动点阵屏(24_24)_74hc595上电瞬间引脚有输出-程序员宅基地

技术标签: 74hc595  点阵屏  外围驱动  

项目开发中遇到的问题:

1、上电瞬间点阵屏显示乱码问题:

猜测:由于BK3431Q芯片加电时所有I/O为高电平,加电时可能595上电比BK3431Q快,所以上电被认为是一个正脉冲跳变,结果595内部的寄存器初始值被输出,网上看论坛别人给出的解决方案如下:
1.试试RCK反相后再进595,这样BK3431Q上电时的脉冲反相后成为负的,使595不输出.
2.OE用单片机I/O控制,由于上电时BK3431Q为高电平,所以无输出,然后程序控制595输出.
3.加大C26的值,让595的OE输出比51复位慢.

加粗的是本人采用的解决办法

硬件电路图:

点阵屏是在网上购置的现成的32*32的点阵改的24*24,行低电平灯亮,列高电平灯亮(由于列用到了MOS管反向,实际控制中单片机的相应位送低电平)

由于硬件上的限制,此点阵屏只能列扫描,mos管才能发挥作用,如若用行扫描,led灯显示亮度会很弱

字模取模方式如下图所示:

74hc595Led.c源代码:

#include "gpio.h"
#include "74hc595Led.h"
#include "BK3435_reg.h"
#include "uart.h"
#include "app_task.h" 

#define HC595_SH_CLK    0X13    //74HC595的时钟
#define HC595_DS_DATA   0X33    //74HC595的数据
#define HC595_ST_LATCH  0x12    //74HC595的锁存

#define SCL_HIGH()        gpio_set(HC595_SH_CLK,1)
#define SCL_LOW()         gpio_set(HC595_SH_CLK,0)
#define SDA_HIGH()        gpio_set(HC595_DS_DATA,1)
#define SDA_LOW()         gpio_set(HC595_DS_DATA,0)
#define LATCH_HIGH()      gpio_set(HC595_ST_LATCH,1)
#define LATCH_LOW()       gpio_set(HC595_ST_LATCH,0)

#define SDA_SetInput()	  gpio_config(HC595_DS_DATA,INPUT,PULL_NONE)
#define SDA_SetOutput()   gpio_config(HC595_DS_DATA,OUTPUT,PULL_NONE)
#define SDA_READ()        gpio_get_input(HC595_DS_DATA)

bool StartDelayFlag = 0;   // 1表示延时  0 表示不延时
DisplayTag DisplayTagFlag = NoFlag;
//uint8_t TempBuf[48] = {0};
bool DisplayModeChangeFlag = 0;
DisplayContent DisplayBuf[ARRAY_RANK_NUM] =
{
	{
		RIGHT2LEFT_COLUMN_SCAN_DISPLAY_MODE,
		5,
		0x01,
		#if 1
		{0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xE1,0x8C,0x01,0x23,0x88,0x06,0x25,0x18,0x38,
		0x59,0x10,0x10,0x61,0x10,0x01,0xC2,0x20,0x01,0x82,0x20,0x01,0x00,0x20,0x03,0xFF,
		0xFE,0x01,0xFF,0xFE,0x01,0x00,0x40,0x01,0x01,0x80,0x01,0x06,0x00,0x3F,0xFC,0x00,
		0x3E,0x08,0x00,0x01,0x0C,0x00,0x01,0x07,0x04,0x01,0x03,0x06,0x03,0xFF,0xFE,0x03,
		0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}/*"纳",0*/
		/* (24 X 24 , 宋体 ) */
		#else
		
		{0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/*"未命名文件",0*/
		/* (24 X 24 ) */
		#endif
	},
	{
		DOWN2UP_LINE_SCAN_DISPLAY_MODE,
		5,
		0x1,
		{0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x01,0x00,0x01,0x06,0x00,0x21,0x08,0x00,0x1D,
		0x3F,0xFE,0x09,0xF0,0x00,0x03,0x98,0x00,0x01,0x0E,0x00,0x01,0x00,0x80,0x01,0x10,
		0x80,0x21,0x10,0x80,0x19,0x10,0x80,0x1D,0x10,0x80,0x01,0xFF,0xFE,0x01,0xFF,0xFE,
		0x06,0x10,0x80,0x19,0x10,0x80,0x31,0x10,0x80,0x21,0x30,0x80,0x02,0x11,0x00,0x00,
		0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}/*"祥",0*/
		/* (24 X 24 , 宋体 ) */
	},
	{
		UP2DOWN_LINE_SCAN_DISPLAY_MODE,
		5,
		0x01,
		{0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x40,0x40,0x08,0x41,0x80,0x08,0x46,0x00,0x08,
		0x5C,0x00,0x1F,0xFF,0xFE,0x1F,0xFF,0xFE,0x10,0x48,0x00,0x30,0x8C,0x00,0x10,0x86,
		0x80,0x00,0x00,0x80,0x00,0x20,0x80,0x04,0x10,0x80,0x03,0x1C,0x80,0x03,0x01,0x00,
		0x00,0x01,0x00,0x00,0x01,0x00,0x3F,0xFF,0xFE,0x20,0x01,0x00,0x00,0x02,0x00,0x00,
		0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x00}/*"科",0*/
		/* (24 X 24 , 宋体 ) */	
	},
	{
		LEFT2RIGHT_COLUMN_SCAN_DISPLAY_MODE,
		5,
		0x01,
		{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x01,0x04,0x04,0x01,0x04,0x06,0x7F,
		0xFF,0xFE,0x3F,0xFF,0xFC,0x21,0x08,0x00,0x02,0x10,0x02,0x02,0x10,0x02,0x01,0x10,
		0x02,0x01,0x10,0x04,0x01,0x1C,0x08,0x01,0x13,0x08,0x01,0x10,0xD0,0x3F,0xF0,0x30,
		0x21,0x10,0x70,0x01,0x11,0xC8,0x01,0x17,0x0C,0x01,0x1C,0x04,0x02,0x10,0x06,0x02,
		0x00,0x06,0x00,0x00,0x04,0x00,0x00,0x00}/*"技",0*/
		/* (24 X 24 , 宋体 ) */
	}
};

uint8_t Mould[3];  	    //控制该列的取模值,低电平亮灯,每个模组16行,占2字节   //行
uint8_t upright[3];		//控制某一列,高电平亮灯,每个模组16列,占2字节     //列
uint8_t LED2X64[LED2X64LEN] = {0};		//开辟缓存空间,被定时器随时调用。每列两个字节,多加2个用于移位操作。
uint8_t DisplayTotal =0;      //根据APP 发过来的数据随时改变
uint8_t CharDisplayInd1 = 0;  //记录汉字索引
uint8_t CharDisplayInd2 = 0;  //记录汉字点阵索引
ScanDisplay StartDisplayFlag = NoScan;
uint8_t DelayDisplayNextNUM = 0;
uint8_t DelayDisplayNextNumLimit = 0;

//======================================================================================
//发送数据到595芯片
//======================================================================================
void HC595WriteLineScan(void)				//74HC595发送数据。行用来扫描
{
	uint8_t i,j=1;
	static uint8_t DisplayInd_1 = 0;	
	static uint32_t kkk_1=0x1;				    //用于16行轮流控制  这个初始值决定从哪一行开始扫描

	//Mould[3]=~LED2X64[DisplayInd_1+3];	  //i=0,把缓存的第01号字节发送到第一个模组的最右边的8位。
	Mould[2]=~LED2X64[DisplayInd_1+2];
	Mould[1]=~LED2X64[DisplayInd_1+1];		  //i=0,把缓存的第01号字节发送到第一个模组的最右边的8位。
	Mould[0]=~LED2X64[DisplayInd_1+0];		  //i=0,把缓存的第00号字节发送到第一个模组的最左边的8位。

	//upright[3]=~((kkk_1>>24)&0xff);
	upright[2]=~((kkk_1>>16)&0xff);
	upright[1]=~((kkk_1>>8)&0xff);					//16位变量KKK,取高8位。控制第一个模组的0~7行。
	upright[0]=~(kkk_1&0xff);						//16位变量KKK,取低8位。控制第一个模组的8~15行。

	//循环控制0~16行
	if(kkk_1&0x800000)
	kkk_1 = (kkk_1<<1)|0x01;
	else
	kkk_1 = (kkk_1<<1);
	
	DisplayInd_1+=3;
	DisplayInd_1=DisplayInd_1%72;

	SDA_HIGH();
	SCL_HIGH();
	LATCH_LOW();

	for(i=0;i<8;i++)					//发送给每个模组的 U4 ,低电平整行可以亮,高电平整行全灭。
	{
		SCL_LOW();
		//if (Mould[j*3-3]&0x80)
		if (Mould[j*3-3]&0x01)
			SDA_HIGH();
		else
			SDA_LOW();
		//Mould[j*3-3]<<=1;
		Mould[j*3-3]>>=1;
		SCL_HIGH();
	}
	for(i=0;i<8;i++)					//发送给每个模组的 U3 ,低电平整行可以亮,高电平整行全灭。
	{
		SCL_LOW();
		//if (Mould[j*3-2]&0x80)
		if (Mould[j*3-2]&0x01)
			SDA_HIGH();
		else
			SDA_LOW();
		//Mould[j*3-2]<<=1;
		Mould[j*3-2]>>=1;
		SCL_HIGH();
	}
	for(i=0;i<8;i++)					//发送给每个模组的 U4 ,低电平整行可以亮,高电平整行全灭。
	{
		SCL_LOW();
		//if (Mould[j*3-1]&0x80)
		if (Mould[j*3-1]&0x01)
			SDA_HIGH();
		else
			SDA_LOW();
		//Mould[j*3-1]<<=1;
		Mould[j*3-1]>>=1;
		SCL_HIGH();
	}

	for(i=0;i<8;i++) 					//发送给每个模组的 U2 ,高电平整列可以亮,低电平整列灭。
	{
		SCL_LOW();					    //时钟拉低
		//if(upright[j*3-1]&0x1)         //从最后一个字节开始,先高位后低位。
		if(upright[j*3-1]&0x80) 
			SDA_HIGH();
		else
			SDA_LOW();
		//upright[j*3-1]>>=1;				//字节左移
		upright[j*3-1]<<=1;
		SCL_HIGH();						//时钟上升沿拷贝
	}
	
	for(i=0;i<8;i++)					//发送给每个模组的 U1 ,高电平整列可以亮,低电平整列灭。
	{
		SCL_LOW();
		//if (upright[j*3-2]&0x1)   //先送低位
		if (upright[j*3-2]&0x80)
			SDA_HIGH();
		else
		SDA_LOW();
		//upright[j*3-2]>>=1;
		upright[j*3-2]<<=1;
		SCL_HIGH();	
	}
	for(i=0;i<8;i++) 					//发送给每个模组的 U2 ,高电平整列可以亮,低电平整列灭。
	{
		SCL_LOW();					    //时钟拉低
		//if(upright[j*3-3]&0x1)         //从最后一个字节开始,先高位后低位。
		if(upright[j*3-3]&0x80)
			SDA_HIGH();
		else
			SDA_LOW()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37248709/article/details/81358022

智能推荐

多元线性回归分析(Stata)_stata多元回归-程序员宅基地

文章浏览阅读4.5w次,点赞69次,收藏630次。回归分析的介绍与分类回归分析的任务是:通过研究自变量X和因变量Y的关系,尝试去解释Y的形成机制,进而达到通过X去预测Y的目的三个关键字:相关性、因变量Y、自变量X常见的回归分析有五类(划分的依据是因变量Y的类型): 线性回归:因变量Y为连续性数值变量,例如GDP的增长率 0-1回归:因变量Y为0-1型变量,例如P2P公司研究借款人是否能按时还贷,那么Y可以设计为二值变量,Y=0时代表可以还贷,Y=1时代表不能还贷 定序回归:因变量Y为定序变量,例如1表示不喜欢,2._stata多元回归

mac环境下编译opencv源码 Java 并生成JAR包-程序员宅基地

文章浏览阅读1.2k次。一、准备工作 1、安装ant,并配置环境变量 2、下载CMake,我这边用的是CMAKE GUI 3、下载opencv源码 这是下载地址 二、开始 之前尝试过用brew直接安装ant,均提示404并试过,后面实在没有办法就直接去了这里下载,如图: 下载解压,然后通过【终端】配置..._opencv源码java

有孚网络北京云数据中心荣获绿色建筑国际LEED金牌认证和国家CQC A级机房认证...-程序员宅基地

文章浏览阅读735次。中国IDC圈报道,2018年1月16日,上海有孚网络股份有限公司(以下简称有孚网络)北京永丰E-Data云计算数据中心荣获国家CQC A级机房认证和国内首个国际LEED绿建金牌认证,CQC中国质量认证中心肖处长、美国绿色建筑委员会(USGBC)和绿色事业认证公司(GBCI)总裁兼首席执行官马晗、中国计量科学研究院武主任、有孚网络CEO安柯、有孚网络CS..._cqc 数据中心a级认证

红点中国完成新一期4亿美元基金募集 -程序员宅基地

文章浏览阅读103次。消息,红点创投中国基金(下简称“红点中国”)宣布完成新一期4亿美元基金的募集。其中3亿美元将继续布局TMT行业及其细分领域里优秀的早期项目,约80%以上的资金用于布局A轮及更早阶段的项目。另外1亿美元则是用于加注高潜力高成长的领跑项目。 这是红点中国独立运营两年多以来募集完成的第三支基金。尽管资本环境在过去一段时间内有一些波动,但红点中国团队依然保...

微软必应(Bing)打不开解决方案(2021.12.16)_必应打不开-程序员宅基地

文章浏览阅读3.4w次,点赞10次,收藏18次。问题描述2021.12.16开始必应就打不开了。。解决方案1. 打开主页将原先网址https://cn.bing.com/更换为https://www4.bing.com/2. 更改浏览器默认主页以Chrome为例,打开chrome://settings/onStartup或设置中选择启动时将网址修改为https://www4.bing.com/3. 更改浏览器默认搜索引擎打开网址chrome://settings/searchEngines或设置中选择搜索引擎网址格式添加为htt_必应打不开

机器学习——聚类算法-层次聚类算法-程序员宅基地

文章浏览阅读676次,点赞15次,收藏7次。层次聚类算法是一种无需预先指定簇数的聚类方法,它通过计算样本之间的相似度来构建聚类树,从而得到样本之间的聚类关系。本文介绍了层次聚类算法的原理、步骤以及Python实现的示例代码。通过层次聚类算法,可以对数据集进行探索性分析,发现数据中的内在结构和模式。

随便推点

基于机器学习的多模态检索研究_多模态图像检索算法流程图解-程序员宅基地

文章浏览阅读1k次。近年来,随着深度学习技术的发展,人们对于多模态数据检索的研究和应用越来越受到关注。然而,多模态数据的特点和其间的异质性导致多模态检索面临诸多挑战。本文对基于生成对抗网络的多模态检索方法进行了综述和分析,该方法具有以下特点:通过生成器和判别器编码多样数据并学习它们的共性,在特征提取和多模态匹配两个阶段实现自动化。在特征提取阶段,使用深度学习模型,如卷积神经网络和循环神经网络,提取不同类型数据的特征,并采用多任务学习策略,使提取网络最小化误差并获得低维特征表示。在多模态匹配阶段,通过生成对抗网络将不同类型特征_多模态图像检索算法流程图解

力扣315计算右侧小于当前元素的个数-程序员宅基地

文章浏览阅读71次。代码】力扣315计算右侧小于当前元素的个数。

pyhton object is not subscriptable 解决_polygon' object is not subscriptable-程序员宅基地

文章浏览阅读6.9w次,点赞2次,收藏6次。这是网上的错误例子:dicts = [ {'name': 'Michelangelo', 'food': 'PIZZA'}, {'name': 'Garfield', 'food': 'lasanga'}, {'name': 'Walter', 'food': 'pancakes'}, {'name': 'Galactus', ..._polygon' object is not subscriptable

Linux系统引导.服务与实验-程序员宅基地

文章浏览阅读776次,点赞18次,收藏20次。systemd unit(单元),systemd方便管理程序,将程序按照特定的功能分成很多单元,服务,单元,写配置。一般来说第一启动项是硬盘,找到硬盘后,会根据mbr的指引 找到完整的grub程序,yum以及rpm安装的软件可以直接使用systemctl去启动关闭,重启,开机自启等功能。加电后biso程序会自检硬件,硬件无故障后,会根据第一启动项去找到内核。移动设备,U盘 移动硬盘 ,光驱。检测硬件是否正常,然后根据biso中的启动项设置,去找内核文件。再根据grub的配置文件找到内核文件的具体位置,

在线黑色响应式全屏滚动主页html源码_黑色响应式全屏滚动主页源码-程序员宅基地

文章浏览阅读742次。html5黑色大气的个人博客全屏滚动个人主页源码。直接上传服务器空间就可使用。_黑色响应式全屏滚动主页源码

ubuntu php7 memcache,linux上安装php7 memcache扩展-程序员宅基地

文章浏览阅读89次。php7安装memcache扩展需要memcache php7的分支 否则安装会失败php7的memcache扩展安装,真的很让人心碎!下面则是php7的扩展memcache安装了。用之前的php版本安装是没有问题,但是用了php7安装 http://pecl.php.net/package/memcache 下的任一款memcache都会报错穷尽一切办法之后发现了Github的pecl-m..._ubuntu php7.1 memcache