74HC1的几点说明:
1.74HC1是串行输入,并行输出的;
2.它的并行输出其实是有延时的,只是延时时间小,可以认为是并行输出;
74hc1封装和真值表:
真值表中文解释说明:
H-高电平 L -低电平 X -任意电平 ↑-低到高电平跳变(上升沿有效)
QA0,QB0,QH0 -规定的稳态条件建立前的电平
QAn,QGn -时钟最近的↑前的电平
看真值表的第三条和第五条:就可以知道,在保持clear为 H clock为↑状态下,AB都为H时,移位寄存器移入H,而当移位寄存器移入L时,必须令B为L,而A不受约束。所以可以把AB断相连再接入单片机数据端口。还有一种是A脚直接接高电平,B脚连入单片机数据端(P2_7)
电路仿真图:
R为clear端, C1/->为clock端,&为A端(1脚)和B端(二角),3~13脚分表为QA~QH,
源程序:
/***74hc1是上升沿有效***/
#include #include #define uchar unsigned char #define uint unsigned int uchar ch; sbit DAT=P2^7;//A,B端接一块后接入DAT sbit CLK=P2^6; char code seg[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff}; /*0~9和全灭状态*/ /*数经过移位寄存器后低位数为高位数,高位数为低位数 如:0000 0011移位以后为1100 0000*/ /*延时一毫秒函数*/ void delay(uint ms) { uchar i; for(;ms!=0;ms--) for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } /***把代码发送到移位寄存器***/ void sendchar(ch) { uchar i; for(i=0;i<8;i++)//8位数据传输完毕后才给数码管显示 { DAT=ch&0x01;//P2_7=0000000x /*DAT一直保持该状态,等时钟脉冲触发传递数值*/ CLK=0;//下面两句制造一个上升沿 CLK=1; /*一个seg[]刚好八位,1是串行输入的,分成八位输入*/ ch>>=1; /*DAT=ch&0x01和ch>>=1的功能是一次取出八位二进制ch的每一位赋值给74hc1*/ } } void main(void) { uint m=0; while(1) { sendchar(seg[m]); if(++m==11) m=0; delay(200); } }