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

智能推荐

874计算机科学基础综合,2018年四川大学874计算机科学专业基础综合之计算机操作系统考研仿真模拟五套题...-程序员宅基地

文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型

XShell连接失败:Could not connect to '192.168.191.128' (port 22): Connection failed._could not connect to '192.168.17.128' (port 22): c-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.

杰理之KeyPage【篇】_杰理 空白芯片 烧入key文件-程序员宅基地

文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件

一文读懂ChatGPT,满足你对chatGPT的好奇心_引发对chatgpt兴趣的表述-程序员宅基地

文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述

中文字符频率统计python_用Python数据分析方法进行汉字声调频率统计分析-程序员宅基地

文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计

linux输出信息调试信息重定向-程序员宅基地

文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console

随便推点

uniapp 引入iconfont图标库彩色symbol教程_uniapp symbol图标-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标

C、C++ 对于char*和char[]的理解_c++ char*-程序员宅基地

文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*

Sublime Text2 使用教程-程序员宅基地

文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非

对10个整数进行按照从小到大的顺序排序用选择法和冒泡排序_对十个数进行大小排序java-程序员宅基地

文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java

物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)_网络调试助手连接阿里云连不上-程序员宅基地

文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上

<<<零基础C++速成>>>_无c语言基础c++期末速成-程序员宅基地

文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成