📄 训练项目九:ps2键盘的使用1.s
字号:
.module _训练项目九:PS2键盘的使用1.c
.area text(rom, con, rel)
; i -> R20
; t -> R16,R17
.even
_delay::
st -y,R20
;
; /****************************************************************************
; ** File Name: PS/2键盘的使用
; ** Createed By: Wangchangsong
; ** Create Date: 07/24/2008
; ** Version: 1.0
; ** Descriptions:
; **
; **---------------------------------------------------------------------------
; ** Modified By:
; ** Modified Date:
; ** Version:
; ** Descriptions:
; **
; ****************************************************************************/
; #include <lcd.h>
;
; /****************************************************************************
; ** Function Name: delay
; ** Descriptions: delay time
; ** Input Parameters: t
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void delay (unsigned int t) /*延时*/
; {
; unsigned char i;
; for (i=1;i<t;i++);
ldi R20,1
xjmp L5
L2:
L3:
inc R20
L5:
mov R2,R20
clr R3
cp R2,R16
cpc R3,R17
brlo L2
X0:
L1:
.dbline 0 ; func end
ld R20,y+
ret
; p -> R20,R21
; data -> R16
.even
_lcd_w::
st -y,R20
st -y,R21
; }
;
; /****************************************************************************
; ** Function Name: lcd_w
; ** Descriptions: write date
; ** Input Parameters: date
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void lcd_w(unsigned char data)
; {
; unsigned char *p=(unsigned char *)(LCD);
ldi R20,36864
ldi R21,144
L7:
;
; while((PINE&0x80)!=0x00);
L8:
sbic 0x1,7
rjmp L7
X1:
; dat;
sbi 0x18,0
; *p=data;
movw R30,R20
std z+0,R16
; cl_dat;
cbi 0x18,0
; req;
sbi 0x03,6
L10:
;
; while((PINE&0x80)==0x00);
L11:
sbis 0x1,7
rjmp L10
X2:
; cl_req;
cbi 0x03,6
L6:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.even
_lcd_init::
; }
;
; /****************************************************************************
; ** Function Name: lcd_init
; ** Descriptions:
; ** Input Parameters: void
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void lcd_init (void)
; {
; MCUCR=MCUCR|0x80;
in R24,0x35
ori R24,128
out 0x35,R24
; DDRB|=0x01;
sbi 0x17,0
; PORTB&=0xfe;
in R24,0x18
andi R24,254
out 0x18,R24
; DDRE=0x40;
ldi R24,64
out 0x2,R24
; PORTE=0xff;
ldi R24,255
out 0x3,R24
;
; cl_reset;
cbi 0x15,3
; delay(10);
ldi R16,10
ldi R17,0
xcall _delay
; set_reset;
sbi 0x15,3
; delay(10);
ldi R16,10
ldi R17,0
xcall _delay
; cl_req;
cbi 0x03,6
; delay(10);
ldi R16,10
ldi R17,0
xcall _delay
L13:
.dbline 0 ; func end
ret
.even
_lcd_clear::
; }
;
; /****************************************************************************
; ** Function Name: timeDelay
; ** Descriptions: delay time
; ** Input Parameters: uiTime
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void lcd_clear (void)
; {
; lcd_w(0xf4);
ldi R16,244
xcall _lcd_w
L14:
.dbline 0 ; func end
ret
; ch -> R20,R21
; y -> R10
; x -> R22
.even
_lcd_putsc::
xcall push_xgsetF00C
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
; }
;
; /****************************************************************************
; ** Function Name: lcd_putsc
; ** Descriptions:
; ** Input Parameters: x,y,ch
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
; void lcd_putsc (unsigned char x,unsigned char y,unsigned char *ch)
; {
; x+=2;
subi R22,254 ; addi 2
xjmp L17
L16:
; while (*ch!=0)
; {
; lcd_w(0xf0);
ldi R16,240
xcall _lcd_w
; lcd_w(x);
mov R16,R22
xcall _lcd_w
; lcd_w(y);
mov R16,R10
xcall _lcd_w
; lcd_w(*ch-0xa0);
movw R30,R20
ldd R16,z+0
subi R16,160
xcall _lcd_w
; ch++;
subi R20,255 ; offset = 1
sbci R21,255
; lcd_w(*ch-0xa0);
movw R30,R20
ldd R16,z+0
subi R16,160
xcall _lcd_w
; ch++;
subi R20,255 ; offset = 1
sbci R21,255
; if (x>=0x09)
cpi R22,9
brlo L19
X3:
; {
; x=2;
ldi R22,2
; y+=1;
inc R10
; }
xjmp L20
L19:
; else
; {
; x++;
inc R22
; }
L20:
; }
L17:
movw R30,R20
ldd R2,z+0
tst R2
brne L16
X4:
L15:
.dbline 0 ; func end
xjmp pop_xgsetF00C
; ch -> R22,R23
; y -> R10
; x -> R20
.even
_lcd_putse::
xcall push_xgsetF00C
mov R10,R18
mov R20,R16
ldd R22,y+6
ldd R23,y+7
; }
;
; /****************************************************************************
; ** Function Name: lcd_putse
; ** Descriptions:
; ** Input Parameters: x,y,ch
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
;
; void lcd_putse (unsigned char x,unsigned char y,unsigned char *ch)
; {
; x+=4;
subi R20,252 ; addi 4
xjmp L23
L22:
; while (*ch!=0){
; lcd_w(0xf1);
ldi R16,241
xcall _lcd_w
; lcd_w(x);
mov R16,R20
xcall _lcd_w
; lcd_w(y);
mov R16,R10
xcall _lcd_w
; lcd_w(*ch);
movw R30,R22
ldd R16,z+0
xcall _lcd_w
; ch++;
subi R22,255 ; offset = 1
sbci R23,255
; if (x>=19){
cpi R20,19
brlo L25
X5:
; x=4;
ldi R20,4
; y+=8;
mov R24,R10
subi R24,248 ; addi 8
mov R10,R24
; }else{
xjmp L26
L25:
; x++;
inc R20
; }
L26:
; }
L23:
movw R30,R22
ldd R2,z+0
tst R2
brne L22
X6:
L21:
.dbline 0 ; func end
xjmp pop_xgsetF00C
; ch -> y+4
; y -> R10
; x -> R20
.even
_lcd_putss::
xcall push_xgset300C
mov R10,R18
mov R20,R16
; }
;
; /****************************************************************************
; ** Function Name: lcd_putss
; ** Descriptions:
; ** Input Parameters: x,y,ch
; ** Output parameters: void
; ** Returned Value: void
; **---------------------------------------------------------------------------
; ****************************************************************************/
; void lcd_putss (unsigned char x,unsigned char y,unsigned char ch)
; {
; x+=4;
subi R20,252 ; addi 4
; lcd_w(0xf1);
ldi R16,241
xcall _lcd_w
; lcd_w(x);
mov R16,R20
xcall _lcd_w
; lcd_w(y);
mov R16,R10
xcall _lcd_w
; lcd_w(ch);
ldd R16,y+4
xcall _lcd_w
L27:
.dbline 0 ; func end
xjmp pop_xgset300C
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -