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

📄 ps2main.lis

📁 AVR单片机(Atmega16)的PS2键盘驱动程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module ps2main.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:/PROGRA~1/AVRTOO~1/Icc/include/delay.h
 0000                   .dbfunc e delay_1us _delay_1us fV
                        .even
 0000           _delay_1us::
 0000                   .dbline -1
 0000                   .dbline 2
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000                   .dbline 3
 0000           ; #include "1602.h"
 0000 0000              nop
 0002                   .dbline -2
 0002           L1:
 0002                   .dbline 0 ; func end
 0002 0895              ret
 0004                   .dbend
 0004                   .dbfunc e delay_nus _delay_nus fV
 0004           ;              i -> R20,R21
 0004           ;              n -> R22,R23
                        .even
 0004           _delay_nus::
 0004 0E940000          xcall push_gset2
 0008 B801              movw R22,R16
 000A                   .dbline -1
 000A                   .dbline 7
 000A           ; #include "KeyCode.h"
 000A           ; 
 000A           ; #define uchar unsigned char
 000A           ; #define uint  unsigned int
 000A                   .dbline 8
 000A           ; 
 000A 4427              clr R20
 000C 5527              clr R21
 000E                   .dbline 9
 000E           ; uchar Int_Number=0;               //中断计数器;
 000E 03C0              xjmp L6
 0010           L3:
 0010                   .dbline 10
 0010 F7DF              xcall _delay_1us
 0012           L4:
 0012                   .dbline 9
 0012 4F5F              subi R20,255  ; offset = 1
 0014 5F4F              sbci R21,255
 0016           L6:
 0016                   .dbline 9
 0016 4617              cp R20,R22
 0018 5707              cpc R21,R23
 001A D0F3              brlo L3
 001C                   .dbline -2
 001C           L2:
 001C 0E940000          xcall pop_gset2
 0020                   .dbline 0 ; func end
 0020 0895              ret
 0022                   .dbsym r i 20 i
 0022                   .dbsym r n 22 i
 0022                   .dbend
 0022                   .dbfunc e delay_1ms _delay_1ms fV
 0022           ;              i -> R16,R17
                        .even
 0022           _delay_1ms::
 0022                   .dbline -1
 0022                   .dbline 14
 0022           ; uchar Key_Value=0;             //键盘编码值;
 0022           ; //extern Finish;
 0022           ; //extern Key_Up;
 0022           ; 
 0022           ; void Init()
 0022                   .dbline 16
 0022 0027              clr R16
 0024 1127              clr R17
 0026 02C0              xjmp L11
 0028           L8:
 0028                   .dbline 16
 0028           L9:
 0028                   .dbline 16
 0028 0F5F              subi R16,255  ; offset = 1
 002A 1F4F              sbci R17,255
 002C           L11:
 002C                   .dbline 16
 002C           ; {PORTD = 0x06;
 002C           ;  DDRD  = 0x00;
 002C 0437              cpi R16,116
 002E E4E0              ldi R30,4
 0030 1E07              cpc R17,R30
 0032 D0F3              brlo L8
 0034                   .dbline -2
 0034           L7:
 0034                   .dbline 0 ; func end
 0034 0895              ret
 0036                   .dbsym r i 16 i
 0036                   .dbend
 0036                   .dbfunc e delay_nms _delay_nms fV
 0036           ;              i -> R20,R21
 0036           ;              n -> R22,R23
                        .even
 0036           _delay_nms::
 0036 0E940000          xcall push_gset2
 003A B801              movw R22,R16
 003C                   .dbline -1
 003C                   .dbline 20
 003C           ; // DDRD&=~0x06;             //110b,
 003C           ;  //PORTD|=0x06;             //110b,PD1,PD2输入,上拉  
 003C           ;  MCUCR=MCUCR&0xfc;       //INT0低电平中断
 003C           ;  GICR|=(1<<INT0);       //INT0中断使能
 003C                   .dbline 21
 003C           ;  SEI();
 003C 4427              clr R20
 003E 5527              clr R21
 0040                   .dbline 22
 0040           ;  LCD_Init();
 0040 03C0              xjmp L16
 0042           L13:
 0042                   .dbline 23
 0042 EFDF              xcall _delay_1ms
 0044           L14:
 0044                   .dbline 22
 0044 4F5F              subi R20,255  ; offset = 1
 0046 5F4F              sbci R21,255
 0048           L16:
 0048                   .dbline 22
 0048 4617              cp R20,R22
 004A 5707              cpc R21,R23
 004C D0F3              brlo L13
 004E                   .dbline -2
 004E           L12:
 004E 0E940000          xcall pop_gset2
 0052                   .dbline 0 ; func end
 0052 0895              ret
 0054                   .dbsym r i 20 i
 0054                   .dbsym r n 22 i
 0054                   .dbend
 0054                   .dbfile C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2/1602.h
 0054                   .dbfunc e LCD_Write _LCD_Write fV
                        .even
 0054           _LCD_Write::
 0054                   .dbline -1
 0054                   .dbline 49
 0054           ; }
 0054           ; 
 0054           ; void main()
 0054           ; {uchar i,j;
 0054           ;  j=0;
 0054           ;  Init();
 0054           ;  LCD_Write_String(0,1,"Please input");
 0054           ;  LCD_SetXY(0,2);
 0054           ;  while(1){
 0054           ;    if(Finish)                //检测到键盘输入
 0054           ;       {Finish=0;            //清除检测标志
 0054           ;        i=Decode(Key_Value);    //键盘译码
 0054           ;      if((i>=0)&&(i<=9)){//数字键处理           
 0054           ;           LCD_Write_String(0,1,"Success!     ");
 0054           ;               LCD_Write_Char(j,2,0x30+i);}     //显示
 0054           ;        j++;
 0054           ;        if(j==16) { 
 0054           ;            j=0;LCD_Write_String(0,2,"                             ");}                 
 0054           ;        }}
 0054           ; }
 0054           ; 
 0054           ;  
 0054           ; 
 0054           ; 
 0054           ; #pragma interrupt_handler Serve1:INT0  //2
 0054           ; void Serve1(void)
 0054           ; {if(!Key_Up)
 0054                   .dbline 49
 0054 DB9A              sbi 0x1b,3
 0056                   .dbline 50
 0056           ;   {if ((Int_Number > 0) && (Int_Number < 9))  //接受只有一字节通码字符
 0056 D4DF              xcall _delay_1us
 0058                   .dbline 51
 0058           ;       {Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 0058 DB98              cbi 0x1b,3
 005A                   .dbline -2
 005A           L17:
 005A                   .dbline 0 ; func end
 005A 0895              ret
 005C                   .dbend
 005C                   .dbfunc e LCD_WriteC _LCD_WriteC fV
 005C           ;            cmd -> R20
                        .even
 005C           _LCD_WriteC::
 005C 0E940000          xcall push_gset1
 0060 402F              mov R20,R16
 0062                   .dbline -1
 0062                   .dbline 57
 0062           ;        if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
 0062           ;   if(Int_Number==10) Finish=1;//收到第10个脉冲表示一字节传送完成
 0062           ;   if(Int_Number==33) Int_Number=0;//收到第33个脉冲表示按键断码传送完成
 0062           ;   while (!(PIND&0x04)); //等待PS/2CLK拉高
 0062           ;      Int_Number++;}
 0062           ;  else
 0062                   .dbline 57
 0062 04E1              ldi R16,20
 0064 10E0              ldi R17,0
 0066 CEDF              xcall _delay_nus
 0068                   .dbline 58
 0068           ;   {if ((Int_Number > 0) && (Int_Number < 9)) //接受双字节通码字符
 0068 DA98              cbi 0x1b,2
 006A                   .dbline 59
 006A           ;       {Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
 006A 8BB3              in R24,0x1b
 006C 8F70              andi R24,15
 006E 8BBB              out 0x1b,R24
 0070                   .dbline 60
 0070           ;        if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
 0070 842F              mov R24,R20
 0072 807F              andi R24,240
 0074 2BB2              in R2,0x1b
 0076 282A              or R2,R24
 0078 2BBA              out 0x1b,R2
 007A                   .dbline 61
 007A           ;    if(Int_Number==10) Finish=1;
 007A ECDF              xcall _LCD_Write
 007C                   .dbline 62
 007C           ;    if(Int_Number==55) {Int_Number=0;Key_Up=0;}
 007C 842F              mov R24,R20
 007E 8F70              andi R24,#0x0F
 0080 8295              swap R24
 0082 482F              mov R20,R24
 0084                   .dbline 63
 0084           ;    while (!(PIND&0x04)); //等待PS/2CLK拉高
 0084 8BB3              in R24,0x1b
 0086 8F70              andi R24,15
 0088 8BBB              out 0x1b,R24
 008A                   .dbline 64
 008A           ;      Int_Number++;}   
 008A 842F              mov R24,R20
 008C 807F              andi R24,240
 008E 2BB2              in R2,0x1b
 0090 282A              or R2,R24
 0092 2BBA              out 0x1b,R2
 0094                   .dbline 65
 0094           ; }
 0094 DFDF              xcall _LCD_Write
 0096                   .dbline -2
 0096           L18:
 0096 0E940000          xcall pop_gset1
 009A                   .dbline 0 ; func end
 009A 0895              ret
 009C                   .dbsym r cmd 20 c
 009C                   .dbend
 009C                   .dbfunc e LCD_WriteD _LCD_WriteD fV
 009C           ;           data -> R20
                        .even
 009C           _LCD_WriteD::
 009C 0E940000          xcall push_gset1
 00A0 402F              mov R20,R16
 00A2                   .dbline -1
 00A2                   .dbline 71
 00A2           ; }
 00A2           ; }
 00A2           ; }
 00A2           ; }
 00A2           ; }
 00A2           ; }
 00A2                   .dbline 71
 00A2 04E1              ldi R16,20
 00A4 10E0              ldi R17,0
 00A6 AEDF              xcall _delay_nus
 00A8                   .dbline 72
 00A8           ; }
 00A8 DA9A              sbi 0x1b,2
 00AA                   .dbline 73
 00AA           ; }
 00AA 8BB3              in R24,0x1b
 00AC 8F70              andi R24,15
 00AE 8BBB              out 0x1b,R24
 00B0                   .dbline 74
 00B0           ; }
 00B0 842F              mov R24,R20
 00B2 807F              andi R24,240
 00B4 2BB2              in R2,0x1b
 00B6 282A              or R2,R24
 00B8 2BBA              out 0x1b,R2
 00BA                   .dbline 75
 00BA           ; }
 00BA CCDF              xcall _LCD_Write
 00BC                   .dbline 76
 00BC           ; }
 00BC 842F              mov R24,R20
 00BE 8F70              andi R24,#0x0F
 00C0 8295              swap R24
 00C2 482F              mov R20,R24
 00C4                   .dbline 77
 00C4           ; }
 00C4 8BB3              in R24,0x1b
 00C6 8F70              andi R24,15
 00C8 8BBB              out 0x1b,R24
 00CA                   .dbline 78
 00CA           ; }
 00CA 842F              mov R24,R20
 00CC 807F              andi R24,240
 00CE 2BB2              in R2,0x1b
 00D0 282A              or R2,R24
 00D2 2BBA              out 0x1b,R2
 00D4                   .dbline 79
 00D4           ; }
 00D4 BFDF              xcall _LCD_Write
 00D6                   .dbline -2
 00D6           L19:
 00D6 0E940000          xcall pop_gset1
 00DA                   .dbline 0 ; func end
 00DA 0895              ret
 00DC                   .dbsym r data 20 c
 00DC                   .dbend
 00DC                   .dbfunc e LCD_SetXY _LCD_SetXY fV
 00DC           ;            add -> R20
 00DC           ;              y -> R20
 00DC           ;              x -> R22
                        .even
 00DC           _LCD_SetXY::
 00DC 0E940000          xcall push_gset2
 00E0 422F              mov R20,R18
 00E2 602F              mov R22,R16
 00E4                   .dbline -1
 00E4                   .dbline 88
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4           ; }
 00E4                   .dbline 89
 00E4           ; }
 00E4 4395              inc R20
 00E6                   .dbline 90
 00E6           ; }
 00E6 10E1              ldi R17,16
 00E8 062F              mov R16,R22
 00EA 0E940000          xcall mod8u
 00EE 602F              mov R22,R16
 00F0                   .dbline 90
 00F0 12E0              ldi R17,2

⌨️ 快捷键说明

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