实验十 7279阵列式键盘实验
实验十 7279阵列式键盘实验
实验目的
1、掌握八段数码管硬件线路原理,掌握用HD7279A芯片实现显示的编程方法。
2、熟悉键盘的工作原理,掌握用HD7279A芯片实现键盘扫描程序设计方法。
实验内容
HD7279A是一片具有串行接口的,可同时驱动8位共阴极数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,HD7279A 内部含有译码器,可直接接受16进制码,HD7279A还同时具有2种译码方式,HD7279A还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等。
HD7279A的指令结构有三种类型:
1)不带数据的纯指令,指令的宽度为8个BIT,即微处理器需发送8个CLK脉冲;
2)带有数据的指令,宽度为16个BIT,即微处理器需发送16个CLK脉冲;
3)读取键盘数据指令,宽度为16个BIT,前8个为微处理器发送到HD7279的指令,后8个BIT为HD7279A返回的键盘代码。
本实验采用8位共阴极数码管,用查询方式判断。
引脚说明:
| 引脚 | 名称 | 说明 |
|---|---|---|
| 1,2 | VDD | 正电源 |
| 3,5 | NC | 无连接,必须悬空 |
| 4 | VSS | 接地 |
| 6 | CS | 片选输入端,此引脚为低电平时,可向芯片发送指令及读取键盘数据 |
| 7 | CLK | 同步时钟输入端,向芯片发送数据及读取键盘数据时,此引脚电平上升沿表示数据有效 |
| 8 | DATA | 串行数据输入/输出端,当芯片接收指令时,此引脚为输入端:当读取键盘数据时,此引脚在‘读’指令最后一个时钟的下降沿变为输出端 |
| 9 | KEY | 按键有效输出端,平时为高电平,当检测到有效按键时,此引脚变为低电平 |
| 10-16 | SG-SA | 段g——段a驱动输出 |
| 17 | DP | 小数点驱动输出 |
| 18-25 | DIG0-DIG7 | 数字0——数字7驱动输出 |
| 26 | CLKO | 振荡输出端 |
| 27 | RS | RC振荡器连接端 |
| 28 | RESET | 复位端 |
控制指令:
HD7279A的控制指令分为二大类——纯指令和带有数据的指令。
纯指令
1.复位(清除)指令A4H
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
当HD7279A收到该指令后,将所有的显示清除,所有设置的字符消隐、闪烁等属性也被一起清除。执行该指令后,芯片所处的状态与系统上电后所处的状态一样。
2.测试指令BFH
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
该指令使所有的LED全部点亮,并处于闪烁状态,主要用于测试。
3.左移指令A1H
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
使所有的显示自右向左(从第1位向第8位)移动一位(包括处于消隐状态的显示位),但对各位所设置的消隐及闪烁属性不变。移位后,最右边一位为空(无显示)。例如,原显示为
| 4 | 2 | 5 | 2 | L | P | 3 | 9 |
|---|
其中第2位‘3’和第4位‘L’为闪烁显示,执行了左移指令后,显示变为
2 5 2 L P 3 9
第二位‘9’和第四位‘P’为闪烁显示。
4.右移指令A0H
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
与左移指令类似,但所做移动为自左向右(从第8位向第1位)移动,移动后,最左边一位为空。
5.循环左移指令A3H
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
与左移指令类似,不同之处在于移动后原最左边一位(第8位)的内容显示于最右位(第1位)。在上例中,执行完循环左移指令后的显示为
| 2 | 5 | 2 | L | P | 3 | 9 | 4 |
|---|
第二位‘9’和第四位‘P’为闪烁显示。
6.循环右移指令A2H
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
在循环左移指令类似,但移动方向相反。
实验步骤
1、把7279阵列式键盘的J9四只短路帽打在上方,J10打在VCC处,用8P排线将JD7和八位动态数码显示的JD11相连,JD8和JD12相连。
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加“7279 KEY.asm”源程序,进行编译,直到编译无误。
4、全速运行程序,然后等待按键输入,并在有按键按下后显示相应的键号,前一个键号左移。
5、也可以把源程序编译成可执行文件,把可执行文件用ISP烧录器烧录到89S52/89S51芯片中运行。(ISP烧录器的使用查看附录二)
源程序
/****************************************************
实验步骤
1、把7279阵列式键盘的J9四只短路帽打在上方,J10打在VCC处,
用8P排线将JD7和八位动态数码显示的JD11相连,JD8和JD12相连。
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,
请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先打开本实验的项目文件"7279KEY.uv2",进行编译,直到编译无误。
4、全速运行程序,然后等待按键输入,并在有按键按下后显示相应的键号,前一个键号左移。
5、也可以把源程序编译成可执行文件,用ISP烧录器烧录到89S52/89S51芯片中运行。
(ISP烧录器的使用查看附录二)
//****************************************************/
BIT_COUNT DATA 07FH
TIMER DATA 07EH
TIMER1 DATA 07DH
TEN DATA 07CH
DATA_IN DATA 020H
DATA_OUT DATA 021H
KEY BIT P1.3 ;7279的KEY连接于P1.3
CLK BIT P1.6 ;7279的CLK连接于P1.6
DAT BIT P1.7 ;7279的DATA连接于P1.7
CS BIT P2.7 ;7279的CS连接于P2.7
ORG 000H
JMP START
ORG 100H
START: MOV SP,#2FH ;定义堆栈
MOV P1,#11011011B ;I/O口初始化
MOV TIMER,#50
START_DELAY: MOV TIMER1,#255
START_DELAY1:DJNZ TIMER1,START_DELAY1
DJNZ TIMER,START_DELAY
MOV DATA_OUT,#10100100B ;发复位指令
CALL SEND
SETB CS ;复位CS为高电平
MAIN: JB KEY,MAIN ;检测是否有键按下
MOV DATA_OUT,#00010101B ;有键按下,发送读键盘指令
CALL SEND ;调用发送子程序
CALL RECEIVE ;调用接受子程序
SETB CS
MOV B,#10
MOV A,DATA_IN
DIV AB
MOV TEN,A
MOV DATA_OUT,#10100001B
CALL SEND
MOV DATA_OUT,#10100001B
CALL SEND
MOV DATA_OUT,#10000001B
CALL SEND
MOV DATA_OUT,TEN
CALL SEND
MOV DATA_OUT,#10000000B
CALL SEND
MOV DATA_OUT,B
CALL SEND
SETB CS
WAIT: JNB KEY,WAIT
JMP MAIN
;*******************************************
; 发送子程序
;*******************************************
SEND: MOV BIT_COUNT,#8
CLR CS
CALL LONG_DELAY
SEND_LOOP: MOV C,DATA_OUT.7
MOV DAT,C
SETB CLK
MOV A,DATA_OUT
RL A
MOV DATA_OUT,A
CALL SHORT_DELAY
CLR CLK
CALL SHORT_DELAY
DJNZ BIT_COUNT,SEND_LOOP
CLR DAT
RET
;*******************************************
; 接收子程序
;*******************************************
RECEIVE: MOV BIT_COUNT,#8
SETB DAT
CALL LONG_DELAY
RECEIVE_LOOP: SETB CLK
CALL SHORT_DELAY
MOV A,DATA_IN
RL A
MOV DATA_IN,A
MOV C,DAT
MOV DATA_IN.0,C
CLR CLK
CALL SHORT_DELAY
DJNZ BIT_COUNT,RECEIVE_LOOP
CLR DAT
RET
;*******************************************
; 延时子程序
;*******************************************
LONG_DELAY: MOV TIMER,#80
DELAY_LOOP: DJNZ TIMER,DELAY_LOOP
RET
SHORT_DELAY:MOV TIMER,#6
SHORT_LP: DJNZ TIMER,SHORT_LP
RET
END
电路图


浙公网安备 33010602011771号