📄 kb_c51.asm
字号:
;晶振: 11.0592
led_red equ p1.0
led_green equ p1.1
spk equ p1.2
key_clock equ p3.3
key_data equ p3.4
/*
row1 equ p1.7
row2 equ p1.6
row3 equ p1.5
row4 equ p1.4
col1 equ p1.3
col2 equ p1.2
col3 equ p1.1
col4 equ p1.0
*/
dly_20 equ 20
dly_30 equ 30
dly_40 equ 40
dly_50 equ 50
org 0000h
jmp start
;---------------------------------------------------------------------
org 0003h ;int_0
ljmp int_0
;---------------------------------------------------------------------
org 000bh
;timer_0
;---------------------------------------------------------------------
org 0013h ;int_1
ljmp int_1
;---------------------------------------------------------------------
org 001bh
;timer_1
;---------------------------------------------------------------------
org 0023h
;serial_1
;---------------------------------------------------------------------
org 002bh
;timer_2
;---------------------------------------------------------------------
org 0030h
;
int_0:
clr EA
;
setb EA
reti
;
int_1: ;主机拉低100us时触发
clr EA
/*
mov r1,0 ;
i12: JNB KEY_CLOCK,i11 ;等待时钟转为高电平
djnz r1,i12
jmp i1end
i11: jnb KEY_DATA,i1end ;数据线不为低,退出
;读入8位数据
mov r6,#01h
clr a
mov r3,a ;效验码计数
mov r5,a ;开始为0
i13:
mov r1,#20 ;延时20us
djnz r1,$
clr KEY_CLOCK ;拉低时钟线
mov r1,#40 ;延时40us
djnz r1,$
setb KEY_CLOCK ;释放时钟线
mov r1,#20 ;延时20us
djnz r1,$
jb KEY_DATA,i_bita ;读取数据线,为低(0)转移
mov a,r4
clr c
rrc a
orl a,#80h
mov r4,a
inc r3
i_bita:
mov a,r6
add a,acc
mov r6,a
inc r5
cjne r5,#0x08,i13
;读入效验位
mov r1,#20 ;延时20us
djnz r1,$
clr KEY_CLOCK ;拉低时钟线
mov r1,#40 ;延时40us
djnz r1,$
setb KEY_CLOCK ;释放时钟线
mov r1,#20 ;延时20us
djnz r1,$
jb KEY_DATA,i1_bitb ;读取数据线,为低(0)转移
mov r2,#01h
i1_bitb:
mov r2,#00h
;读入停止位
mov r1,#20 ;延时20us
djnz r1,$
clr KEY_CLOCK ;拉低时钟线
mov r1,#40 ;延时40us
djnz r1,$
setb KEY_CLOCK ;释放时钟线
mov r1,#20 ;延时20us
djnz r1,$
jb KEY_DATA,i1_err1 ;读取停止位,为0则有错误
mov r1,#20 ;延时20us
djnz r1,$
; jb KEY_DATA,i14 ;数据线为0吗?是转移
; jnb KEY_DATA,$ ;等待数据线
;i14:
;输出应答信号
mov r1,15 ;延时15us
djnz r1,$
clr key_data ;拉低数据线
mov r1,5 ;延时5us
djnz r1,$
clr key_clock ;拉低时钟线
mov r1,40 ;延时40us
djnz r1,$
setb key_clock ;释放时钟线
mov r1,5 ;延时5us
djnz r1,$
setb key_data ;释放数据线
mov a,r3
anl a,r2
cjne a,0x02,i15 ;效验吗正确,转移
jmp i1_err2
i15:
clr led_green
jmp i1end
i1_err2:
clr led_red
jmp i1end
i1_err1:
i1end:
*/
clr led_red
lcall delay_1s
setb led_red
lcall delay_1s
setb EA
reti
;字符表
TABLE: DB 0C0H,0F9H,0A4H,0B0H ;0-3
DB 099H,092H,082H,0F8H ;4-7
DB 080H,090H,088H,083H ;8-B
DB 0A7H,0A1H,086H,08EH ;C-F
;初始化
initial:
setb EA ;开中断
; setb EX0 ;INT0中断开
; clr IT0 ;INT0低电平触发(为1则为下降沿触发)
setb EX1 ;INT1中断开
clr IT1 ;INT1低电平触发(为1则为下降沿触发)
RET
;延时
DELAY_1S:
push 00H
push 01H
mov r0,#0FFH
delay1: mov r1,#0FFH
delay2: nop
nop
nop
djnz r1,delay2
djnz r0,delay1
pop 01H
pop 00H
ret
;开始
start:
lcall initial
; setb led_green
; clr led_red
; lcall delay_1s
; setb led_red
; clr led_green
loop:
; jb key_clock,
; lcall scan
; xrl a,#0FFH ;是否有键按下
; jz start
; lcall delay_1s
jmp loop
/*
scan:
mov r3,#0F7H ;扫描初始值
mov r1,#00H ;取码标志
scan1:
mov a,r3 ;开始扫描
mov P1,a ;将扫描值输出到P1
mov a,P1 ;读入P1,判断是否有键按下
mov r4,a ;存到R4,判断是否放开
setb c ;C=1
mov r5,#04H ;扫描P1.4~P1.7
l1:
rlc a ;将按键值左移一位
jnc keyin ;若C=0,有按下,执行KEYIN
inc r1 ;将指标值加1,继续扫描下一行
djnz r5,l1 ;扫描四行
mov a,r3 ;载入扫描值
setb c ;C=1
rrc a ;扫描下一列(P1.3~P1.0)
mov r3,a ;存回扫描值
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
LCALL DELAY_1s
jc scan1 ;C=1,尚未完成扫描
ret ;结束扫描
keyin:
mov r7,#10 ;延时,消除弹跳
d2: mov r6,#248
djnz r6,$
djnz r7,d2
d3:
mov a,P1 ;读入P1
xrl a,r4
jz d3
mov a,r1
mov DPTR,#TABLE
movc a,@a+DPTR
ret
*/
/*
jnb key_clock,low_c ;低电平转移
mov r1,dly_50 ;延时 50us
djnz r1,$
jb key_clock, ;还是高电平
*/
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -