目录
一,实现方式与原理
二、74HC595芯片
2.1、功能描述
2.2、引脚说明
2.3、功能表
74595 的数据端:
三、代码
点亮第一个
显示数字零
_nop()_函数
一,实现方式与原理
动态扫描实现8*8点阵上显示汉字
二、74HC595芯片
2.1、功能描述
2.2、引脚说明
2.3、功能表
符号说明
74595 的数据端:
三、代码
点亮第一个
#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