1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > STC单片机74hc164驱动8位数码管动态显示

STC单片机74hc164驱动8位数码管动态显示

时间:2019-08-29 04:51:17

相关推荐

STC单片机74hc164驱动8位数码管动态显示

芯片介绍

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();}}

实际效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。