file7.asm

来自「单片机学习系统附的实验源代码」· 汇编 代码 · 共 141 行

ASM
141
字号
;    这是  读取键盘的子程序
;    主要内容为:如何定义位,如何得到按键状态,防止键盘干扰的方法
;    以及如何处理读入的键值
;    思路:首先在某一引脚输出一个电平,然后读入引脚的电平,如果刚好相反
;    那么可能有按键发生,但是不排除干扰,为了防止干扰,需要软件延时20ms
;    消除干扰,然后,等待用户释放,否则,可能重复的到某种结果,发生意外情况
;现象;我们按不同的按键,会用数码管在不同的位置显示不同的结果1/2/3来
       

    beep   bit  p3.7          ;  蜂鸣器定义
    
	segdata equ p0      ;数据 输出
	sege    equ p2.7    ;显示 选中
	segb    equ p2.6    ;位 选
	segd    equ p2.5    ;段 选
	
	key1   bit   p3.3         ;  按键引脚定义
	key2   bit   p3.4         ;
	key3   bit   p3.5         ;
	key    equ   46h          ;  按键寄存单元


	org 00h              
	jmp main    
	
	org 030h

   main:mov sp,#30h           ;首先定义
        lcall REST            ;初始化子程序
     lp:lcall pro_key         ;调用键盘查询子程序
        lcall KEYPR           ;用来显示所查询到的键值
       jmp lp                 ;反复调用,不断查询

   REST: 	
		mov a,#00h
		mov b,#00h
		mov p0,#0
		mov p1,0ffh
        mov key,#00h
	    mov p2,#255
        clr beep
      RET
                
  KEYPR: mov a,key                           ;键值在累加器KEY中
         jz  PROEND                          ;如果 A= 0,表示没有按键,返回
         cjne a,#1,k1                        ; A= 1 ,用户按了第一个键
         mov a,#1                            ;处理 A = 1的情况
         mov dptr,#tab_nu                    ;查表
         movc a,@a+dptr    
         
         clr sege                            ;选中显示
         mov segdata,a                       ;显示 "1" 
         setb segd
         nop
         clr segd
         
         mov segdata,#1                      ;显示 "1" 
         setb segb
         nop
         clr segb
         
         jmp  PROEND                         ;处理完成,子程序返回
                                             ;以下分别处理 KEY = 2,3 的情况
     k1: cjne a,#2,k2
         mov a,#2
         mov dptr,#tab_nu
         movc a,@a+dptr
         mov segdata,a                      ;显示 "2" 
         setb segd
         nop
         clr segd
         
         mov segdata,#2                      ;显示 "2" 
         setb segb
         nop
         clr segb
         
         jmp PROEND
     k2: cjne a,#3, PROEND
         mov a,#3
         mov dptr,#tab_nu
         movc a,@a+dptr
         mov segdata,a                      ;显示 "3" 
         setb segd
         nop
         clr segd
         
         mov segdata,#4                      ;显示 "3" 
         setb segb
         nop
         clr segb
  PROEND:ret

pro_key:                 ;键盘查询子程序
	setb key1            ;首先输出高电平,检测低电平的到来
	setb key2            ;不同电路,可能检测方式不一样
	setb key3
	jb key1,ke1          ;如果用户没有按第一个键,到第下个处理部分,
	mov key,#1           ;表示用户按了第一个键
	lcall delay20ms      ;软件延时,防止干扰
	jmp pro_key          ;重新查询,直到用户释放按键
ke1:jb key2,ke2          ;处理第二个按键,如果没有到下一个处理部分
    mov key,#2           ;以下和第一个处理单元相似。
	lcall delay20ms
	jmp pro_key
ke2:jb key3,ke3
    mov key,#3
	lcall delay20ms
	jmp pro_key
ke3:ret
;************  定时20 ms  *************
delay20ms:  
        push psw              ; 保存原来的寄存器单元
        clr psw.3             ; 设置新的寄存器
	    clr psw.4             ; 
	    mov r0,#2             ; 延时参数1 
		mov r1,#250           ; 延时参数2
		mov r2,#1             ; 延时参数3
    dl1:djnz r0,dl1           ; 延时循环1
    	mov r0,#250           ; 重新设置循环数据
    dl2:djnz r1,dl1           ; 开始第二道循环 
        mov r0,#240           ;
        mov r1,#248           ; 
    dl3:djnz r2,dl1           ; 第三道循环
		nop                   ;  修正定时精度
		pop psw               ;  恢复原来的寄存器组
        ret                   ;  返回
;***********  end  *******************

;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
;比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推

tab_nu: 
       db 0c0h,  0f9h, 0a4h, 0b0h,   99h ,  92h ,  82h, 0f8h ; 数字0-7 不带小数点代码
       db 80h ,  90h,  88h ,  83h ,  0c6h,  0a1h,  86h, 8eh  ; 数字8-f   不带小数点代码
       db 40h ,  79h,  24h ,  30h ,  19h ,  12h ,  02h, 78h  ; 数字0-7  带小数点代码
       db 00h ,  10h,  08h ,  03h ,  46h ,  21h ,  06h, 0eh  ; 数字8-f   带小数点代码

      end    ;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?