登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 单片机数码管的显示总结及其应用

[复制链接]
发表于 2018-1-30 14:42:45 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机数码管的显示
学习安排: 单片机数码管的显示
开始时间: 2018-01-30
结束时间:
本帖最后由 Linkfox.cc@灵狐 于 2018-2-7 18:07 编辑
前两天学习了一下led灯的点亮,个人认为比较简单加上最近事情比较多就没有上传点亮led灯这方面的笔记
关于数码管,其实跟led差不多是一个原理
但上面那句话只适用于单个数码管
而开发板上的数码管一共有8,个8*8=64?
这太多了可就不能用定义引脚来驱动了
参考了开发板的电路图发现驱动数码管有两个数码管锁存器
原理图如下



这两块芯片分别控制着数码管位和数码管中的led
我们可以看到上面的74HC573的12-19脚写着WE1-8控制着数码管的位
下面的74HC573的12-19脚写着A-H控制着单个数码管的段
这两个芯片的11脚分别连着P27和P28
查阅资料可知需要更改位或段都需要将其控制的芯片打开

那么首先我们要定义一下P27和P28
先写一下开头
[mw_shl_code=c,true]#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7; //位选
sbit du = P2^6;//段选
void main()
{
}

[/mw_shl_code]
再次查看开发板手册得知P0控制着数码管

然后打开段选,对P0赋值
[mw_shl_code=c,true]
du = 1;
                P0 = 0x06; //定义显示“1”
                du = 0;
[/mw_shl_code]
打开位选,对P0赋值
[mw_shl_code=c,true]
we = 1;
P0 =0xFE;//定义第一个数码管
we = 0;                        

[/mw_shl_code]
代码烧录,运行成功,数码管左1显示“1”
但是在实际应用过程中不能每一个字都算一遍这样太麻烦了
于是我们定义一个数组
[mw_shl_code=c,true]
uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"};
[/mw_shl_code]
再定义一下数码管位置
[mw_shl_code=c,true]
uchar code led_en[]={
                                                                                         //从右向左
                0xFF,  //"0"
                0x7F,  //"1"
                0xBF,  //"2"
                0xDF,  //"3"
                0xEF,  //"4"
                0xF7,  //"5"
                0xFB,  //"6"
                0xFD,  //"7"
                0xFE,  //"8"
                         };
[/mw_shl_code]
数组前面加code定义的原因是C在定义数组时是占用内存空间的,使用code进行编码,在定义编码时直接分配到程序空间,节约内存。
所以代码可以改写成
[mw_shl_code=c,true]
du = 1;
P0 = leddata[1];
du = 0;
delay(5);
we = 1;
P0 = led_en[8];
we = 0;

[/mw_shl_code]
接下来写一个动态显示的过程
[mw_shl_code=c,true]
void delay(uint z)
{       //这个函数是编辑器自带的一个工具生成的,我目前为止还没有搞懂到底怎么延迟出来的
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114*7.1; y > 0 ; y--);
}

void main()
{
                for(i = 0; i <= 10; i++)
                {

                du = 1;
                P0 = leddata[i-1];
                du = 0;
                delay(5);
                we = 1; &#161;
                P0 = led_en;
                we = 0;
               
if (i==10){i=0;if (b==1){b=8;}else{b--;}}
                delay(100);
                }
}[/mw_shl_code]
但在运行过程中发现总会有数码管的残影,检查代码发现在循环时打开段选时候P0的值是上一次循环位选的值,找到问题修改代码,在du=1;前加上
[mw_shl_code=c,true]P0 = 0xFF;[/mw_shl_code]
这样问题就解决了

贴一下完整的代码[mw_shl_code=c,true]#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;
sbit du = P2^6;
uint i;
uint b=8;
uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"

                         };
uchar code led_en[]={
                                                                                         
                0xFF,  //"0"
                0x7F,  //"1"
                0xBF,  //"2"
                0xDF,  //"3"
                0xEF,  //"4"
                0xF7,  //"5"
                0xFB,  //"6"
                0xFD,  //"7"
                0xFE,  //"8"


                         };
void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114*7.1; y > 0 ; y--);
}

void main()
{
                for(i = 0; i <= 10; i++)
                {
                P0 = 0xFF;
                du = 1;                                
                P0 = leddata[i-1];
                du = 0;                                
                delay(5);
                we = 1;                                
                P0 = led_en;
                we = 0;                                
               
if (i==10){i=0;if (b==1){b=8;}else{b--;}}
                delay(100);
                }

}[/mw_shl_code]
以上内容仅为个人学习总结,如有错误之处和不足请大家多多指教谢谢。
P0段.png
数码管锁存.png
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表