C51单片机学习日记:数码管

02 数码管

2021.3.2 初版
2021.3.3 更改了动态数码管代码

2.1 基本认识

此次学习的数码管为led数码管(由多个发光二极管封装在一起组成“8”字型的器件),有公共电极。

组成“8”字型的二极管用计量,加上小数点共有8段,分别用a、b、c、d、e、f、g、h、dp表示,想让哪一段亮就改变哪一段的电平。

  • 数码管的类型

倒二个字母:A ---- 共阴 B ---- 共阳

共阴共阳的不同会导致数码管段选的表示不同

附表(1)

(共阳无小数点)

hgfedcba
0110000000xc0
1111110010xf9
2101001000xa4
3101100000xb0
4100110010x99
5100100100x92
6100000100x82
7111110000xf8
8100000000x80
9100100000x90
a100010000x88
b100000110x83
c110001100xc6
d100100010xa1
e100001100x86
f100011100x8e
-101111110xbf
附表(2)
无小数点有小数点
共阳数码管0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf0x40,0x79,0x24,0x30, 0x19,0x12,0x02,0x78 0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0x3f
共阴数码管0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x710xbf,0x86,0xdb,0xcf,0xe6 0xed,0xfd,0x87,0xff,0x6f, 0xf7,0xfc,0xb9,0xde,0xf9,0xf1
  • 共阳:无小数前四位 -8 有小数点
  • 共阴:无小数点前四位==+8==有小数点

共阳数码管(无小数)unsigned char code smg[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}

共阴数码管(无小数)unsigned char code smg[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71}

共阳数码管(有小数)unsigned char code smg[] = {0x40,0x79,0x24,0x30, 0x19,0x12,0x02,0x78 ,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,0x3f}

共阴数码管(有小数)unsigned char code smg[] = {0xbf,0x86,0xdb,0xcf,0xe6 0xed,0xfd,0x87,0xff,0x6f, 0xf7,0xfc,0xb9,0xde,0xf9,0xf1}

2.2 静态显示

定义:每个数码管的每一个段码都由一个I/O口进行驱动

优点:编程简单,亮度高

缺点:占I/O口多

#include"reg52.h"

unsigned char code SMG_D[18] =
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

		 
void delay(unsigned int t)//延时函数
{
		while(t--);
		while(t--);
}

void Show_bit(unsigned char value,unsigned char pos)
{
   P2 = (P2 & 0x1f)| 0xc0;P0 = 0x01 << pos;P2 &= 0x1f;
	 P2 = (P2 & 0x1f)| 0xe0;P0 = value;P2 &= 0x1f;
}
//0xc0选中时对应了位
//0xe0对应段的选择

void static_show()
{
     char i,j;
		 for(i = 0;i < 8;i++)
		 {
				for(j = 0;j < 10;j++)
			 {
			   Show_bit(SMG_D[j],i);
				 delay(60000);
			 }
		 }
		 
		 P2 = P2 & 0x1f | 0xc0;P0 = 0xff;P2 &= 0x1f;
		 
		 for(i = 0;i < 16;i++)
		 {
			 P2 = P2 & 0x1f | 0xe0;P0 = SMG_D[i];P2 &= 0x1f;
			 delay(60000);
		 }
}	//代码来自:https://bbs.21ic.com/icview-2409312-1-1.html

void main()
{
		P2 = P2 & 0x1f | 0xa0;P0 = 0;P2 &= 0x1f;
    while(1)
		{
			static_show();
		}
}

静态显示只能一位一位显示或者所有位显示同个数字/字母

2.3 动态显示

动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制.

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

(引自百度百科)

//相比于静态显示,动态显示只需要每个位置都显示,且延时时间缩短
void Dynamic_Show()
{
 	Show_bit(SMG_D[0],0);//在第0位显示0
	delay(500);
	Show_bit(0xff,0);//消隐   
    //如果有消隐的话
}

主程序中:

void main()
{
    Dynamic_show()delaySMG(500);//增加一个延时
}

其中,delaySMG(500);所对应函数为:

void delaySMG(unsigned int t)
{
    while(t--)
    {
        Dynamic_Show();
    }
}//注意:此刻delay应写成:
/*
void delay(unsigned int t)
{
	while(t--);
}
//需要比原来的少一个t-- 即delay和delaySMG的延时时间应该相同
*/

改进版

void Dynamic_show()
{
    unsigned char pos;
    for(pos = 0;pos < 8;pos++)
    {
       P2 = (P2 & 0x1f)|0xc0;P0 = 0x01 << pos;P2 &= 0x1f; 
       P2 = (P2 & 0X1f)|0xe0;P0 = SMG_D[table[i]];P2 & 0x1f;
       delay(500);//记得延时
    }
//巧用table[] table[]里面存放各个位置对应的数字/字母
}

已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页