74HC165扩展8按键4旋转编码问题 很棘手

2020-02-05 09:23发布

如原理图所示   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                                ;程序结束
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。