3924|5

4

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

电子密码锁 程序问题 [复制链接]

呵呵,小弟我作毕业设计遇到难题了,附件是原理图,用protues打开就可以了,

我程序部分很很有点问题。
各位大侠就帮帮忙啊

这个4*4键盘扫描程序在下面,这个搞好了,我的毕业设计论文基本就搞好了,等待 :'(



SAOMIAO:                       ;扫描子程序
  MOV R7,#0F7H                 ;输出扫描码(列:1111)(行:0111),扫描第一行
  MOV R6,#00H                  ;用于检测哪个按键被按下
HANGSAO:
  MOV A,R7
  MOV P1,A                     ;开始扫描行
    SETB C
  MOV R5,#04H                  ;扫描同一行的4个按键
LIESAO:
  RLC A
  JNC PANDUAN                  ;检测当前按键是否被下,如果有马上跳到判断子程序
  INC R6                       ;如果当前没有按键被按下则检测下一个
  DJNZ R5,LIESAO               ;检测完本行的4个按键,则跳出
  MOV A,R7
  SETB C
  RRC A
  MOV R7,A                     ;扫描码右移一位,开始扫描下一行
  JC HANGSAO                   ;没有扫描完4行则跳到HANGSAO继续扫描,已扫描完4行就返回
  RET
PANDUAN:                        ;判断是那个开关被按下
  LCALL DEL                     ;调用消抖延时子程序
  MOV A,R6
  XRL A,#00H
  JZ KAIGUAN1                   ; 开关被按下跳转按键1功能子程序
  MOV A,R6
  XRL A,#01H
  JZ KAIGUAN2                   ; 开关被按下跳转按键2功能子程序
  MOV A,R6
  XRL A,#02H
  JZ KAIGUAN3                   ; 开关被按下跳转按键3功能子程序
  MOV A,R6
  XRL A,#03H
  JZ KAIGUAN4                   ; 开关被按下跳转按键4功能子程序
  MOV A,R6
  XRL A,#04H
  JZ KAIGUAN5                   ; 开关被按下跳转按键5功能子程序
  MOV A,R6
  XRL A,#05H
  JZ KAIGUAN6                   ; 开关被按下跳转按键6功能子程序
  MOV A,R6
  XRL A,#06H
  JZ KAIGUAN7                   ; 开关被按下跳转按键7功能子程序
  MOV A,R6
  XRL A,#07H
  JZ KAIGUAN8                   ; 开关被按下跳转按键8功能子程序
  MOV A,R6
  XRL A,#08H
  JZ KAIGUAN9                   ; 开关被按下跳转按键9功能子程序
  MOV A,R6
  XRL A,#09H
  JZ KAIGUAN10                  ; 开关被按下跳转按键10功能子程序
  MOV A,R6
  XRL A,#0AH
  JZ KG11                       ; 开关被按下跳转按键11功能子程序
  MOV A,R6
  XRL A,#0BH
  JZ KG12                       ; 开关被按下跳转按键12功能子程序
  MOV A,R6
  XRL A,#0CH
  JZ KG13                       ; 开关被按下跳转按键13功能子程序
  MOV A,R6
  XRL A,#0DH
  JZ KG14                       ; 开关被按下跳转按键14功能子程序
  MOV A,R6
  XRL A,#0EH
  JZ KG15                       ; 开关被按下跳转按键15功能子程序
  MOV A,R6
  XRL A,#0FH
  JZ KG16                       ; 开关被按下跳转按键16功能子程序
  LJMP SAOMIAO
KG11:
  LJMP KAIGUAN11
KG12:
  LJMP KAIGUAN12
KG13:
  LJMP KAIGUAN13
KG14:
  LJMP KAIGUAN14
KG15:
  LJMP KAIGUAN15
KG16:
  LJMP KAIGUAN16

DEL:                           ;消抖延时子程序
  MOV 3FH,#5
D1:
  MOV 3EH,#200
  DJNZ 3EH,$
  DJNZ 3FH,D1
  RET
KAIGUAN1:                       ;按键1功能子程序
    MOV 30H,#01H                 
  RET                           ;按键2功能子程序
KAIGUAN2:
   MOV 30H,#02H
  RET
KAIGUAN3:                       ;按键3功能子程序
   MOV 30H,#03H
  RET
KAIGUAN4:                       ;按键4功能子程序
    MOV 30H,#04H
  RET
KAIGUAN5:                       ;按键5功能子程序
    MOV 30H,#05H
  RET
KAIGUAN6:                        ;按键6功能子程序
    MOV 30H,#06H
  RET
KAIGUAN7:                        ;按键7功能子程序
    MOV 30H,#07H
  RET
KAIGUAN8:                        ;按键8功能子程序
    MOV 30H,#08H
  RET
KAIGUAN9:                        ;按键9功能子程序
    MOV 30H,#09H
  RET
KAIGUAN10:                       ;按键10功能子程序
    MOV 30H,#00H
  RET


;;;;;KAIGUAN11:,不用这个开关

  
  KAIGUAN12:                       ;开锁子程序 (按键12功能子程序)
  MOV A,30H
  XRL A,40H                      ;检查输入密码是否正确
  JNZ BAOJING                    ;不正确调用报警子程序报警2S
  MOV A,31H
  XRL A,41H
  JNZ BAOJING
  MOV A,32H
  XRL A,42H
  JNZ BAOJING
  MOV A,33H
  XRL A,43H
  JNZ BAOJING
  MOV A,34H
  XRL A,44H
  JNZ BAOJING
  MOV A,35H
  XRL A,45H
  JNZ BAOJING
  SETB P0.0                        ;输入密码正确绿灯点亮
  RET
KAIGUAN13:                         ;修改密码确认子程序 (按键13功能子程序)
  JNB P0.0,BUGAI                   ;判断绿是否点亮
  MOV 40H,30H                      ;把当前数据设为密码
  MOV 41H,31H
  MOV 42H,32H
  MOV 43H,33H
  MOV 44H,34H
  MOV 45H,35H
  CLR P0.0                         ;密码修改成功,关闭绿灯
BUGAI:
  RET
KAIGUAN14:                         ;关闭子程序  (按键14功能子程序)
  MOV P0,#00H                     ;关闭报警
  RET
BAOJING:                         ;报警子程序
  SETB P0.1                      ;启动报警
  SETB P0.2
  
  RET
KAIGUAN15:                      ;清除当前显示的最高位子程序(按键15功能子程序)
  MOV A,35H
  XRL A,#0FFH
  JNZ G1                        ;判断35H是否有显示,有则跳转
  MOV A,34H
  XRL A,#0FFH
  JNZ G2                        ;判断34H是否有显示,有则跳转
  MOV A,33H
  XRL A,#0FFH
  JNZ G3                        ;判断33H是否有显示,有则跳转
  MOV A,32H
  XRL A,#0FFH
  JNZ G4                        ;判断32H是否有显示,有则跳转
  MOV A,31H
  XRL A,#0FFH
  JNZ G5                        ;判断31H是否有显示,有则跳转
  MOV A,30H
  XRL A,#0FFH
  JNZ G6                        ;判断30H是否有显示,有则跳转
GG:
  MOV @R1,#0FFH                 ;把0FFH赋给当前显示的最高位
  RET
G1:
  MOV R1,#35H
  LJMP GG
G2:
  MOV R1,#34H
  LJMP GG
G3:
  MOV R1,#33H
  LJMP GG
G4:
  MOV R1,#32H
  LJMP GG
G5:
  MOV R1,#31H
  LJMP GG
G6:
  MOV R1,#30H
  LJMP GG
KAIGUAN16:                      ;清除当前显示的最低位子程序(按键16功能子程序)
  MOV A,31H
  CLR C
  SUBB A,#10H
  MOV 30H,A                     ;把31H的数据给30H
  MOV A,32H
  CLR C
  SUBB A,#10H
  MOV 31H,A                     ;把32H的数据给31H
  MOV A,33H
  CLR C
  SUBB A,#10H
  MOV 32H,A                     ;把33H的数据给32H
  MOV A,34H
  CLR C
  SUBB A,#10H
  MOV 33H,A                      ;把34H的数据给33H
  MOV A,35H
  CLR C
  SUBB A,#10H
  MOV 34H,A                      ;把35H的数据给34H
  MOV 35H,#0FFH                  ;#0FFH赋给35H,35H显示时变为黑屏
  RET
DEL2S:                           ;延时2S子程序
  MOV 4FH,#20
D2S:
  MOV 4EH,#200
D2S1:
  MOV 4DH,#250
  DJNZ 4DH,$
  DJNZ 4EH,D2S1
  DJNZ 4FH,D2S
  RET

liang514上午10点.rar

19 KB, 下载次数: 27

此帖出自单片机论坛

最新回复

汇编初学者 以后希望多多指教,受教了 很详细  详情 回复 发表于 2009-11-16 13:59
点赞 关注
个人签名千水三千,我取一瓢饮
 

回复
举报

331

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 
不懂汇编 帮你顶下~  抢个沙发~:D
此帖出自单片机论坛
 
 

回复

4

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

谢谢啊
此帖出自单片机论坛
 
个人签名千水三千,我取一瓢饮
 
 

回复

1583

帖子

0

TA的资源

五彩晶圆(高级)

4
 
这是你的程序,我大至看了一下,发现有几个问题,我已经用“{}”做标记:


   SAOMIAO:                       ;扫描子程序
  MOV R7,#0F7H                 ;输出扫描码(列:1111)(行:0111),扫描第一行
  MOV R6,#00H                  ;用于检测哪个按键被按下
HANGSAO:
  MOV A,R7
  MOV P1,A                     ;开始扫描行
    SETB C
        MOV A,P1                                        ;{忘了加这条指令啦,下面你的程序将读不到按键值的}
  MOV R5,#04H                  ;扫描同一行的4个按键
LIESAO:
  RLC A                                                        ;{上面缺了一个回读P1口值的指令}
  JNC PANDUAN                  ;检测当前按键是否被下,如果有马上跳到判断子程序
  INC R6                       ;如果当前没有按键被按下则检测下一个
  DJNZ R5,LIESAO               ;检测完本行的4个按键,则跳出
  MOV A,R7
  SETB C
  RRC A
  MOV R7,A                     ;扫描码右移一位,开始扫描下一行
  JC HANGSAO                   ;没有扫描完4行则跳到HANGSAO继续扫描,已扫描完4行就返回
  RET
PANDUAN:                        ;判断是那个开关被按下
  LCALL DEL                     ;调用消抖延时子程序
  MOV A,R6
  XRL A,#00H
  JZ KAIGUAN1                   ; 开关被按下跳转按键1功能子程序
  MOV A,R6
  XRL A,#01H
  JZ KAIGUAN2                   ; 开关被按下跳转按键2功能子程序
  MOV A,R6
  XRL A,#02H
  JZ KAIGUAN3                   ; 开关被按下跳转按键3功能子程序
  MOV A,R6
  XRL A,#03H
  JZ KAIGUAN4                   ; 开关被按下跳转按键4功能子程序
  MOV A,R6
  XRL A,#04H
  JZ KAIGUAN5                   ; 开关被按下跳转按键5功能子程序
  MOV A,R6
  XRL A,#05H
  JZ KAIGUAN6                   ; 开关被按下跳转按键6功能子程序
  MOV A,R6
  XRL A,#06H
  JZ KAIGUAN7                   ; 开关被按下跳转按键7功能子程序
  MOV A,R6
  XRL A,#07H
  JZ KAIGUAN8                   ; 开关被按下跳转按键8功能子程序
  MOV A,R6
  XRL A,#08H
  JZ KAIGUAN9                   ; 开关被按下跳转按键9功能子程序
  MOV A,R6
  XRL A,#09H
  JZ KAIGUAN10                  ; 开关被按下跳转按键10功能子程序
  MOV A,R6
  XRL A,#0AH
  JZ KG11                       ; 开关被按下跳转按键11功能子程序
  MOV A,R6
  XRL A,#0BH
  JZ KG12                       ; 开关被按下跳转按键12功能子程序
  MOV A,R6
  XRL A,#0CH
  JZ KG13                       ; 开关被按下跳转按键13功能子程序
  MOV A,R6
  XRL A,#0DH
  JZ KG14                       ; 开关被按下跳转按键14功能子程序
  MOV A,R6
  XRL A,#0EH
  JZ KG15                       ; 开关被按下跳转按键15功能子程序
  MOV A,R6
  XRL A,#0FH
  JZ KG16                       ; 开关被按下跳转按键16功能子程序
  LJMP SAOMIAO


;*************************************************************
;{你上面的判断程序使用了跳转指令JZ XXXXXX,而在子程序里却用RET
;做返回,这样程序会发生溢出的,程序飞到哪都不知道了。
;应该用AJMP XXXX做返回,这个程序可以用AJMP SAOMIAO做返回}
;*************************************************************

KG11:                                                         ;{你后面的KG11没用到,应该把它的检测跳过去,
                                                                ;或才在KG11子程序里放一返回的指令把它略过}
  LJMP KAIGUAN11
KG12:
  LJMP KAIGUAN12
KG13:
  LJMP KAIGUAN13
KG14:
  LJMP KAIGUAN14
KG15:
  LJMP KAIGUAN15
KG16:
  LJMP KAIGUAN16

DEL:                           ;消抖延时子程序
  MOV 3FH,#5
D1:
  MOV 3EH,#200
  DJNZ 3EH,$
  DJNZ 3FH,D1
  RET
KAIGUAN1:                       ;按键1功能子程序
    MOV 30H,#01H                 
  RET                           ;按键2功能子程序
KAIGUAN2:
   MOV 30H,#02H
  RET
KAIGUAN3:                       ;按键3功能子程序
   MOV 30H,#03H
  RET
KAIGUAN4:                       ;按键4功能子程序
    MOV 30H,#04H
  RET
KAIGUAN5:                       ;按键5功能子程序
    MOV 30H,#05H
  RET
KAIGUAN6:                        ;按键6功能子程序
    MOV 30H,#06H
  RET
KAIGUAN7:                        ;按键7功能子程序
    MOV 30H,#07H
  RET
KAIGUAN8:                        ;按键8功能子程序
    MOV 30H,#08H
  RET
KAIGUAN9:                        ;按键9功能子程序
    MOV 30H,#09H
  RET
KAIGUAN10:                       ;按键10功能子程序
    MOV 30H,#00H
  RET


KAIGUAN11:;不用这个开关
AJMP SAOMIAO  ;{我给你用了条转回主程序的指令来略过它}

  
  KAIGUAN12:                       ;开锁子程序 (按键12功能子程序)
  MOV A,30H
  XRL A,40H                      ;检查输入密码是否正确
  JNZ BAOJING                    ;不正确调用报警子程序报警2S
  MOV A,31H
  XRL A,41H
  JNZ BAOJING
  MOV A,32H
  XRL A,42H
  JNZ BAOJING
  MOV A,33H
  XRL A,43H
  JNZ BAOJING
  MOV A,34H
  XRL A,44H
  JNZ BAOJING
  MOV A,35H
  XRL A,45H
  JNZ BAOJING
  SETB P0.0                        ;输入密码正确绿灯点亮
  RET
KAIGUAN13:                         ;修改密码确认子程序 (按键13功能子程序)
  JNB P0.0,BUGAI                   ;判断绿是否点亮
  MOV 40H,30H                      ;把当前数据设为密码
  MOV 41H,31H
  MOV 42H,32H
  MOV 43H,33H
  MOV 44H,34H
  MOV 45H,35H
  CLR P0.0                         ;密码修改成功,关闭绿灯
BUGAI:
  RET
KAIGUAN14:                         ;关闭子程序  (按键14功能子程序)
  MOV P0,#00H                     ;关闭报警
  RET
BAOJING:                         ;报警子程序
  SETB P0.1                      ;启动报警
  SETB P0.2
  
  RET
KAIGUAN15:                      ;清除当前显示的最高位子程序(按键15功能子程序)
  MOV A,35H
  XRL A,#0FFH
  JNZ G1                        ;判断35H是否有显示,有则跳转
  MOV A,34H
  XRL A,#0FFH
  JNZ G2                        ;判断34H是否有显示,有则跳转
  MOV A,33H
  XRL A,#0FFH
  JNZ G3                        ;判断33H是否有显示,有则跳转
  MOV A,32H
  XRL A,#0FFH
  JNZ G4                        ;判断32H是否有显示,有则跳转
  MOV A,31H
  XRL A,#0FFH
  JNZ G5                        ;判断31H是否有显示,有则跳转
  MOV A,30H
  XRL A,#0FFH
  JNZ G6                        ;判断30H是否有显示,有则跳转
GG:
  MOV @R1,#0FFH                 ;把0FFH赋给当前显示的最高位
  RET
G1:
  MOV R1,#35H
  LJMP GG
G2:
  MOV R1,#34H
  LJMP GG
G3:
  MOV R1,#33H
  LJMP GG
G4:
  MOV R1,#32H
  LJMP GG
G5:
  MOV R1,#31H
  LJMP GG
G6:
  MOV R1,#30H
  LJMP GG
KAIGUAN16:                      ;清除当前显示的最低位子程序(按键16功能子程序)
  MOV A,31H
  CLR C
  SUBB A,#10H
  MOV 30H,A                     ;把31H的数据给30H
  MOV A,32H
  CLR C
  SUBB A,#10H
  MOV 31H,A                     ;把32H的数据给31H
  MOV A,33H
  CLR C
  SUBB A,#10H
  MOV 32H,A                     ;把33H的数据给32H
  MOV A,34H
  CLR C
  SUBB A,#10H
  MOV 33H,A                      ;把34H的数据给33H
  MOV A,35H
  CLR C
  SUBB A,#10H
  MOV 34H,A                      ;把35H的数据给34H
  MOV 35H,#0FFH                  ;#0FFH赋给35H,35H显示时变为黑屏
  RET
DEL2S:                           ;延时2S子程序
  MOV 4FH,#20
D2S:
  MOV 4EH,#200
D2S1:
  MOV 4DH,#250
  DJNZ 4DH,$
  DJNZ 4EH,D2S1
  DJNZ 4FH,D2S
  RET

[ 本帖最后由 huchuan987 于 2009-5-15 00:36 编辑 ]
此帖出自单片机论坛
 
个人签名
 
 

回复

1583

帖子

0

TA的资源

五彩晶圆(高级)

5
 
对了,你的附件用Proteus打开没有内容。

这个是我以前编写的程序,你可以参考一下:


;*************************************************
;***************按键判断子程序********************
;*************************************************

WAIT:       MOV P1,#0FH                         ;让P1口的高四位为0,低四位为1
        NOP
        NOP
        MOV A,P1                         ;读P1口的状态,
        CJNE A,#0FH,KEY_IN         ;当P1口的值为0F时,表示没有按键按下
                                                                          ;如果不为0FH时就表示有按键按下
        AJMP WAIT

KEY_IN:        LCALL TIM_20MS                 ;延时20MS,防按键抖动
        MOV P1,#0FH                         ;重新测试一次P1口是否有按键按下
        MOV A,P1
        CJNE A,#0FH,KEY_REAL ;如果此时P1口的值还是不为0FH,
                                                                         ;说明真的有按键按下,转按键处理程序
        AJMP WAIT

KEY_REAL:                                                         ;读键值子程序
        CPL A                                 ;把A取反
        ANL A,#0FH                         ;屏蔽掉A中的高四位
        MOV 33H,A                         ;保存低四位的值
        MOV P1,#0F0H                 ;让高四位为1,低四位为0
        NOP
        MOV A,P1
        CPL A                                 
        ANL A,#0F0H                         ;屏蔽掉低四位
        ORL A,33H                         ;让高四位的值与刚才保存的低四位的值相或
                                                                         ;一起拼装成按键行列值。
        MOV 33H,A                         ;保存键行列值
        MOV R4,#00H                         ;开始判断按键,用R4放置按键真实值       
        MOV DPTR,#KEY_TAB         ;把键值表地址装入数据指针
        MOV R5,#0FH

KEY_NUMBER:               
                CLR A
        MOVC A,@A+DPTR                 ;读取键值表的值
        CJNE A,33H,KEY_NO         ;把读到的内容与按键行列值做比较,如果不一样则继续判断
        AJMP KEY_YES

KEY_NO:                       
               INC R4
        INC DPTR
        DJNZ R5,KEY_NUMBER
        AJMP WAIT

KEY_YES:               
                NOP
KEY_OFF:               
                MOV P1,#0FH           ;等侍键释放
        NOP
        NOP
        MOV A,P1
        CJNE A,#0FH,KEY_OFF
        MOV A,R4
        ADD A,R4                ;相当于把A的内容乘2,因为AJMP XXX指令占用两个字节,
        ;ADD A,R4                ;如果是用LJMP XXXX指令,那么要加上这条指令,因为LJMP占用三字节
        MOV DPTR,#JUMP_TAB;装入跳转初始地址值
        JMP @A+DPTR                  ;跳转相应按按程序
JUMP_TAB:               
                AJMP KG1
        AJMP KG2
        AJMP KG3
        AJMP KG4
        AJMP KG5
        AJMP KG6
        AJMP KG7
        AJMP KG8
        AJMP KG9
        AJMP KG10
        AJMP KG11
        AJMP KG12
        AJMP KG13
        AJMP KG14
        AJMP KG15
        AJMP KG16
        AJMP WAIT
KG1:

KG2:

KG3:

KG4:

KG5:

KG6:

KG7:

KG8:

KG9:

KG10:

KG11:
       
KG12:

KG13:

KG14:

KG15:

KG16:


TIM_20MS:                MOV R7,#100
TIM1:                        MOV R6,#100
                        DJNZ R6,$
                        DJNZ R7,TIM1
                        RET
NUMTAB: DB 0FCh,60h,0DAh,0F2h,66h,0B6h,0BEh,0E4h,0FEh,0F6h,0EEh,3Eh,9Ch,7Ah,9Eh,8Eh,00H,00H        ;显示代码表
KEY_TAB: DB 81H,41H,21H,11H,82H,42H,22H,12H,84H,44H,24H,14H,88H,48H,28H,18H                ;键值代码表
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 

汇编初学者 以后希望多多指教

汇编初学者 以后希望多多指教,受教了 很详细
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表