如原理图所示 2片HC595组成静态数码管驱动 1片HC165组成静态键盘及编码开关驱动
center>
(原文件名:未命名.jpg) </center>
电路功能描述: 用HC595与HC165分别担当数码管以及键盘编码开关的静态方式驱动,即在无键按下时CPU不对这部分电路进行扫描,IO线上没有任何变化信号
减小干扰
键盘部分硬件电路:
旋转开关公共端以及按键开关公共端分别接至51的P1.6 P1.7端口,作为按键按下检测线,网络名RTINT以及SWINT,所有旋转开关其余两脚以及8
只按键开关的引脚分别接到74HC165的8条数线上,网络名CTRL1-CTRL8另有8只4148管的阳极分别与HC165的8条数据线相连,阴极连在一起引出
一条线与CPU P2.5,,相连,作为辅助触发端网络名SWTRG,
键盘电路工作流程:
上电后,SWTRG(扫描触发辅助)线置0,SWINT RTINT置1,,当键盘或者旋转编码按下后,对应的SWINT线(键盘扫描触发)或RTINT线(旋转开关扫描
触发)会以为二极管的作用被SWTRG下拉为0,CPU读到SWINT或RTINT口线为0后,将SWTRG线(扫描触发辅助)置1,并驱动HC165读出8条数据线上的
数据,(如果SWINT为0,则认为按键开关按下,如果RTINT为0,则是旋转开关接触) ,随后数据与CPU内以设置好的功能数据比较 ,与哪个相同,就
执行哪个功能程序.
现在为了测试方便 对应功能程序用LED代替
出现的问题: HC165跟HC595象有冲突一样 如果165读完数据后 不调用一次595的显示程序 165就会读出错误数据,读出的全是1,,,如果按照读165 写595
这样的循环,就没有问题,,,,,,,奇怪了
汇编程序:LCLK EQU P1.4
CLK EQU P1.0
SDA EQU P1.1
SWSD EQU P3.5
SWLD EQU P1.5
SWINT EQU P1.7
RTINT EQU P1.6
SWTRG EQU P2.5
LED1 EQU P2.3
LED2 EQU P2.2
LED3 EQU P2.1
ORG 0000H
LJMP INIT
ORG 0030H
;================================================
INIT: CLR SWLD
CLR LCLK
CLR CLK
SETB SWINT
SETB RTINT
CLR SWTRG
MOV 30H,#11111111B
MOV 31H,#11111111B
ACALL DISPLAY
;===============================================
GETKEY: JNB RTINT,ROSW
JNB SWINT,PBSW
AJMP GETKEY
;===============================================
ROSW: ACALL READKEY
MOV 30H,A
ACALL KEYVOL
AJMP GETKEY
PBSW: ACALL READKEY
MOV 31H, A
ACALL DISPLAY
CLR SWTRG
AJMP GETKEY
;==============================================
KEYVOL: MOV A,30H
CJNE A,#10000000B,OP1
ACALL DISPLAY
CLR SWTRG
KEYVOL1: ACALL READKEY
CJNE A,#11000000B,OP2
ACALL DISPLAY
CLR SWTRG
KEYVOL2: ACALL READKEY
CJNE A,#00000000B,OP3
ACALL DISPLAY
CLR SWTRG
CPL LED2
RET
OP1 : ACALL DISPLAY
CLR SWTRG
RET
OP2 : ACALL DISPLAY
CLR SWTRG
AJMP KEYVOL1
OP3 : ACALL DISPLAY
CLR SWTRG
AJMP KEYVOL2
;==============================================
READKEY: CLR A
CLR C
SETB SWTRG
NOP
NOP
SETB SWLD
NOP
NOP
CLR SWLD
NOP
NOP
SETB SWLD
MOV R1,#8
KEYLOOP: setb CLK
NOP
NOP
clr CLK
NOP
NOP
MOV C,SWSD
RRC A
DJNZ R1 ,KEYLOOP
CLR SWLD
RET
;==============================================
DISPLAY:
CLR LCLK ;禁止数据进入锁存器
SETB CLK ;使串行口无数据输出
ACALL SOUT
NOP
SETB LCLK
NOP
NOP
CLR LCLK
RET
SOUT: MOV R0,#08H ;寄存器送立即数
MOV A ,30H ;将字符"A."二进制编码送累加器
ACALL OUT ;调用串行数据输出子程序
MOV R0,#08H ;寄存器送立即数
MOV A ,31H
ACALL OUT
RET ;返回主程序
OUT: RRC A ;将A中数据进行通过进位位CY的右移
MOV SDA ,C ;将进位位CY的数据送p00做为一位串行数据输出
CLR CLK ;拉高移位时钟线形成时钟上升沿
NOP
SETB CLK ;拉低移位时钟线形成时钟下降沿
NOP
DJNZ R0,OUT ;检查R0数,据减1不为零则跳转回OUT继续移位
RET ;返回主程序
;=====================================================
DELAY: MOV R7,#255
D2: MOV R6,#255
DJNZ R6,$
DJNZ R7,D2
RET
END ;程序结束
一周热门 更多>