164驱动程序及说明
一、 概述
利用164芯片分时驱动,实现以较少的IO口扫描检测按键和实现LED、数码管的显示。
二、 164芯片说明
164芯片工作时序图
74164芯片为8位移位寄存器,串行输入,并行输出,含两个串行数据输入口(与非门输入)和一个串行时钟输入口。常用
型号
pcr仪的中文说明书矿用离心泵型号大全阀门型号表示含义汽车蓄电池车型适配表汉川数控铣床
为74HC164,兼容TTL电平,最高工作时钟频率20MHz,扇出系数10。
164芯片管脚分布图
三、 参考电路
四、 程序框图
五、 程序说明
1. 外部名称和全局变量申明
NAME BTNDISP
PUBLIC _BtnDisp ; 子程序名
PUBLIC _n_Button, _n_LEDDisp, _n_NumDisp
2. IO端口定义
PIO_164Clk EQU P0.0 ; 164时钟口,输出
PIO_164Data EQU P0.1 ; 164数据口,输出
PIO_BtnCom1 EQU P2.2 ; 第1组按键公用端,输入
PIO_BtnCom2 EQU P6.3 ; 第2组按键公用端,输入
PIO_LEDCom1 EQU P5.2 ; 第1组LED公用端,输出
PIO_LEDCom2 EQU P2.0 ; 第2组LED公用端,输出
PIO_NumCom1 EQU P5.1 ; 第1位数码管公用端,输出
PIO_NumCom2 EQU P5.0 ; 第2位数码管公用端,输出
3. 常量定义
无
4. 变量定义
DSEG SADDR ; 申明数据区
_n_Button: DS (16) ; 按钮输入数据,含按键压下、抬起、响应标志。
_n_LEDDisp: DS (2) ; LED显示灯分2组,每组最多8个
_n_NumDisp: DS (2) ; 2-8段码数码管显示数据
n_ScanChn: DS (1) ; 按键扫描通道号:0~7,每次子程序扫描2组*1个按键,8次全部扫描完。
n_DispChn: DS (1) ; 显示扫描通道号:0~3,每通道(1个数码管或1组LED)显示时间占1/4,刷新周期取决于子程序执行频率
5. 使用说明
作为常规子程序调用,如果直接嵌入主程序文件,无需外部名称和全局变量申明,程序中检测的按键数16,显示驱动8段数码管2个,及最多LED数16个。程序必须循环执行,每1~3mS执行一次比较合适,一个按键抬起或压下的确认时间(24mS~32mS)--(72ms~96mS),响应速度可以满足人的操作习惯感受,显示刷新频率250Hz--83Hz,一般低于40~50Hz就会有闪烁。
六、 源程序及注释
CSEG
_BtnDisp:
PUSH ax
PUSH bc
PUSH hl
; 关闭显示
set1 PIO_LEDCom1
set1 PIO_LEDCom2
set1 PIO_NumCom1
set1 PIO_NumCom2
; 按键检测
MOV a, #7
BTNDISP00:
clr1 PIO_164Clk
cmp a, n_ScanChn
bz $BTNDISP01
set1 PIO_164Data
br $BTNDISP02
BTNDISP01:
clr1 PIO_164Data
NOP
NOP
NOP
BTNDISP02:
set1 PIO_164Clk
dec a
cmp a, #0ffH
bnz $BTNDISP00
MOV a, n_ScanChn
MOV x, a
xor a, a
addw ax, #_n_Button
movw hl, ax
clr1 cy
bt PIO_BtnCom1, $BTNDISP03
set1 cy ; 键按下
BTNDISP03:
call !BTNDEAL
movw ax, hl
addw ax, #0008H
movw hl, ax
clr1 cy
bt PIO_BtnCom2, $BTNDISP04
set1 cy
BTNDISP04:
call !BTNDEAL
INC n_ScanChn
and n_ScanChn, #07H
; 显示驱动
; 显示占空比1/4
MOV c, #8
cmp n_DispChn, #0
bnz $BTNDISP110
MOV a, _n_LEDDisp
br $BTNDISP13
BTNDISP110:
cmp n_DispChn, #1
bnz $BTNDISP11
MOV a, _n_LEDDisp+1
br $BTNDISP13
BTNDISP11:
cmp n_DispChn, #2
bnz $BTNDISP12
MOV a, _n_NumDisp
br $BTNDISP13
BTNDISP12:
MOV a, _n_NumDisp+1
BTNDISP13:
clr1 PIO_164Clk
rolc a, 1
bc $BTNDISP14
set1 PIO_164Data
br $BTNDISP15
BTNDISP14:
clr1 PIO_164Data
NOP
NOP
NOP
BTNDISP15:
set1 PIO_164Clk
NOP
NOP
dbnz c, $BTNDISP13
NOP
set1 PIO_164Data
cmp n_DispChn, #0
bnz $BTNDISP160
clr1 PIO_LEDCom1
br $BTNDISP18
BTNDISP160:
cmp n_DispChn, #1
bnz $BTNDISP16
clr1 PIO_LEDCom2
br $BTNDISP18
BTNDISP16:
cmp n_DispChn, #2
bnz $BTNDISP17
clr1 PIO_NumCom1
br $BTNDISP18
BTNDISP17:
clr1 PIO_NumCom2
BTNDISP18:
INC n_DispChn
and n_DispChn, #3
BTNDISPXT:
POP hl
POP bc
POP ax
RET
; RETI
; 按键持续按下(连续3次),确认为按下,清除抬起计数和标志。
; 按键持续抬起(连续3次),确认为抬起,清除按下计数和标志,及响应标志。
; 如果按键从按下到抬起期间未得到响应,则丢失,不记忆。
BTNDEAL:
MOV a, [hl]
bnc $BTNDEAL03
; 按键按下
MOV x, a
and a, #00001100B
cmp a, #00001100B
bnz $BTNDEAL01
MOV a, x
and a, #11001100B
set1 a.6
br $BTNDEAL02
BTNDEAL01:
MOV a, x
ADD a, #00000100B
bt a.5, $BTNDEAL02
and a, #11001100B
BTNDEAL02:
MOV [hl], a
RET
; 按键抬起
BTNDEAL03:
MOV x, a
and a, #00000011B
cmp a, #00000011B
bnz $BTNDEAL04
MOV a, x
and a, #00100011B
set1 a.5
br $BTNDEAL02
BTNDEAL04:
MOV a, x
INC a
bt a.6, $BTNDEAL02
and a, #00100011B
br $BTNDEAL02
END