⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kb_c51.asm

📁 用C51单片机模拟PS2键盘向PC机发送按键信息
💻 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 + -