芯片介绍
74HC164、74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平时使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
硬件与电原理图
数码显示模块来自淘宝优信电子的数码管模块(因为自己不想动手pcb布局(狗头保命))
电原理图:
由于74hc164是可以进行多联级的,只需要将第二级的74hc164的AB引脚接到第一级Q8引脚即可实现联级。数据传输方式为第一次传输的8位数据为驱动U2的,第二次传输8位数据为驱动U1。如果有3联级或多联级,以此类推。
顺便提一下:此模块数码管为阳极数码管;
编程步骤
将需要显示的数字进行分为千位,百位,十位,个位>>>发送显示千位数据>>>人为延时>>>将数码管选择第一位数据进行发送>>>人为延时>>>发送显示百位的数据>>>人为延时>>>将数码管选择第二位数据进行发送>>>人为延时>>>发送显示十位的数据>>>人为延时>>>将数码管选择第三位数据进行发送>>>人为延时>>>发送显示个位的数据>>>人为延时>>>将数码管选择第四位数据进行发送>>>循环;
数值显示分位代码
首先需要将数据进行分位,如果不进行分为个位,数码管无法将数值进行显示
void DATA_Part(uint byte){uchar Dat1,Dat2,Dat3,Dat4Dat1=byte/1000; //千位Dat2=byte/100%10; //百位Dat3=byte/10%10; //十位Dat4=byte%10;//个位}
共阳极数码管0-9显示代码
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
共阴极数码管0-9显示代码
uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};
74hc164驱动显示代码
前4位显示驱动代码
sbit DAT1 = P0^1;sbit CP1 = P0^0;void sed_4bit(uint byte){uchar num,c,Dat1,Dat2,Dat3,Dat4,i=0,b=0,d=0;Dat1=byte/1000;Dat2=byte/100%10;Dat3=byte/10%10;Dat4=byte%10;i=0;b=0;d=0;for(b=0;b<4;b++){switch(i){case 0:i=1;num=tab[Dat1];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 1:i=2;num=tab[Dat2];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 2:i=3;num=tab[Dat3];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 3:i=0;num=tab[Dat4];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;default:break;}switch(d){case 0:d=1;num=0x01;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 1:d=2;num=0x02;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 2:d=3;num=0x04;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 3:d=0;num=0x08;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;default:break;}Delay_ms(2);}}
后4位显示驱动代码
void sed_4bit_late(uint byte){uchar num,c,Dat1,Dat2,Dat3,Dat4,i=0,b=0,d=0;Dat1=byte/1000;Dat2=byte/100%10;Dat3=byte/10%10;Dat4=byte%10;i=0;b=0;d=0;for(b=0;b<4;b++){switch(i){case 0:i=1;num=tab[Dat1];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 1:i=2;num=tab[Dat2];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 2:i=3;num=tab[Dat3];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 3:i=0;num=tab[Dat4];for(c=0;c<8;c++) {CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;default:break;}switch(d){case 0:d=1;num=0x10;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 1:d=2;num=0x20;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 2:d=3;num=0x40;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;case 3:d=0;num=0x80;for(c=0;c<8;c++){CP1=0;DAT1=num&0x80;CP1=1;num<<=1;}break;default:break;}Delay_ms(2);}}
主函数显示
void main(){uint i=0;Function();while(1){ sed_4bit(506);Delay500us();sed_4bit_late(442);Delay500us();}}