单片机的键盘与数码显示电路

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

{temp=P3;
temp=temp & 0x0f;
2021/3/9
}}}
《单片机技术基础教程与实践》 12
《单片机技术基础教程与实践》
么么么么方面
• Sds绝对是假的
P3=0xff; P3_6=0;
《单片机技术基础教程与实践》
//使P3_6为0,然后检测键盘,如果低4位不等于F,表示键盘按下
temp=P3;
key=7; break;
case 0x0d:
//如果P3低4位为1101,所以1110 1101
key=8; break;
case 0x0b:
//如果P3低4位为1011,所以1110 1011
key=9; break;
case 0x07:
//如果P3低4位为0111,所以1110 0111
key=10; break;
//延时
for(b=248;b>0;b--);
2021/3/9
5
}}}
7.2 扫描键盘
《单片机技术基础教程与实践》
扫描式键盘又叫行列式键盘或矩阵式键盘。用I/O口线组成行列结构,按键设置在行列的交点 上。例如用2×2的行、列结构可构成4个键的键盘,4×4的行列结构可构成16个键的键盘。因 此,在按键数量较多时,可以节省I/O口引脚。
0x6d,0x7d,0x07,0x7f,0x6f};
//段码,高电平有效
unsigned char code table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码,低电平有效
unsigned char i;
//i是数码管扫描变量
unsigned char a,b;
《单片机技术基础教程与实践》
第7章 扫描数码管、键盘与点阵显示
7.1 扫描数码管显示
(1)直接扫描数码管
采用单独的引脚输出段码与位码,占用I/O引脚少,引脚数量等于8位(段码) 加数码管的数量(位码),节省电源功率,但是浪费CPU时间,因为必须定时更换 段码与位码,保证显示的连续性。需要点亮一个数码管一段时间(持续1ms以上), 再切换到另外一个。
temp=P3;
//将P3口数值保存在变量temp
temp=temp & 0x0f; //取低4位
if (temp!=0x0f)
//如果低4位不等于1111,则表示按键按下
{for(i=50;i>0;i--)
for(j=200;j>0;j--);
//延迟时间,消除抖动
temp=P3;
temp=temp & 0x0f;
{ for(i=0;i<8;i++)
{
P0=table1[i];
//P0口输出段码,显示变量i
P2=table3[i];
//P2输出位码,驱动9013晶体管
for(a=4;a>0;a--) //循环延时
for(b=248;b>0;b--);
}}}
2021/3/9
3
(2)总线法扫描数码管
《单片机技术基础教程与实践》
LE为锁存控制端,LE=1时,锁存器输出与输入相同,LE=0时,锁存器锁存输入信号。
2021/3/9
4
[例题7-2] 采用总线法扫描数码管,8位共阴极数码管,显示输《出单数片字机1技、术2、基础3、教4程、与5实、践6、》7、 8。 源程序如下:
#include <AT89X51.H>
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,
2
[例题7-1] 直接扫描数码管
《单片机技术基础教程与实践》
8位共阴极数码管,采用扫描方式。输出1、2、3、4、5、6、7、8。
#include <AT89X51.H>
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//a、b是循环变量
void main(void)
{while(1) { for(i=0;i<8;i++) { P2_0=1; P3=table1[i]; P2_0=0; P2_1=1; P3=table3[i]; P2_1=0; for(a=5;a>0;a--)
//数码管扫描循环 //使LE1=1 //P3口输出变量i的段码 //使LE1=0,74373锁存段码 //使LE2=1 //P3口输出第i位位码 //使LE2=0,74373锁存位码
D0 D1 D2 D3 D4 D5 D6 D7
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
2 5 6 9 12 15 16 19
LE1
1 11
OE LE
7 4HC3 7 3
U3
.
D0 D1 D2 D3 D4 D5
3 4 7 8 13 14
D0 D1 D2 D3 D4
Q0 Q1 Q2 Q3 Q4
2 5 6 9 12 15
L LM
.
s2 8 s1 6
RM R
.
.
.
.
s hu ma1
5 3
LE2
1 11
OE LE
7 4HC3 7 3
.
图中的D0~D7信号与P3口相连,LE1与LE2与P2_0和P2_1引脚相连。D0~D7信号分时送出段码
与位码。
74373功能为:
OE是输出使能控制,OE=1时,输出高阻,OE=0时,输出等于锁存器输出。
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
,0x88,0x83,0xc6,0xA1,0x86,0x8e};
//共阳数码管的十六进制-7段译码表
unsigned char temp; //暂存变量
temp=temp & 0x0f;
if (temp!=0x0f)
//如果低4位还是不等于1111
{temp=P3;
temp=temp & 0x0f;
2021/3/9
9
switch(temp)
//根据低4位的值,用分支语句确定键值 《单片机技术基础教程与实践》
{ case 0x0e:
//如果P3低4位为1110,所以1110 1110
RM R
.
s hu ma1
a b c d e
f g h
.
.
.
共阴极
s1
s2
s3
s4
Q1
Q2
Q3
Q4
9 01 3
9 01 3
s5 s6
Q5
Q6
s7
s8
Q7
Q8
段驱动连接器IDATA与51单片机的P0口相连,位驱动连接器IDS与P2口相连,段驱动信号
高2电02平1/3有/9效,驱动晶体三极管9013的信号也是高电平有效。
《单片机技术基础教程与实践》
//使P3_5为0,然后检测键盘,如果低4位不等于F,表示键盘按下
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
Rsm3 1 5k
Rsm4 1 5k
Rsm5 1 5k
Rsm6 1 5k
Rsm7 1 5k
Rsm8 1 5k
.
.
《单片机技术基础教程与实践》
VCC Rs9
1
VCC
2
3
J VCC
4 5 6 7 8
1 2 3 4
9
CON4
5 10
.
7 4 2 110
11
5 3
s4 12 s3 9
L LM
s2 8 s1 6
7
[例题7-3] 4x4扫描键盘
《单片机技术基础教程与实践》
如下的键盘扫描程序,对图7-3所示的键盘进行扫描。P3高4位(P3_4~P3_5)为列扫描 (KL0~KL3),顺序输出低电平;P3低4位为行扫描(Kh0~Kh3),顺序读入数据,检测 哪一行为0;
源程序如下:
#include <AT89X51.H>
//段码,高电平有效
unsigned char code table3[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码,高电平有效
unsigned char i;
//i是数码管扫描变量
unsigned char a,b; //a、b是循环变量
void main(void) {while(1)
2021/3/9
1
J DATA
8
7
.
6
5
4
3
2
1
11
CON8
高电平有效
s8 12 s7 9
L LM
s6 8 s5 6
RM R
.
s hu ma2
J DS
1 2 3 4 5 6 7 8
CON8
高电平有效
a b c d e
7 4 2 110
f g h
5 3
.
.
.
共阴极
Rsm1 1 5k
Rsm2 1 5k
.
ANNIU1
kh0
J KEY
1 2 3 .4 5 6 7 8
CON8
kh0 kh1
kh1
kh2 kh3
kh2
KL0
KL1 KL2
kh3
KL3
ANNIU2 ANNIU3 ANNIU4
KL0
.
ANNIU5 ANNIU6 ANNIU7 ANNIU8
KL1
2021/3/9
ANNIU9 ANNIU1 0 ANNIU1 1 ANNIU1 2
ANNIU1 3 ANNIU1 4 ANNIU1 5 ANNIU1 6
KL2
KL3
.
VCC P1
1
2
3
.
4
5
6
7
8
9
1 0K
.
6
行、列线分别连接到按键开关的两端。行线通过上拉电阻接到《电单源片V机CC技,术被基钳础位教在程高与实电践平》状态。 键盘中有无按键按下的判断方法是:将列线的所有I/O线均置成低电平,然后将行线电平状态 读入。如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入不全为1。若是列线 为高4位,则可以判断低4位,如果低4位不全为1,则有按键按下。
{
temp=P3;
temp=temp & 0x0f;
2021/3/9
11
switch(temp)
{case 0x0e:
//如果P3低4位为1110,所以1101 1110
key=4; break;
case 0x0d:
//如果P3低4位为1101,所以1101 1101
key=5; break;
case 0x0b:
键盘中哪个键按下的判断方法是:由列线逐列置低电平后,检查行输入状 态而确定的。其方法是:依次给列线送低电平,然后查所有行线状态,如 果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列。 而且是在此列与电平为0的行线相交的交点上的那个键。一旦找到哪个按键 按下,就可以赋键值。
2021/3/9
采用两个8D锁存器74373分时锁存段码与位码,则可以节省I/O引脚,例如8位数码管扫 描显示可以采用10个I/O口实现。其中8位用来分时送段码与位码,另外2位用于连接74373的 锁存控制端,分别控制锁存段码与位码。
.
U2
D0 D1 D2 D3 D4 D5 D6 D7
3 4 7 8 13 14 17 18
例如三个数码管组成的显示器,数码管的工作点电流为10mA,2V压降,则可 以采用30mA,33%占空比的电流工作,若是每个数码管显示时间为5ms,需要 15ms完成一次显示,则每个数码管的闪烁频率为66Hz。若是增加数码管数量,则 占空比降低,若要保证亮度需要增加电流,但是最大不要超过100mA。图所示的 是共阴极数码管的扫描工作接线图。
unsigned char key;
//键值变量
unsigned char i,j;
//循环变量
2021/3/9
8
void main(void) {
《单片机技术基础教程与实践》
while(1)
wenku.baidu.com
{
P3=0xff;
//使P3口输出高电平,准备接收输入信号
P3_4=0;
//使P3_4为0,然后检测键盘,如果低4位不等于F,表示键盘按下
s1 s2 s3 s4 s5 s6
D6 D7
17 18
D5 D6 D7
Q5 Q6 Q7
16 19
s7 s8
1 00
7 4 2 110
11
5 3
f g h
a b c d e
s8 12 s7 9
L LM
s6 8 s5 6
RM R
.
.
.
.
s hu ma2
11
7 4 2 110
f g h
a b c d e
s4 12 s3 9
//如果P3低4位为1011,所以1101 1011
key=6; break;
case 0x07:
//如果P3低4位为0111,所以1101 0111
key=11; break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
//P0口相连的数码管显示键值
temp=temp & 0x0f;
while(temp!=0x0f) //等待按键抬起P3口的低4位等于1111
{temp=P3;
temp=temp & 0x0f;
2021/3/9
10
}}}
P3=0xff; P3_5=0;
相关文档
最新文档