okeybomb 发表于 2008-7-13 15:00:23

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

如原理图所示   2片HC595组成静态数码管驱动 1片HC165组成静态键盘及编码开关驱动

center>http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_346523.jpg
(原文件名:未命名.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
CLKEQU P1.0
SDAEQU P1.1
SWSD EQU P3.5
SWLD EQU P1.5
SWINT EQU P1.7
RTINT EQU P1.6
SWTRG EQU P2.5
LED1 EQUP2.3
LED2 EQUP2.2
LED3 EQUP2.1


               ORG0000H
               LJMPINIT
               ORG0030H

;================================================
INIT:       CLR SWLD
               CLR LCLK
             CLR CLK
             SETB SWINT
             SETB RTINT
             CLRSWTRG
             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
             AJMPKEYVOL1
OP3   :      ACALL DISPLAY
               CLR   SWTRG
             AJMPKEYVOL2
;==============================================
READKEY:   CLRA
               CLRC
               SETB SWTRG
               NOP
             NOP
               SETB SWLD
             NOP
               NOP
             CLRSWLD
             NOP
               NOP
             SETB SWLD
             MOV R1,#8
KEYLOOP:   setbCLK
               NOP
               NOP
             clr   CLK
             NOP
               NOP
               MOVC,SWSD
               RRCA
DJNZ         R1    ,KEYLOOP
             CLR    SWLD
             RET
               
;==============================================
DISPLAY:      
                CLR   LCLK          ;禁止数据进入锁存器
                SETBCLK         ;使串行口无数据输出
                ACALL SOUT
                NOP
                SETBLCLK
                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的右移
                MOVSDA ,C         ;将进位位CY的数据送p00做为一位串行数据输出
                CLRCLK            ;拉高移位时钟线形成时钟上升沿
                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                              ;程序结束

okeybomb 发表于 2008-7-13 15:21:16

还有 PROTEUS 仿真不了二极管一接上去 按下开关后显示的就是悬浮电平 跟实际电路跟本不一样 不知道什么缘故

okeybomb 发表于 2008-7-13 19:21:09

没人知道么

okeybomb 发表于 2008-7-13 19:21:10

没人知道么

haydon123 发表于 2011-3-15 17:21:02

路过 不懂汇编

mcs8098 发表于 2012-5-14 21:48:28

有意思 值得一看

hamipeter 发表于 2012-5-15 00:31:38

抽空研究下
页: [1]
查看完整版本: 74HC165扩展8按键4旋转编码问题 很棘手