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

📄 ps2main.s

📁 AVR单片机(Atmega16)的PS2键盘驱动程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ps2main.c
	.area text(rom, con, rel)
	.dbfile D:/PROGRA~1/AVRTOO~1/Icc/include/delay.h
	.dbfunc e delay_1us _delay_1us fV
	.even
_delay_1us::
	.dbline -1
	.dbline 2
; #include <iom16v.h>
; #include <macros.h>
	.dbline 3
; #include "1602.h"
	nop
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay_nus _delay_nus fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nus::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 7
; #include "KeyCode.h"
; 
; #define uchar unsigned char
; #define uint  unsigned int
	.dbline 8
; 
	clr R20
	clr R21
	.dbline 9
; uchar Int_Number=0;               //中断计数器;
	xjmp L6
L3:
	.dbline 10
	xcall _delay_1us
L4:
	.dbline 9
	subi R20,255  ; offset = 1
	sbci R21,255
L6:
	.dbline 9
	cp R20,R22
	cpc R21,R23
	brlo L3
	.dbline -2
L2:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 14
; uchar Key_Value=0;             //键盘编码值;
; //extern Finish;
; //extern Key_Up;
; 
; void Init()
	.dbline 16
	clr R16
	clr R17
	xjmp L11
L8:
	.dbline 16
L9:
	.dbline 16
	subi R16,255  ; offset = 1
	sbci R17,255
L11:
	.dbline 16
; {PORTD = 0x06;
;  DDRD  = 0x00;
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L8
	.dbline -2
L7:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_nms _delay_nms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delay_nms::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 20
; // DDRD&=~0x06;             //110b,
;  //PORTD|=0x06;             //110b,PD1,PD2输入,上拉  
;  MCUCR=MCUCR&0xfc;       //INT0低电平中断
;  GICR|=(1<<INT0);       //INT0中断使能
	.dbline 21
;  SEI();
	clr R20
	clr R21
	.dbline 22
;  LCD_Init();
	xjmp L16
L13:
	.dbline 23
	xcall _delay_1ms
L14:
	.dbline 22
	subi R20,255  ; offset = 1
	sbci R21,255
L16:
	.dbline 22
	cp R20,R22
	cpc R21,R23
	brlo L13
	.dbline -2
L12:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfile C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2/1602.h
	.dbfunc e LCD_Write _LCD_Write fV
	.even
_LCD_Write::
	.dbline -1
	.dbline 49
; }
; 
; void main()
; {uchar i,j;
;  j=0;
;  Init();
;  LCD_Write_String(0,1,"Please input");
;  LCD_SetXY(0,2);
;  while(1){
;    if(Finish)                //检测到键盘输入
; 	{Finish=0;            //清除检测标志
; 	 i=Decode(Key_Value);    //键盘译码
;      if((i>=0)&&(i<=9)){//数字键处理	         
; 	    LCD_Write_String(0,1,"Success!     ");
; 		LCD_Write_Char(j,2,0x30+i);}     //显示
; 	 j++;
; 	 if(j==16) { 
; 	     j=0;LCD_Write_String(0,2,"                             ");}		 
; 	 }}
; }
; 
;  
; 
; 
; #pragma interrupt_handler Serve1:INT0  //2
; void Serve1(void)
; {if(!Key_Up)
	.dbline 49
	sbi 0x1b,3
	.dbline 50
;   {if ((Int_Number > 0) && (Int_Number < 9))  //接受只有一字节通码字符
	xcall _delay_1us
	.dbline 51
; 	{Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
	cbi 0x1b,3
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_WriteC _LCD_WriteC fV
;            cmd -> R20
	.even
_LCD_WriteC::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 57
; 	 if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
;   if(Int_Number==10) Finish=1;//收到第10个脉冲表示一字节传送完成
;   if(Int_Number==33) Int_Number=0;//收到第33个脉冲表示按键断码传送完成
;   while (!(PIND&0x04)); //等待PS/2CLK拉高
;      Int_Number++;}
;  else
	.dbline 57
	ldi R16,20
	ldi R17,0
	xcall _delay_nus
	.dbline 58
;   {if ((Int_Number > 0) && (Int_Number < 9)) //接受双字节通码字符
	cbi 0x1b,2
	.dbline 59
; 	{Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 60
; 	 if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 61
;    if(Int_Number==10) Finish=1;
	xcall _LCD_Write
	.dbline 62
;    if(Int_Number==55) {Int_Number=0;Key_Up=0;}
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 63
;    while (!(PIND&0x04)); //等待PS/2CLK拉高
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 64
;      Int_Number++;}	
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 65
; }
	xcall _LCD_Write
	.dbline -2
L18:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r cmd 20 c
	.dbend
	.dbfunc e LCD_WriteD _LCD_WriteD fV
;           data -> R20
	.even
_LCD_WriteD::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 71
; }
; }
; }
; }
; }
; }
	.dbline 71
	ldi R16,20
	ldi R17,0
	xcall _delay_nus
	.dbline 72
; }
	sbi 0x1b,2
	.dbline 73
; }
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 74
; }
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 75
; }
	xcall _LCD_Write
	.dbline 76
; }
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 77
; }
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 78
; }
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 79
; }
	xcall _LCD_Write
	.dbline -2
L19:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e LCD_SetXY _LCD_SetXY fV
;            add -> R20
;              y -> R20
;              x -> R22
	.even
_LCD_SetXY::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 88
; }
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 89
; }
	inc R20
	.dbline 90
; }
	ldi R17,16
	mov R16,R22
	xcall mod8u
	mov R22,R16
	.dbline 90
	ldi R17,2
	mov R16,R20
	xcall mod8u
	mov R20,R16
	.dbline 91
; }
	tst R16
	brne L21
	.dbline 91
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L22
L21:
	.dbline 92
; }
	mov R20,R22
	subi R20,64    ; addi 192
L22:
	.dbline 93
; }
	mov R16,R20
	xcall _LCD_WriteC
	.dbline -2
L20:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r add 20 c
	.dbsym r y 20 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e LCD_Clear _LCD_Clear fV
	.even
_LCD_Clear::
	.dbline -1
	.dbline 99
; }
; }
; }
; }
; }
; }
	.dbline 99
	ldi R16,1
	xcall _LCD_WriteC
	.dbline 100
; }
	ldi R16,2
	ldi R17,0
	xcall _delay_nms
	.dbline 101
; }
	ldi R18,1
	clr R16
	xcall _LCD_SetXY
	.dbline -2
L23:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_Write_Char _LCD_Write_Char fV
;              i -> y+4
;              y -> R22
;              x -> R20
	.even
_LCD_Write_Char::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 107
; }
; }
; }
; }
; }
; }
	.dbline 107
	mov R18,R22
	mov R16,R20
	xcall _LCD_SetXY
	.dbline 108
; }
	ldd R16,y+4
	xcall _LCD_WriteD
	.dbline -2
L24:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l i 4 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e LCD_Write_String _LCD_Write_String fV
;              s -> R20,R21
;              y -> R10
;              x -> R22
	.even
_LCD_Write_String::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 114
; }
; }
; }
; }
; }
; }
	.dbline 114
	mov R18,R10
	mov R16,R22
	xcall _LCD_SetXY
	xjmp L27
L26:
	.dbline 115
	.dbline 116
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_WriteD
	.dbline 117
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 117
L27:
	.dbline 115
; }
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L26
	.dbline -2
L25:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r y 10 c
	.dbsym r x 22 c
	.dbend
	.dbfunc e LCD_Init _LCD_Init fV
	.even
_LCD_Init::
	.dbline -1
	.dbline 123
; }
; }
; }
; }
; }
; }
; }
; }
	.dbline 123
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	.dbline 124
; }
	sbi 0x1a,2
	.dbline 125
; }
	sbi 0x1a,3
	.dbline 126
; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -