当前位置: 代码迷 >> 综合 >> STC89C52 8*8点阵 ----自学笔记
  详细解决方案

STC89C52 8*8点阵 ----自学笔记

热度:70   发布时间:2023-12-18 04:21:32.0

目录

一,实现方式与原理

二、74HC595芯片

2.1、功能描述

2.2、引脚说明

2.3、功能表

74595 的数据端:

三、代码

点亮第一个

显示数字零

_nop()_函数


一,实现方式与原理

动态扫描实现8*8点阵上显示汉字

 

二、74HC595芯片

2.1、功能描述

8 位串行输入/输出或者并行输出 移位寄 存器,具有高阻关断状态。三态。
特点
8 位串行输入
8 位串行或并行输出
存储状态寄存器,三种状态
输出寄存器可以直接清除
100MHz 的移位频率
输出能力
并行输出,总线驱动
串行输出;标准 中等规模集成电路
应用
串行到并行的数据转换
Remote control holding register.
描述
595 是硅结构的 CMOS 器件, 兼容低电压 TTL 电路,遵守 JEDEC 标准。
595 是具有 8 位移位寄存器和一个存储器,三态输出功能
移位寄存器和存储器是分别的时钟
数据在 SCHcp 的上升沿输入,在 STcp 的上升沿进入的存储寄存器中去。如
果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一 异步的低电平复位,存储寄存器有一个并行 8 位的,具备三态的总线输出,当 使能 OE 时(为低电平),存储寄存器的数据输出到总线。

2.2、引脚说明

2.3、功能表

符号说明

H=高电平状态    L=低电平状态    ↑=上升沿     ↓=下降沿     Z=高阻    NC=无变化     ×=无效
当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在 STCP 上升沿输出到并行端口。

74595 的数据端:

 

 

 

QA--QH: 八位并行输出端,可以直接控制数码管的 8 个段。
QH': 级联输出端。将它接下一个 595 SI 端。
SI: 串行数据输入端。 74595 的控制端说明:
/SCLR(10 脚): 低点平时将移位寄存器的数据清零。通常接 Vcc
SCK(11 脚 ) 上升沿时数据寄存器 的数据移位。 QA-->QB-->QC-->...-->QH ;下 降沿移位寄存器数据不变。(脉冲宽度:5V 时,大于几十纳秒就行了。)
/RCK(12 ) :上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄 存器数据不变。通常RCK 置为低点平,当移位结束后,在 RCK 端产生一 个正脉冲(5V 时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
/G(13 ): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引 脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。 注:74164 和 74595 功能相仿,都是 8 位串行输入转并行输出移位寄存器。 74164 的驱动电流(25mA) 74595(35mA) 的要小 ,14 脚封装,体积也小一些。
74595 的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以 保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。 与 164 只有数据清零端相比, 595 还多有输出端时能 / 禁止控制端,可以使输出为 高阻态。
74HC595 是具有 8 位 移位寄存器和一个存储器,三态输出功能 。 移位寄存 器和存储器是分别的时钟。数据在 SCHcp 的上升沿输入,在 STcp 的上升沿进入 的存储寄存器中去。如果两个时钟连在一起,则 移位寄存器总是比存储寄存器早 一个脉冲 。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’), 和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具备三态的总线输 出,当使能 OE 时(为低电平),存储寄存器的数据输出到总线。
程序说明:
每当 spi_shcp 上升沿到来时,spi_ds 引脚当前电平值在移位寄存器中左移 一位,在下一个上升沿到来时移位寄存器中的所有位都会向左移一位, 同时 Q7'也会串行输出移位寄存器中高位的值, 这样连续进行 8 次,就可以把数组中每一个数(8 位的数)送到移位寄存器; 然后当 spi_stcp 上升沿到来时,移位寄存器的值将会被锁存到锁存器里, 并从 Q1~7 引脚输出

 

三、代码

点亮第一个


#include<reg51.h>
#include<intrins.h>
sbit srclk=P3^6;
sbit rclk=P3^5;	
sbit ser=P3^4; 
typedef unsigned char u8 ;void hc595sendbyte(u8 dat)//输入dat到595芯片
{u8 a;srclk=0;rclk=0;for(a=0;a<8;a++)         //dat的8位存到移位寄存器里{ser=dat>>7;         //把最高位输入dat<<=1;srclk=1;            //上升沿时,对移位寄存器进行移位(向高位移),下降沿时移位寄存器数据不变    Qa -Qh_nop_();_nop_();             //移位需要时间,调用延时函数srclk=0;}rclk=1;                     //把移位寄存器的数据放到数据存储寄存器_nop_();_nop_();rclk=0;
}
void main()
{while(1){hc595sendbyte(0x80,0x80);P0=0x1f	;p1=0x6f;}}

显示数字零

#include "reg51.h"
#include <intrins.h>	       // 使用函数 如_corl 字符循环左移typedef unsigned int u16;	   //定义数据类型
typedef unsigned char u8;sbit SRCLK =  P3^6;            // [SRCLK:位移寄存器时钟输入]上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V 时,大于几十纳秒就行了。)
sbit RCLK  =  P3^5;	           // [主复位(低电平)]上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄 存器数据不变。通常RCK 置为低点平,当移位结束后,在 RCK 端产生一 个正脉冲(5V 时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
sbit SER   =  P3^4;			   // [串行数据输入]u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay(u16 i)
{
while(i--);
}void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK =0;	      // SRCLK 置0	   低电平
RCLK=0;	          // RCLK  置0     低电平
for(a=0;a<8;a++)
{
SER=dat>>7;	   // 将dat的值复制到一个临时单元,向右移位运算的是临时单元的值,而不是dat,所以移位后, dat的值不变
dat<<=1;       // 左移赋值运算   即dat=dat<<1;,将dat变量左移1位后的值赋给dat,结果会改变dat变量的值dat<<1;的带dat左移1位后的结果,并不会改变dat变量的值
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}void main(){u8 i;while(1){P0=0x7f;                   // 低电平  led灯会亮  0x7f = 0111 1111for(i=0;i<8;i++){P0 = ledwei[i];Hc595SendByte(ledduan[i]);	// 发送断选数据delay(100);			    // 延时10微秒Hc595SendByte(0x00);       // 消隐}					     }}

_nop()_函数

 C语言中没有_nop_()函数。

在51C中一般包含在#include "intrins.h" 头文件中。

该函数是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期,有的指令周期是两个或两个以上的机械周期,但是_nop_();指令需要的只是一个机械周期也就是12个时钟周期(震荡周期)。

51单片机中,1个机械周期 = 12个时钟周期 = 12 * ( 1 / f)。(f 为晶振频率)

如果只用的是12MHZ的晶振,那么 一个机械周期就是1us;也就是说:

_nop_(); 指令的延迟时间为 1us。可以较为精确得控制延迟时间。

nop指令的作用:
1)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。)
2)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟。
3)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复; 
4)清除由上一个算术逻辑指令设置的flag位; 
get链接:https://blog.csdn.net/qq_38374864/article/details/75401876