单片机 > 单片机程序设计 > 详情

At89c51单片机键盘扫描和显示程序

发布时间:2020-08-31 发布时间:
|

;******************************************************
;* 名称:kbd
;* 功能:从键盘中读入按键值,存入寄存器A:r*4+c
;* 输入:
;* 输出: A=按键值
;******************************************************
 org 0000h
 ljmp main


 org 0200h
main:
init:
 MOV 60H,#10h
 MOV 61H,#10h
 MOV 62H,#10h
 MOV 63H,#10h
wait:  
 acall keyscan                 ;有键按下,转定按键位置扫描
 acall disp
 sjmp   wait

      
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                p1.7p1.6p1.5p1.4                        1110
                              R*4      
; p1.3   ----------/|--/|--/|--/|---------|===|----vcc
; p1.2   ----------/|--/|--/|--/|---------|===|----vcc
; p1.1   ----------/|--/|--/|--/|---------|===|----vcc
; p1.0   ----------/|--/|--/|--/|---------|===|----vcc    1111
                     
keyscan: 
 mov R1,#0efh   ;0efh,依次扫描p1.4,p1.5,p1.6列
 mov R2,#0   ; 列数
ks_colum:
 mov P1,R1   ;
 nop
 nop
 mov A,P1   ;从p1口取得行信息
 
 orl a, #0f0h

 mov r3,#0                       ;行数
ks_row: 
 rrc a

 jnc ks_wait_release
 inc r3 
 cjne r3,#5,ks_row
  
ks_this_colum_none:    ; 该列无键按下
 mov A,R1   ; 扫描下一列
 rl A
 mov R1,A

 inc r2
 cjne r2,#4,ks_colum

error:  clr A    ; 所有列无键按下,返回0
 jmp ks_end
ks_wait_release:
 mov p1,#0fh
 
 mov a,p1
 orl a,#0f0h
 cpl a
 jnz ks_wait_release
ks_decode: 
 mov a,r3
 rl a
 add a,r3                        
 add a,r2                        ;r3*3+r2
 add a,#1h

set_disp_bit: 
 mov r0,#63h   ;放入显示缓冲
 mov @r0,a
 

ks_end: 
 ret
 
 ;<<<<<< <<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<  
disp:
disp_number:
 push acc
 MOV R0,#60H     ;显示数码存放在0x60~0x63(BCD形式)
 MOV R3,#0feH               ;把显示位码取到R3
display_scan:
 MOV A,@R0
 MOV R2,A     ;把显示数码取到R2
 
 ACALL display_a_bit
 ACALL delay
 
 MOV A,R3
 RL                       ;下一位码
 
 MOV R3,A
 
 INC R0;下一显示数码
 CJNE R0,#64H,display_scan
 pop acc
 ret
 
;*******************************************************************************************
;r2=显示数据 r3=显示位(0feh,0fdh,0fbh,0f7h分别指第1,2,3,4位)
led_digit1 equ 0feh
led_digit2 equ 0fdh
led_digit3 equ 0fbh
led_digit4 equ 0f7h

display_a_bit:
 MOV DPTR,#table
next:
 MOV A,R2
 MOVC A,@A+DPTR
 MOV P0,A                   ;取段码:TABLE1+x
 
 MOV A,R3
 MOV P2,A                   ;输出位码

 RET
;*******************************************************************************************
delay:
 MOV R6,#04H
d1:    
 MOV R7,#248
 DJNZ R7,$
 DJNZ R6,d1
 RET                        ;延迟 1us+4*(1us+2us*248+2us)+2us=1999us,约2ms

;*******************************************************************************************
                   
                     p0.0~p0.7----/-------------------------------------
                                                              |
                              ===a===         =======      ======     ====== 
                            f|       | b                    
                              ====g===       |=======|    |======|   |======| 
                            e|       | c                    
                              ===d== oh       ====== o     ===== o    ===== o
                                                                   |
                     p2.0----------/------------+--------------+------------+
;
                         p0: ghfedcba
                             xxxxxxxx (请确认连接),如共阴数码管:0000 0110,显示1.
table:  '0'  '1'  '2' '3'  '4' '5'  '6' '7' '8' '9',共阴
 db 3fh,06h,5bh,4fh,66h;0-4
  db 6dh,7dh,07h,7fh,6fh;5-9
  db 77h,7ch,39h,5eh,86h;A,b,C,d,E
 db 00h;关数码管
 end




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机按键切换下一首歌