|
楼主 |
发表于 2014-8-19 21:48:23
|
显示全部楼层
本帖最后由 又一个暑假 于 2014-8-19 21:59 编辑
;/////////////////////////////////////////////////////////////////////////////////////////
;//矩阵键盘0—15按下按键显示对应的数值 ,没按之前显示"_"
;//
;////////////////////////////////////////////////////////////////////////////////////////
Key EQU P3 ;矩阵键盘接的I/O口
key_state EQU 20H ;用来标记消抖和防止多次触发
key_step_buffer EQU 30H ;消抖时键值的保存
key_step EQU 35H ;存储键值
key_count EQU 36H ;查表计数
ORG 0000H
SJMP STAR
ORG 1BH
LJMP Timer0_intrrupt ;装T1中断服务程序
;/////////////////////////////////////////////////////////////////////////////////////////
;//初始化
;//
;////////////////////////////////////////////////////////////////////////////////////////
star:
mov key_state,#00H
mov key_step,#00H
mov key_step_buffer,#00H
mov P0,#0ffH
mov P1,#0ffH
mov P2,#0aaH
mov IE,#088H ;
mov TMOD,#010H
mov TH1, #0D8H
mov TL1, #0EFH
setb TR1 ;启动T1
setb EA
;/////////////////////////////////////////////////////////////////////////////////////////
;//主程序一直循环显示
;//
;////////////////////////////////////////////////////////////////////////////////////////
loop:
lcall keystep_disp
ljmp loop
;/////////////////////////////////////////////////////////////////////////////////////////
;//键值显示程序
;//
;////////////////////////////////////////////////////////////////////////////////////////
keystep_disp:
mov a,key_step
cjne a,#00H,keystep_disp_1 ;判断是否都没按过
mov P0,#0f7h
ret
keystep_disp_1:
mov key_count,#0ffH
mov dptr,#kcodtab
rk_none:
clr a
movc a,@a+dptr
inc dptr
inc key_count
cjne a,key_step,rk_none ;按键查表
mov a, key_count
mov dptr,#segtab2
movc a,@a+dptr ;数码管查表
mov p0,a
lcall delay
ret
;/////////////////////////////////////////////////////////////////////////////////////////
;//功能:按键扫描
;//方法:线反转法
;////////////////////////////////////////////////////////////////////////////////////////
key_check:
mov Key,#0f0H
mov a,Key
cjne a,#0f0H,key_low
key_high:
mov key_state,#00H ;没键按下,标志位清零
exit:
ret
key_low:
jb key_state.0,key_unchange_1;有键按下判断是否抖动
setb key_state.0
mov Key,#0f0H
mov a,Key
orl a,#0fH
mov Key,a
mov key_step_buffer,Key
ret
key_unchange_1:
jb key_state.1,exit
mov Key,#0f0H
mov a,Key
orl a,#0fH
mov Key,a
mov a,Key
cjne a,Key_step_buffer,key_high
setb key_state.1 ;确定有键按下,自锁
mov key_step,Key_step_buffer
ret
;/////////////////////////////////////////////////////////////////////////////////////////
;//Timer0中断服务程序
;//功能:定时扫描按键
;////////////////////////////////////////////////////////////////////////////////////////
Timer0_intrrupt:
mov TH1,#0D8H
mov TL1,#0EFH
acall key_check ;检测按键
exit_interrupt:
reti
;/////////////////////////////////////////////////////////////////////////////////////////
;//延时子程序
;//
;////////////////////////////////////////////////////////////////////////////////////////
delay: mov r3,#20
delay1: mov r4,#50
djnz r4,$
djnz r3,delay1
ret
;/////////////////////////////////////////////////////////////////////////////////////////
;//kcodtab 按键0——15对应的键值
;//segtab2 共阳数码管对应的0——9
;////////////////////////////////////////////////////////////////////////////////////////
kcodtab:
db 11101110b,11011110b,10111110b,1111110b
db 11101101b,11011101b,10111101b,1111101b
db 11101011b,11011011b,10111011b,1111011b
db 11100111b,11010111b,10110111b,1110111b
segtab2:
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h
db 080h,090h,088h,083h,0c6h,0a1h,086h,08eh
END
|
|