一、电路图
段选
位选
通过Y6选择八个数码管的一个或多个,再通过Y7进行数码管的显示。
段码:共阳数码管
数字1的显示:
dp=1 g=1 f=1 e=1 d=1 c=0 b=0 a=1(亮为0,灭为1)
1111 1001(二进制)
0xf9(十六进制)
其他类似,段码表为:
duanma[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}
二、实现代码
1.静态显示
例题:实现每一个数码管0-9的显示,再进行所有数码管0-15的显示。
#include "reg52.h"unsigned char code duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//code不会占用内存void Delay(t){while(t--);while(t--);}void selectHC573(unsigned char n){switch(n){case 4:P2=(P2 & 0x1f) | 0x80;break; case 5:P2=(P2 & 0x1f) | 0xa0;break;case 6:P2=(P2 & 0x1f) | 0xc0;break; case 7:P2=(P2 & 0x1f) | 0xe0;break; }}void showSMG_Bit(unsigned char dat,unsigned char pos){selectHC573(6); //数码管位置P0=0x01 << pos;selectHC573(7); //数码管内容P0=dat;}void smg_Static(){unsigned char i,j;for(i=0;i<8;i++){for(j=0;j<10;i++){showSMG_Bit(duanma[j],i);Delay(5000);Delay(5000);}}for(i=0;i<16;i++){selectHC573(6); //数码管位置P0=0xff;selectHC573(7); //数码管内容P0=duanma[i];Delay(5000);Delay(5000);}}void main(){while(1){smg_Static();}}
2.动态显示
例题:使八个数码管同时分别显示1-8。
#include "reg52.h"unsigned char code duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//code不会占用内存void selectHC573(unsigned char channel){switch(channel){case 4:P2=(P2 & 0x1f) | 0x80;break; case 5:P2=(P2 & 0x1f) | 0xa0;break;case 6:P2=(P2 & 0x1f) | 0xc0;break; case 7:P2=(P2 & 0x1f) | 0xe0;break; }}void diaplaysmg_bit(unsigned char value,unsigned char pos){selectHC573(6);P0 = 0x01 << pos;selectHC573(7);P0 = value;}void Delay(unsigned int t){while(t--);}void display(){diaplaysmg_bit(duanma[1],0);Delay(300);diaplaysmg_bit(duanma[2],1);Delay(300);diaplaysmg_bit(duanma[3],2);Delay(300);diaplaysmg_bit(duanma[4],3);Delay(300);diaplaysmg_bit(duanma[5],4);Delay(300);diaplaysmg_bit(duanma[6],5);Delay(300);diaplaysmg_bit(duanma[7],6);Delay(300);diaplaysmg_bit(duanma[8],7);Delay(300); //利用视觉残留的原理,只要切换的够快,在人眼中就是静止的。}void main(){while(1){display();}}