c语言循环移位寄存器,[转载]关于移位寄存器74HC164的使用

移位寄存器74HC164多用于扩展IO口,下面是我使用时的心得:

74HC164的几点说明:

1.74HC164是串行输入,并行输出的;

2.它的并行输出其实是有延时的,只是延时时间小,可以认为是并行输出;

74hc164封装和真值表:

a4c26d1e5885305701be709a3d33442f.png

真值表中文解释说明

H-高电平 L

-低电平 X -任意电平

↑-低到高电平跳变(上升沿有效)

QA0,QB0,QH0 -规定的稳态条件建立前的电平

QAn,QGn -时钟最近的↑前的电平

看真值表的第三条和第五条:就可以知道,在保持clear为 H,

clock为↑状态下,AB都为H时,移位寄存器移入H,而当移位寄存器移入L时,必须令B为L,而A不受约束。所以可以把AB断相连再接入单片机数据端口。还有一种是A脚直接接高电平,B脚连入单片机数据端(P2_7)

时序图:

a4c26d1e5885305701be709a3d33442f.png

1. 首先区分输入输出信号。这里CLEAR、A、B、CLOCK是输入信号,Qa~Qh是输出信号;

2. 拿尺子开始扫描……

2.1.

首先可以看到CLEAR的下降沿后输出全部置低电平。结合后面的一个CLEAR下降沿,可以得出结论:当CLEAR输入下降沿时,无论A、B、CLOCK状态为何,输出全部拉低;

2.2.

尺子向右移动……找到Qa的第一个上升沿,可以看到这个上升沿是与CLOCK的上升沿对齐的,可以得出结论:输出在逻辑上与上升沿同步。此时将会注意到在此之前已经有3个上升沿但输出始终为低电平,尺子移动分别比较这3个上升沿,其A、B输入分别为10、01,于是可以得出结论:Qa

= A · B。

2.3.

尺子继续向右移动……可以分别看出在随后的CLOCK上升沿处,Qa全部按照A与B进行输出,从而验证以上结论。此外Qb~Qh的波形为Qa波形依次移位得到。

使用它的通用驱动C语言源代码:

//在每一个上升沿输出脚SDO状态移一位,CLK为时钟输入脚,CLK为输入脚,

//一般同连一脚,保持相同电平状态,与运算之后仍为该状态

void ind_light_disp(uint ind_num)//点亮哪一位,就置1

{

uint i,j;

i = 0x80;

for(j=0; j<8; j++)

{

if((i&ind_num) == i)

{

CLK = 0; //此处与下面的CLK = 1结合产生一个上升沿

SDO = 0;

CLK = 1;

}

else

{

CLK = 0;

SDO = 1;

CLK = 1;

}

i >>= 1;

}

delay(10000);//此处延时很重要,不延时可能会出现闪烁现象

}

一个使用电路图(点亮一些灯):

a4c26d1e5885305701be709a3d33442f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。首先,74HC164是一个8位移位寄存器,可以实现串行输入并行输出的功能,适合驱动数码管等显示器件。而在51单片机中,我们可以通过串口通信来控制74HC164。 下面是一个简单的代码示例,可以实现通过串口控制74HC164驱动数码管显示数字: ```c #include <reg51.h> // 74HC164控制引脚定义 sbit HC164_CLK = P1^0; sbit HC164_SER = P1^1; sbit HC164_RCLK = P1^2; // 数码管显示码表 unsigned char code LED_Table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 串口初始化 void UART_Init() { TMOD |= 0x20; // 设置定时器1为模式2 TH1 = 0xfd; // 波特率设置为9600 TL1 = 0xfd; TR1 = 1; // 启动定时器1 SCON = 0x50; // 设置串口为模式1 ES = 1; // 允许串口中断 EA = 1; // 允许总中断 } // 串口发送数据 void UART_SendByte(unsigned char dat) { SBUF = dat; while (!TI); // 等待发送完成 TI = 0; // 清除发送完成标志 } // 延时函数 void delay(unsigned int n) { unsigned int i, j; for (i = 0; i < n; i++) { for (j = 0; j < 50; j++); } } // 74HC164移位函数 void HC164_Shift(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { HC164_CLK = 0; HC164_SER = (dat & 0x80) ? 1 : 0; dat <<= 1; HC164_CLK = 1; } } // 74HC164输出函数 void HC164_Output() { HC164_RCLK = 0; HC164_RCLK = 1; } // 主函数 void main() { unsigned char num = 0; UART_Init(); // 初始化串口 while (1) { // 等待串口接收完成 while (!RI); num = SBUF; // 读取串口数据 RI = 0; // 清除接收完成标志 HC164_Shift(LED_Table[num]); // 移位 HC164_Output(); // 输出 } } ``` 在这个代码中,我们将串口通信设置为了9600波特率,当接收到一个字节的数据时,就将其作为数字0~9的索引,查表得到对应的数码管显示码,然后通过HC164移位和输出函数控制74HC164驱动数码管显示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值