赞
踩
所谓静态显示,就是每一个数码管的段码都要独占具有锁存功能的输出口,CPU把要显示的字码送到输出口上,就可以使 数码管显示 对应的字符,直到下一次送出另一个字码之前,显示的内容一直不会消失。
一、数码管简介
二、.静态数码管显示原理
三、代码
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极 COM 接到+5V 共阴数码管是指将所有发光二板管的阴板接到一起形成公共阴 极(COM) 的数 码管,共阴数码管在应用时应将公共极 COM 接到地线 GND上。
共阳极是指数码管内部LED的正极接在一起,想要点亮LED,拉低相应的负极即可。 共阴极是指数码管内部LED的负极接在一起,想要点亮LED,拉高相应的正极即可。其编码是让数码管显示数字时,对应的IO输出的高低电平。顺序为:dp, g ,f ,e, d, c, b, a。欲使其亮,共阴极时,阴极应送低电平;共阳极时,阳极应送高电平。
多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)
注:因为共阳极数码管,所以位选接的是高电平,要想正常显示通过控制低电平来控制段选即可。
数码管硬件电路原理图:
以下是八段数码管0-9显示代码表:
共阳极字形码:0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e
共阴极字形码:0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71。
本实验采取的是共阴极的数码管静态显示,8位数码管从左到右显示为“20231221”。
字位码是位选,就是用公共端控制让8个数码管的哪一个数码管显示数字。
- #include "regx52.h"
- #include "intrins.h"
-
-
-
- //延时函数
- void Delay1_ms(unsigned int a) //@11.0592MHz
- {
- unsigned char i, j;
- for(a;a>0;a--)
- {
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- }
-
- // 0 1 2 3 4 5 6 7 8 9
- unsigned char meg_code[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
-
- //定义数码管引脚
- sbit HC_Y0 = P2^2;
- sbit HC_Y1 = P2^3;
- sbit HC_Y2 = P2^4;
-
- void SMG_Select(unsigned char n)
- {
- switch(n)
- {
- case 1:
- HC_Y0 = 0;//低位
- HC_Y1 = 0;
- HC_Y2 = 0;
- break;
-
- case 2:
- HC_Y0 = 1;//高位
- HC_Y1 = 0;
- HC_Y2 = 0;
- break;
-
- case 3:
- HC_Y0 = 0;
- HC_Y1 = 1;
- HC_Y2 = 0;
- break;
-
- case 4:
- HC_Y0 = 1;
- HC_Y1 = 1;
- HC_Y2 = 0;
- break;
-
- case 5:
- HC_Y0 = 0;
- HC_Y1 = 0;
- HC_Y2 = 1;
- break;
-
- case 6:
- HC_Y0 = 1;
- HC_Y1 = 0;
- HC_Y2 = 1;
- break;
-
- case 7:
- HC_Y0 = 0;
- HC_Y1 = 1;
- HC_Y2 = 1;
- break;
-
- case 8:
- HC_Y0 = 1;
- HC_Y1 = 1;
- HC_Y2 = 1;
- break;
- }
- }
-
- void Show_Num(long num)
- {
- //第一种诸位显示
- char sn = 0;
- SMG_Select(1);
- num = num/10; //12345/10=0
- sn = num%10;
- P0 = meg_code[sn]; //数组第一位数据赋值给数码管段选口
- Delay1_ms(3);
- num = num/10; //12345/10=1234
-
- SMG_Select(2);
- sn = num%10;
- P0 = meg_code[sn]; //12345%10=4
- Delay1_ms(3);
- num = num/10; //12345/10=123
-
- SMG_Select(3);
- sn = num%10;
- P0 = meg_code[sn]; //12345%10=3
- Delay1_ms(3);
- num = num/10; //12345/10=12
-
- SMG_Select(4);
- sn = num%10;
- P0 = meg_code[sn]; //12345%10=2
- Delay1_ms(3);
- num = num/10; //12345/10=1
-
- SMG_Select(5);
- sn = num%10;
- P0 = meg_code[sn]; //12345%10=1
- Delay1_ms(3);
-
- //第二种使用for循环
- char i =0;
- for(i=1;i<=8;i++) //8位数码管循环8次
- {
- SMG_Select(i); //第一位数码管
- P0 = meg_code[num%10]; //取出传入参数的个位数的值
- Delay1_ms(1);
- P0 = 0x00; //消影
- num = num/10; //取完个位数之后除以10,去掉当前个位数
- if(num<=0)
- break;
- }
- }
-
- void main()
- {
-
- while(1)
- {
- Show_Num(20231221);//数码管显示的数字
- }
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。