原理
利用循环动态扫描,在人眼中实现视觉暂留,达到显示效果
可以随时改变显示内容
74HC573锁存器
代码(效果:全部点亮且都显示1->2->3->…->A->B->C…)
#include "reg52.h"typedef unsigned char u8;typedef unsigned char u16;u8 i;u8 code smgduan[]={0x3f, 0x06, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //段选字码,存在数组中void delay(u8 z){u8 x,y;for(x=z; x>0; x--){for(y=70; y>0; y--);}}void main(){wela=1;P0=0xea; //先锁一个全部点亮wela=0;while(1){for(i=0;i<16; i++){dula=1; //段选释放P0=smgduan[i];dula=0;delay(1000);}}}
74HC138译码器
需要把管全调为0,消影
#include "reg52.h"typedef unsigned char u8;typedef unsigned char u16;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 code smgduan[]={0x3f, 0x06, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //段选字码,存在数组中void delay(u16 i) //延时函数的定义{while(i--);}void DigDisplay(){u8 i;for(i=0; i<8; i++){switch(i){case (0):LSA=0; LSB=0; LSC=0; break; //0和1参照原理图真值表case (1):LSA=1; LSB=0; LSC=0; break;case (2):LSA=0; LSB=1; LSC=0; break;case (3):LSA=1; LSB=1; LSC=0; break;case (4):LSA=0; LSB=0; LSC=1; break;case (5):LSA=1; LSB=0; LSC=1; break;case (6):LSA=0; LSB=1; LSC=1; break;case (7):LSA=1; LSB=1; LSC=1; break;}P0=smgduan[i]; //通过P0依次输出值,值来自数组delay(10); //延时函数,只要是动态就会用到P0=0x00; //每次循环结束对P0口清零,消影}}void main(){while(1){DigDisplay();}}
制作0~F闪动数码管:
38译码器版
#include "reg52.h"typedef unsigned char u8;typedef unsigned char u16;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段选字码,存在数组中void delay(u8 z){u8 x,y;for(x=z; x>0; x--){for(y=99999999999; y>0; y--);//长点,要不然看不清}}void DigDisplay(){u8 i;for(i=0; i<16; i++){LSA=0; LSB=0; LSC=0; //位选P0=smgduan[i]; //通过P0依次输出值,值来自数组delay(99999999999); //延时函数,只要是动态就会用到P0=0x00; //每次循环结束对P0口清零,消影}}void main(){while(1){DigDisplay();}}
锁存器版(节选)
void display(){wela=1;P0=0xfe; //先锁第一个wela=0;while(1){for(i=0;i<16; i++){dula=1; //段选释放P0=smgduan[i];dula=0;delay(1000);}}
拆分显示一个数
#include "reg52.h"typedef unsigned char u8;typedef unsigned char u16;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 aa,num,bai,shi,ge;u16 temp;u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段选字码,存在数组中void delay(u8 z){u8 x,y;for(x=z; x>0; x--){for(y=70; y>0; y--);//用于动态数码管}}void main(){temp=189;while(1){bai=temp/100;shi=temp%100/10;ge=temp-100*bai-10*shi;LSA=1; LSB=1; LSC=1;P0=smgduan[bai];delay(1050);LSA=0; LSB=1; LSC=1;P0=smgduan[shi];delay(1050);LSA=1; LSB=0; LSC=1;P0=smgduan[ge];delay(1050);P0=0x00;}}
数码管+定时器
