第4讲 单片机按键显示接口技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四讲 单片机按键显示接口技术
4.1 单片机按键接口与编程
4.2 单片机LED数码管接口与编程
4.3 ZLG7289显示按键接口芯片使用
4.4 128-64点阵液晶模块使用
4.1 单片机按键接口与编程
4.1.1 键盘分类
@ 按键值编码方式分 (硬件)编码键盘与非(硬件)编码键盘。 @ 按键组连接方式分 独立连接键盘与矩阵连接键盘。
elseif ( key3 == 0) keycode = DOWN; else keycode = NO_KEY; return(keycode); }
key0 = P1^0; key1 = P1^1;
sbit
sbit
key2 = P1^2;
key3 = P1^3;
(2)按键输入函数;用于获得可靠的按键值
共阳极段 码
C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H 88H 83H C6H A1H 86H 8EH FFH
共阴极段 码
3FH 06H 5BH 4FH 06H 6DH 7DH 07H 7FH 6FH 77H 7CH 39H 5EH 79H 71H 00H
4.2.2 LED数码管的静态显示 1. 直接静态显示
unsigned char KeyInput( void ) { unsigned char keybuff, keydata; keybuff = NO_KEY ; keydata = NO_KEY ; keydata = KeyScan( ); if ( keydata != NO_KEY) { keybuff = keydata; Delay10ms( );
2、键盘扫描程序的编写
键盘扫描程序一般流程: (1) 判别有无键按下。 (2) 延时。
(3) 键盘扫描取得闭合键的行、列值-键值。
(4) 用计算法或查表法得到键号。 *(5) 判断闭合键是否释放,如没释放则继续等待。 (6) 将闭合键键号保存, 然后返回。
开始 P1.0-P1.3 置零 P1.3-P.17 置高 N 判断是否 有键按下? Y 延时去抖 判断是否 有键按下? Y N
3) 74LS164显示接口电路驱动程序设计。
1)设置显示缓冲区,存放待显示数据,可以是一个数组。 2)显示译码:程序存储器中建立字形码常数表,查表得出对应数 据的字形码,用常量数组实现。 3)输出显示:输出字形码到显示端口,利用循环语句实现。
#include <reg51.h> unsigned char disp_buf[4];// 定义为全局变量 unsigned char code seg_tab[] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x19, 0x61, 0xff }; void disp7seg (void) { unsigned char i,disp_number; for(i=0; i<4; i++) { disp_number = disp_buf[i]; SBUF = seg_tab[value]; //发送显示段码 while ( TI == 0 ); //等待发送完毕 TI = 0; } }
unsigned char KeyScan( void )
{ unsigned char keycode; if ( key0 == 0) keycode = START;
elseif ( key1 == 0)
keycode = END; elseif ( key2 == 0)
keycode = UP;
P1.0 P1.1 P1.2 8 03 1 P1.3 P1.4 P1.5 P1.6 P1.7
4 8 12 0
4.1.2 键盘驱动程序所需要解决的三个问题
1、键抖动及处理 2、键盘状态的判断-是否有键按下 3、闭合键的识别-是哪个键按下了
1、键抖动及处理 (1) 软件延时去抖
有按键信号?
N
Y
延时等待20ms
keydata = KeyScan( );
if (keybuff != keydata;) keybuff = NO_KEY ;
return(keydata);
}
(3)等待按键释放函数
void Keyoff( void )
{ unsigned char keydata; do
{
keydata = KeyScan( );
void fun_disp( unsigned char disp_number)
{ unsigned char decoder; decoder = disp_decode_tab[ disp_number]; //显示译码 DISP_PORT = decoder; } // 显示输出
2. 基于移位寄存器的静态显示
当LED字段引线与数据线连接,每个显示字形对应一个字形码。
P1.0~1.7 MCS-51
a b
h
a f g e d c h b
LED 的字形码(字段码)
COM
显示字符
共阴极 共阳极
0 1 8. ‘灭’ F U P.
3FH 06H FFH 00 71H 3EH F3H
C0H F9H 00H FFH 84H C1H 02H
1) 74LS164介绍。
The SN74LS164 is a high speed 8-Bit Serial-In Parallel-Out Shift Register. Serial data is entered through a 2-Input AND gate synchronous with the LOW to HIGH transition of the clock. The device features an asynchronous Master Reset which clears the register setting all outputs LOW independent of the clock.
} while (keydata != NO_KEY); }
4.1.4 矩阵连接键盘
1、工作原理
5V
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 列0 列1 列2 列3
行0 行1 行2 行3
矩阵式键盘中,行、 列线分别连接到按键开关 的两端,行线、列线通过 上拉电阻接到+5V上。 当无键按下时,列线 处于高电平状态; 当有键按下时,行、 列线将导通,此时,列线 电平将由与此列线相连的 行线电平决定。
段 代 码
P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
7406 OC门 X 3
+5V
上拉 电阻 ×14
AT89C51
共阴 数码管
位 选 线
P1.5 P1.4 P1.3 P1.2 P1.2 P1.0
#include <reg51.h> #include "delay.h" #include "dispscan.h"
2) 74LS164显示接口电路。
+5V VCC TxD RxD
A B
CLK
CLRFra Baidu bibliotek
h g f e d c b a
74LS164
A B
CLK
CLR
h g f e d c b a
74LS164
A B
CLK
CLR
h g f e d c b a
74LS164
89C51 单片机
共阳LED 数码管
+5V
有几个LED就要几个74LS164,但只要数据不变,送一次 就保持住了,且不闪烁,编程十分简单。
1)设置显示缓冲区,存放待显示数据。 2)显示译码:程序存储器中建立字形码常数表,查表得出对应数 据的字形码。 3)输出显示:输出字形码到显示端口。
#include <reg51.h>
#define DISP_PORT P1 unsigned char code disp_decode_tab[ ]={0x3F,0x06, 0x5B, 0x4F, 0x06, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00};
矩阵连接键盘: 键按矩阵排列,各键处于矩阵行/列 的结点处,CPU通过对连在行(列)的I/O线送已知电平 的信号,然后读取列(行)线的状态信息。逐线扫描, 得出键值。 特点:键多时占用I/O口线少,但判键速度慢,多用于 设置数字键。适用于键数多的场合。
VC C
+5 V 0 1 5 9 13 1 2 6 10 14 2 3 7 11 15 3 0 1 2 3
编码键盘: 采用专用的编码/译码器件,被按下的键 由该器件译码输出相应的键码/键值。 特点:增加了硬件开销,编码因选用器件而异,编 码固定,但编程简单。适用于规模大的键盘。
非编码键盘: 单片机系统多采用此类键盘 采用软件编/译码的方式,通过扫描,对每个被按下 的键判别输出相应的键码/键值。 特点:不增加硬件开销,编码灵活,适用于小规模 的键盘,特别是单片机系统。但编程较复杂,占CPU 时间,还须软件“消颤”。 独立连接键盘: 每键相互独立,各自与一条I/O线相 连,CPU可直接读取该I/O线的高/低电平状态。 特点:占I/O口线多,但判键速度快,多用于设置控 制键、功能键。适用于键数少的场合。
4.2.3 LED数码管的动态显示
动态显示:
各数码管在显示过程中轮流得到送显信号,与各数码管接口 的I/O口线是共用的。
动态显示特点:
有闪烁,用元器件少,占I/O线少,必须扫描,花费CPU时 间,编程复杂。(有多个LED时尤为突出)
工作原理:从P0口送段码,P1口送位选信号。段码虽同时到 达 6个LED,但一次仅一个LED被选中。利用“视觉暂留”, 每送一个字符并选中相应位线,延时一会儿,再送/选下一 个……循环扫描即可。
unsigned char disp_buf[6]; //显示缓存 unsigned char code seg_decode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff,0x00} unsigned char code bit_select[] = {0x00,0x01,0x02,0x04,0x08,0x10,0x20}; void dispscan(void) { unsigned char i,j; for (i=1; i<7; i++) { j = disp_buf[i-1]; //取出需显示的数 segport = seg_decode[j]; //送出段型码 bitport = bit_select[i]; //送出位选码 delayms(1); bitport=0x00; } }
“1” “0” 抖动时间 <20ms 开关动作时间 >100ms <20ms
仍有按键信号? N
Y 键盘处理 按键释放? N Y
(2) 硬件消除抖动
“1” “0” 抖动时间 <20ms 开关动作时间 >100ms <20ms
+5v
& 开关 +5v &
I/O 接 口
单 片 机
4.1.3
独立式按键
1、独立式按键接口结构
共阳极
共阴极
外形图
7段LED字型码(段码)
显示 字形
0 1 2 3 4 5 6 7 8 9 A B C D E F “灭”
dp a b c d e f g
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1
2.独立式按键的软件结构
有按键信号?
N
Y
延时等待20ms
仍有按键信号?
N
Y
键盘处理
按键释放? Y
N
(1)按键扫描函数; 返回按键值 #Include <reg51.h> #define NO_KEY 0XFF #define START #define END #define UP #define DOWN sbit sbit 0x0A 0x0B 0x0C 0x0D
置扫描初值 输出行扫描信号 有键按下? N 修改行扫描信号 最后一行? Y 返回键值 Y 确定键值
N
4.2 单片机LED数码管接口与编程
4.2.1 LED显示器结构和字段码关系
由发光二极管组成,不同的发光段亮,可组成不同字型,其亮度
与电流有关。电流越大亮度越高,一般各管电流在2-5mA较合适。
1. LED显示器结构
4.1 单片机按键接口与编程
4.2 单片机LED数码管接口与编程
4.3 ZLG7289显示按键接口芯片使用
4.4 128-64点阵液晶模块使用
4.1 单片机按键接口与编程
4.1.1 键盘分类
@ 按键值编码方式分 (硬件)编码键盘与非(硬件)编码键盘。 @ 按键组连接方式分 独立连接键盘与矩阵连接键盘。
elseif ( key3 == 0) keycode = DOWN; else keycode = NO_KEY; return(keycode); }
key0 = P1^0; key1 = P1^1;
sbit
sbit
key2 = P1^2;
key3 = P1^3;
(2)按键输入函数;用于获得可靠的按键值
共阳极段 码
C0H F9H A4H B0H 99H 92H 82H F8H 80H 90H 88H 83H C6H A1H 86H 8EH FFH
共阴极段 码
3FH 06H 5BH 4FH 06H 6DH 7DH 07H 7FH 6FH 77H 7CH 39H 5EH 79H 71H 00H
4.2.2 LED数码管的静态显示 1. 直接静态显示
unsigned char KeyInput( void ) { unsigned char keybuff, keydata; keybuff = NO_KEY ; keydata = NO_KEY ; keydata = KeyScan( ); if ( keydata != NO_KEY) { keybuff = keydata; Delay10ms( );
2、键盘扫描程序的编写
键盘扫描程序一般流程: (1) 判别有无键按下。 (2) 延时。
(3) 键盘扫描取得闭合键的行、列值-键值。
(4) 用计算法或查表法得到键号。 *(5) 判断闭合键是否释放,如没释放则继续等待。 (6) 将闭合键键号保存, 然后返回。
开始 P1.0-P1.3 置零 P1.3-P.17 置高 N 判断是否 有键按下? Y 延时去抖 判断是否 有键按下? Y N
3) 74LS164显示接口电路驱动程序设计。
1)设置显示缓冲区,存放待显示数据,可以是一个数组。 2)显示译码:程序存储器中建立字形码常数表,查表得出对应数 据的字形码,用常量数组实现。 3)输出显示:输出字形码到显示端口,利用循环语句实现。
#include <reg51.h> unsigned char disp_buf[4];// 定义为全局变量 unsigned char code seg_tab[] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x19, 0x61, 0xff }; void disp7seg (void) { unsigned char i,disp_number; for(i=0; i<4; i++) { disp_number = disp_buf[i]; SBUF = seg_tab[value]; //发送显示段码 while ( TI == 0 ); //等待发送完毕 TI = 0; } }
unsigned char KeyScan( void )
{ unsigned char keycode; if ( key0 == 0) keycode = START;
elseif ( key1 == 0)
keycode = END; elseif ( key2 == 0)
keycode = UP;
P1.0 P1.1 P1.2 8 03 1 P1.3 P1.4 P1.5 P1.6 P1.7
4 8 12 0
4.1.2 键盘驱动程序所需要解决的三个问题
1、键抖动及处理 2、键盘状态的判断-是否有键按下 3、闭合键的识别-是哪个键按下了
1、键抖动及处理 (1) 软件延时去抖
有按键信号?
N
Y
延时等待20ms
keydata = KeyScan( );
if (keybuff != keydata;) keybuff = NO_KEY ;
return(keydata);
}
(3)等待按键释放函数
void Keyoff( void )
{ unsigned char keydata; do
{
keydata = KeyScan( );
void fun_disp( unsigned char disp_number)
{ unsigned char decoder; decoder = disp_decode_tab[ disp_number]; //显示译码 DISP_PORT = decoder; } // 显示输出
2. 基于移位寄存器的静态显示
当LED字段引线与数据线连接,每个显示字形对应一个字形码。
P1.0~1.7 MCS-51
a b
h
a f g e d c h b
LED 的字形码(字段码)
COM
显示字符
共阴极 共阳极
0 1 8. ‘灭’ F U P.
3FH 06H FFH 00 71H 3EH F3H
C0H F9H 00H FFH 84H C1H 02H
1) 74LS164介绍。
The SN74LS164 is a high speed 8-Bit Serial-In Parallel-Out Shift Register. Serial data is entered through a 2-Input AND gate synchronous with the LOW to HIGH transition of the clock. The device features an asynchronous Master Reset which clears the register setting all outputs LOW independent of the clock.
} while (keydata != NO_KEY); }
4.1.4 矩阵连接键盘
1、工作原理
5V
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 列0 列1 列2 列3
行0 行1 行2 行3
矩阵式键盘中,行、 列线分别连接到按键开关 的两端,行线、列线通过 上拉电阻接到+5V上。 当无键按下时,列线 处于高电平状态; 当有键按下时,行、 列线将导通,此时,列线 电平将由与此列线相连的 行线电平决定。
段 代 码
P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
7406 OC门 X 3
+5V
上拉 电阻 ×14
AT89C51
共阴 数码管
位 选 线
P1.5 P1.4 P1.3 P1.2 P1.2 P1.0
#include <reg51.h> #include "delay.h" #include "dispscan.h"
2) 74LS164显示接口电路。
+5V VCC TxD RxD
A B
CLK
CLRFra Baidu bibliotek
h g f e d c b a
74LS164
A B
CLK
CLR
h g f e d c b a
74LS164
A B
CLK
CLR
h g f e d c b a
74LS164
89C51 单片机
共阳LED 数码管
+5V
有几个LED就要几个74LS164,但只要数据不变,送一次 就保持住了,且不闪烁,编程十分简单。
1)设置显示缓冲区,存放待显示数据。 2)显示译码:程序存储器中建立字形码常数表,查表得出对应数 据的字形码。 3)输出显示:输出字形码到显示端口。
#include <reg51.h>
#define DISP_PORT P1 unsigned char code disp_decode_tab[ ]={0x3F,0x06, 0x5B, 0x4F, 0x06, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00};
矩阵连接键盘: 键按矩阵排列,各键处于矩阵行/列 的结点处,CPU通过对连在行(列)的I/O线送已知电平 的信号,然后读取列(行)线的状态信息。逐线扫描, 得出键值。 特点:键多时占用I/O口线少,但判键速度慢,多用于 设置数字键。适用于键数多的场合。
VC C
+5 V 0 1 5 9 13 1 2 6 10 14 2 3 7 11 15 3 0 1 2 3
编码键盘: 采用专用的编码/译码器件,被按下的键 由该器件译码输出相应的键码/键值。 特点:增加了硬件开销,编码因选用器件而异,编 码固定,但编程简单。适用于规模大的键盘。
非编码键盘: 单片机系统多采用此类键盘 采用软件编/译码的方式,通过扫描,对每个被按下 的键判别输出相应的键码/键值。 特点:不增加硬件开销,编码灵活,适用于小规模 的键盘,特别是单片机系统。但编程较复杂,占CPU 时间,还须软件“消颤”。 独立连接键盘: 每键相互独立,各自与一条I/O线相 连,CPU可直接读取该I/O线的高/低电平状态。 特点:占I/O口线多,但判键速度快,多用于设置控 制键、功能键。适用于键数少的场合。
4.2.3 LED数码管的动态显示
动态显示:
各数码管在显示过程中轮流得到送显信号,与各数码管接口 的I/O口线是共用的。
动态显示特点:
有闪烁,用元器件少,占I/O线少,必须扫描,花费CPU时 间,编程复杂。(有多个LED时尤为突出)
工作原理:从P0口送段码,P1口送位选信号。段码虽同时到 达 6个LED,但一次仅一个LED被选中。利用“视觉暂留”, 每送一个字符并选中相应位线,延时一会儿,再送/选下一 个……循环扫描即可。
unsigned char disp_buf[6]; //显示缓存 unsigned char code seg_decode[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff,0x00} unsigned char code bit_select[] = {0x00,0x01,0x02,0x04,0x08,0x10,0x20}; void dispscan(void) { unsigned char i,j; for (i=1; i<7; i++) { j = disp_buf[i-1]; //取出需显示的数 segport = seg_decode[j]; //送出段型码 bitport = bit_select[i]; //送出位选码 delayms(1); bitport=0x00; } }
“1” “0” 抖动时间 <20ms 开关动作时间 >100ms <20ms
仍有按键信号? N
Y 键盘处理 按键释放? N Y
(2) 硬件消除抖动
“1” “0” 抖动时间 <20ms 开关动作时间 >100ms <20ms
+5v
& 开关 +5v &
I/O 接 口
单 片 机
4.1.3
独立式按键
1、独立式按键接口结构
共阳极
共阴极
外形图
7段LED字型码(段码)
显示 字形
0 1 2 3 4 5 6 7 8 9 A B C D E F “灭”
dp a b c d e f g
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1
2.独立式按键的软件结构
有按键信号?
N
Y
延时等待20ms
仍有按键信号?
N
Y
键盘处理
按键释放? Y
N
(1)按键扫描函数; 返回按键值 #Include <reg51.h> #define NO_KEY 0XFF #define START #define END #define UP #define DOWN sbit sbit 0x0A 0x0B 0x0C 0x0D
置扫描初值 输出行扫描信号 有键按下? N 修改行扫描信号 最后一行? Y 返回键值 Y 确定键值
N
4.2 单片机LED数码管接口与编程
4.2.1 LED显示器结构和字段码关系
由发光二极管组成,不同的发光段亮,可组成不同字型,其亮度
与电流有关。电流越大亮度越高,一般各管电流在2-5mA较合适。
1. LED显示器结构