内容正文:
工作模块3---数码管显示控制
同学们,大家好!上一讲我们学习了矩阵键盘识别原理,并绘制了接口电路,今天我们利用矩阵键盘实现数字键盘的功能
1
情境导入
在乘坐电梯时,到了目标楼层,就会有一个电子显示器件显示当前楼层,这个就是数码管,如图3.1所示。在家中或者办公室中,会使用一个电子时钟显示当前时间,这个显示器件也是数码管,如图3.2所示。许多场合,都会用到数码管来显示数字,有时用到1个,有时用到多个。当走上电子技术员或者单片机工程师工作岗位后,也会经常用到数码管,学习单片机控制数码管的显示,有着非常现实的意义。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
内容图谱
矩阵键盘程序设计总体思路:单片机采用编程扫描法来监视键盘的输入,采用反转法获取键值。
具体编程步骤如下:
任务描述
某电子科技有限公司要生产一批计算器,显示模块采用数码管显示,现在你作为公司技术员,要实现显示模块的开发制作。初期任务是通过单片机控制1位数码管的显示,显示内容是数字从0-9,数字切换的时间间隔是1秒,设计电路原理图,编写程序,并仿真功能。
初级能力:实现单片机控制一位共阳极数码管显示的功能。
高级能力:能够设计单品机驱动共阳极数码管和共阴极数码管的硬件电路,并编写显示程序。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
执行思路
矩阵键盘程序设计总体思路:单片机采用编程扫描法来监视键盘的输入,采用反转法获取键值。
具体编程步骤如下:
实施过程
3-1-1 Proteus ISIS设计电路原理图
共阳极数码管
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
实施过程
3-1-1 Proteus ISIS设计电路原理图
序号 元件名称 元件型号 元件参数
1 单片机 AT89C52
2 瓷片电容 CAP 30pF
3 电解电容 CAP-ELEC 22uF
4 晶振 CRTSTAL 12MHZ
5 按键 BUTTON
6 电阻 RES 10k、470
7 排阻 Respack-8 10K
8 数码管 7SEG-MAP1-CA 共阳极数码管
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
实施过程
3-1-1 绘制原理图重点
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
知识链接
3-1 数码管结构
数码管是一个8字的结构,8字的每个笔划都一个发光二极管,每个笔划称为一个段,因此“8”字一共是7段。在使用过程中还经常会用到小数点,加上小数点,其实是8段的数码管。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.1 数码管的结构
数码管的每个段本质都是一个发光二极管,而每个发光二极管分别有阳极和阴极,因此,数码管根据公共端的不同,可以分成共阴极和共阳极的数码管,如图3.13a,b所示,而且数码管的每个段,都给它一定的编号,分别是a,b,c,d,e,f,g段 ,外加一个dp点字段。一共是8个段,对应数码管的8个引脚,com端有两个引脚,需要接在一起,如图3.12 C所示。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.2 数码管的结构
以共阳极的数码管显示字形2为例,共阳极的数码管,公共端为高电平,需要某个段发光,则需要给相应的段送0,因此如果需要显示2,则可以得到相应的字形码如图3.13所示。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.2 数码管的结构
通过上面的分析,可以很容易得到共阳极数码管对于“2”的字形码为 10100100, 表示为BCD码即为:0xa4; 同理,共阴极数码管的“2”的字形码,即为相应共阳极字形码按位取反得到,即为0x5B,(0xff - 0xa4 = 0x5B)。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
表3-2 LED数码管显示字型码表
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
静态显示方式
每个数码管的段选线必须与一个八位I/O端口相连,公共端恒定接地或电源。静态显示是各位数码管恒定导通或截止。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
静态显示
知识链接
3.3 数组的使用
具有相同类型的一批数据作为一个整体,叫做数组(Array),数组均由连续的存储单元组成,数组可以是一维的,也可以是多维的。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.1一维数组
1.一维数组的定义
定义形式:类型符 数组名 [常量表达式];
int arr[15]; //类型符:整型数据类型;数组名:arr,元素个数:15
char arr[20];//类型符:字符型数据类型;数组名:arr,元素个数:20
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.1一维数组
2.一维数组的初始化
数组初始化时,可以先定义数组再给数组赋值,也可以在定义数组的同时赋值,例如:
int a[4] = {20, 45, 400, 22};
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.1一维数组
3.数组的使用
先定义数组,才可以引用数组中的每个元素。数组元素的引用方式∶数组名[数组元素下标]。
disnum[0]=0xc0;disnum[1]=0xf9;disnum[2]=0xa4
也可以是整型表达式 例如b[i];c[6*i]
数组元素下标从0开始,长度为n的数组合法下标取值范围∶0 至n-1。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.1一维数组
void main() //主函数
{ unsigned char i;
int sum,ave,MCU_scores[6]={84,83,89,93,91,60};
sum=0;
for(i=0;i<6;i++) //变量i,循环6次
{ sum=sum+MCU_scores[i]; }
Ave=sum/15;
}
}
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.2二维数组
1.二维数组的定义
类型说明符 数组名[ 常量表达式][ 常量表达式];
int a[3][4];
表示定义了 3 行 4 列总共有 12 个元素的数组 a。这 12 个元素的名字依次是:a[0][0]、a[0][1]、a[0][2]、a[0][3];a[1][0]、a[1][1]、a[1][2]、a[1][3];a[2][0]、a[2][1]、a[2][2]、a[2][3]。。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.2二维数组
2.二维数组初始化
1) 分行给二维数组赋初值。
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
2) 也可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。比如
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
3) 也可以只对部分元素赋初值。比如:
int a[3][4] = {{1, 2}, {5}, {9}};
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.2二维数组
3.二维数组的使用
二维数组有行和列,数组的元素也是一个一个的输出。在一维数组中是用一个 for 循环进行输出,而二维数组元素的输出要使用两个 for 循环嵌套。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.3字符数组
1.字符数组
用来存放字符的数组称为字符数组,
char a[10]; //一维字符数组
char b[5][10]; //二维字符数组
char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.3字符数组
1.字符数组
C语言规定,可以将字符串直接赋值给字符数组
char str[10] = {"abcdefg"}; 或者char str[10] = "abcdefg";
数组第 0 个元素为'a',第 1 个元素为'b',第 2 个元素为'c',后面的元素以此类推。为了方便,也可以不指定数组长度。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.3.3字符数组
2.字符串数组
字符串是一系列连续的字符的组合,字符串总是以'\0'空字符作为结尾,所以'\0'也被称为字符串结束标志,或者字符串结束符。该字符既不能显示,也没有控制功能。
例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'\0',这个过程是在后台默默地进行的。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
实施过程
3-1-2 一位数码管显示参考程序
#include<reg51.h> //头文件
#define uchar unsigned char //定义常量uchar
#define uint unsigned int //定义常量uint
uchar code disnum[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//code是把数组存储在程序存储区,这是共阳极数码管从0-9的字形编码
void delay(unsigned int i) //函数定义
{
unsigned int j,k; //定义无符号整型变量j和k
for(k=0;k<i;k++) //双重for循环语句实现延时
for(j=0;j<125;j++);
}
void main() //主函数
{
uchar i;
for(i=0;i<10;i++) //变量i,循环10次
{
P0=disnum[i];
delay(1000);
}
}
P0=disnum[i];语句是把数组disnum中的每一个元素赋值给P0,数码管的每一段是LED灯,把不同位置的LED灯点亮,就会构成要显示的数字。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
实施过程
3-1-2 一位数码管显示参考程序
#include<reg51.h> //头文件
#define uchar unsigned char //定义常量uchar
#define uint unsigned int //定义常量uint
uchar code disnum[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//code是把数组存储在程序存储区,这是共阳极数码管从0-9的字形编码
void delay(unsigned int i) //函数定义
{
unsigned int j,k; //定义无符号整型变量j和k
for(k=0;k<i;k++) //双重for循环语句实现延时
for(j=0;j<125;j++);
}
void main() //主函数
{
uchar i;
for(i=0;i<10;i++) //变量i,循环10次
{
P0=disnum[i];
delay(1000);
}
}
定义数组disnum时,前面加上code,是把数组存储在程序存储区,节省数据存储区,但是定义在程序存储区,数组的元素不能更改。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
控制要求:请设计单片机控制共阴极数码管的电路,并编写程序。
扩展任务
我们总结一下今天的学习内容:学习了1. 矩阵键盘的编程扫描法
2.采用反转法进行矩阵键盘键值识别
3.编写了矩阵键盘实现数字键盘的程序
课后作业:1. 请采用定时中断扫描实现数字键盘;
2.请编写获得键值采用扫描法的程序。
共阴极数码管与共阳极数码管硬件电路区别
扩展任务
小贴士:单片机驱动共阴极数码管电路图与共阳极电路图对比,区别有:
1.P0口接了上拉电阻后,数码管的控制引脚不用再接限流电阻;
2.共阴极数码管的型号是7SEG-MPX1-CC;
3.共阴极数码管的公共端接地。
我们总结一下今天的学习内容:学习了1. 矩阵键盘的编程扫描法
2.采用反转法进行矩阵键盘键值识别
3.编写了矩阵键盘实现数字键盘的程序
课后作业:1. 请采用定时中断扫描实现数字键盘;
2.请编写获得键值采用扫描法的程序。
任务3-2描述
通过单片机控制8位数码管的显示,使8位数码管同时稳定显示数字0-7,设计电路原理图,编写程序,并仿真功能。
初级能力:实现本次任务的显示功能。
高级能力:能够设计不同方案的硬件电路,并编写显示不同内容的程序。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
执行思路
思考并设计单片机连接8位数码管的电路,数码管的静态显示无论从电路和程序方面都无法实现8位数码管的控制,探索数码管的动态显示方式,灵活运用C语言的基本语句,编写数码管显示的程序。
矩阵键盘程序设计总体思路:单片机采用编程扫描法来监视键盘的输入,采用反转法获取键值。
具体编程步骤如下:
实施过程
3-2-1 Proteus ISIS设计电路原理图
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
知识链接
3.4 数码管动态显示原理
每位数码管都有8根段码线,一根位选线(公共端),按照静态显示的原理,一片STC89C51或者STC89C52RC等单片机,最多只能接4位数码管,当需要控制多位数码管的时候,I/O资源就不够。而在实际生产中,多需要控制多位数码管时,一般采用数码管的动态显示控制方式。。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
3.4 数码管的静态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。调整电流和时间参数,可实现亮度较高较稳定的显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。若数码管的数目不大于8位,则控制显示器公共极电位只需8位口(称为位选口),控制各位显示器所显示的字形也需要一个8位口(段选 口)。。
3.4 数码管的静态显示
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
补充:在使用电路板时,为了增加引脚的复用,经常使用74HC573数据锁存芯片
74HC573是8位数据锁存器。
1是低电压激活芯片
2~9脚是数据的输入脚从D0到D7
10脚是接地
11脚是高电压激活芯片
12~19脚是数据的输出脚
20是电源
数据锁存:当输入的数据消失时,在芯片的输出端,数据仍然保持;这个概念在并行数据扩展中经常使用到。
◆OE:output_enable,输出使能;
◆LE:latch_enable,数据锁存使能,atch是锁存的意思;
◆Dn:第n路输入数据;
◆On:第n路输出数据;
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
补充:在使用电路板时,为了增加引脚的复用功能,经常使用74HC573锁存芯片
74HC573真值表,意思如下:
第一行/第二行:当OE=0、LE=1时,输出端数据等于输入端数据;
第三行:当OE=0、LE=0时,输出端保持不变;
第四行:当OE=1是无论Dn、LE为何,输出端为高阻态;
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
补充:在使用电路板时,为了增加引脚的复用功能,经常使用74HC573锁存芯片
高阻态
就是输出既不是高电平,也不是低电平,而是高阻抗的状态;在这种状态下,可以多个芯片并联输出;但是,这些芯片中只能有一个处于非高阻态状态,否则会将芯片烧毁。高阻态的概念在RS232和RS422通讯中还可以用到。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
知识链接
74HC573芯片
高阻态
就是输出既不是高电平,也不是低电平,而是高阻抗的状态;在这种状态下,可以多个芯片并联输出;但是,这些芯片中只能有一个处于非高阻态状态,否则会将芯片烧毁。高阻态的概念在RS232和RS422通讯中还可以用到。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
实施过程
3-2-2 数码管动态显示程序
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
实施过程
3-2-2 数码管动态显示程序
P0=~(0x01<<(i-1));<<:按位左移运算符,这条语句的功能是把0x01字节依次左移0位,1位,2位直到7位。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
实施过程
3-2-2 数码管动态显示程序
数码管在动态显示时,要点亮一位数码管,段选信号和位选信号要配合,或者同时,或者时间间隔非常短,ms以内。每完成一位数码管显示时,要关一次数码管,可采用对公共端送关显示的信号,即共阳极数码管送0,共阴极数码管送1,否则数码管会将上一个字符显示在下一个字符位置上很短的时间,形成拖影,导致显示效果不好。
(1)判别有无键按下;
(2)软件延时消抖;
(3)再次确认有无键按下;
(4)取得键值:反转法或键盘扫描取得闭合键的行、列号,并计算法或
查表法得到键值;
(5)松手检测:判断闭合键是否释放,如没释放则继续等待;
(6)键盘处理:将闭合键的键值保存,同时转去执行该闭合键的功能。
下面我们来编程!
扩展任务
控制要求:请再设计一款控制4位共阳极数码管动态显示的电路,不考虑单片机的引脚复用,并编写同时稳定显示中秋日期“0815”数字的程序。
数码管7SEG-MPX4-CA;
添加74LS245缓冲芯片,可进行数据双向传输,一般用于驱动LED灯或其他设备;添加NPN三极管PN2222(实物可以选择9013)
我们总结一下今天的学习内容:学习了1. 矩阵键盘的编程扫描法
2.采用反转法进行矩阵键盘键值识别
3.编写了矩阵键盘实现数字键盘的程序
课后作业:1. 请采用定时中断扫描实现数字键盘;
2.请编写获得键值采用扫描法的程序。
74HC245数字芯片引脚图
扩展任务
数据缓冲 :加强驱动能力74LS244/74LS245/74LS373/74LS573都具备数据缓冲的能力。
第1脚DIR(T/R),为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚,第11~18脚“A”信号输入输出端,如果IR=“1”OE=“0”则A1输入B1输出,如果DIR=“0”OE=“0”则B1输入A1输出。
第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
我们总结一下今天的学习内容:学习了1. 矩阵键盘的编程扫描法
2.采用反转法进行矩阵键盘键值识别
3.编写了矩阵键盘实现数字键盘的程序
课后作业:1. 请采用定时中断扫描实现数字键盘;
2.请编写获得键值采用扫描法的程序。
扩展任务
我们总结一下今天的学习内容:学习了1. 矩阵键盘的编程扫描法
2.采用反转法进行矩阵键盘键值识别
3.编写了矩阵键盘实现数字键盘的程序
课后作业:1. 请采用定时中断扫描实现数字键盘;
2.请编写获得键值采用扫描法的程序。
扩展任务
我们总结一下今天的学习内容:学习了1. 矩阵键盘的编程扫描法
2.采用反转法进行矩阵键盘键值识别
3.编写了矩阵键盘实现数字键盘的程序
课后作业:1. 请采用定时中断扫描实现数字键盘;
2.请编写获得键值采用扫描法的程序。
内容梳理与总结
本工作模块完成了2个任务,介绍了数码管的结构和显示方式。知识点介绍了数组的使用,通过一系列的任务,训练了数码管的控制程序设计方法以及仿真电路的绘制与仿真方法。
要掌握的重点内容包括∶
数码管的静态显示和动态显示程序编写方法。静态显示时,在数码管的段选线送上字形编码即可;数码管动态显示时,既要考虑段选线,也要考虑位选线。段选线控制数码管显示的字形,位选线控制着数码管的亮与灭。
我们先看矩阵键盘接口电路。P30-P33接行线,P34-P37接列线。
再 见
同学们,大家好!我是主讲教师杨敬娜。上一讲我们学习了矩阵键盘识别原理,并绘制了接口电路,今天我们利用矩阵键盘实现数字键盘的功能
48
$$