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

📄 ps2.lst

📁 AVR单片机(Atmega16)的PS2键盘驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0084 E5CF      LDI	R28,0x5F
    0085 E0D4      LDI	R29,4
    0086 BFCD      OUT	0x3D,R28
    0087 BFDE      OUT	0x3E,R29
    0088 51CE      SUBI	R28,0x1E
    0089 40D0      SBCI	R29,0
    008A EA0A      LDI	R16,0xAA
    008B 8308      STD	Y+0,R16
    008C 2400      CLR	R0
    008D E9ED      LDI	R30,0x9D
    008E E0F0      LDI	R31,0
    008F E010      LDI	R17,0
    0090 39ED      CPI	R30,0x9D
    0091 07F1      CPC	R31,R17
    0092 F011      BEQ	0x0095
    0093 9201      ST	R0,Z+
    0094 CFFB      RJMP	0x0090
    0095 8300      STD	Z+0,R16
    0096 ECEA      LDI	R30,0xCA
    0097 E0F0      LDI	R31,0
    0098 E6A0      LDI	R26,0x60
    0099 E0B0      LDI	R27,0
    009A E011      LDI	R17,1
    009B 30E7      CPI	R30,7
    009C 07F1      CPC	R31,R17
    009D F021      BEQ	0x00A2
    009E 95C8      LPM
    009F 9631      ADIW	R30,1
    00A0 920D      ST	R0,X+
    00A1 CFF9      RJMP	0x009B
    00A2 940E01B2  CALL	_main
_exit:
    00A4 CFFF      RJMP	_exit
FILE: D:\PROGRA~1\AVRTOO~1\Icc\include\delay.h
(0001) void delay_1us(void)                 //1us延时函数 
(0002)   { 
(0003)    asm("nop"); 
_delay_1us:
    00A5 0000      NOP
    00A6 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    00A7 940E0273  CALL	push_gset2
    00A9 01B8      MOVW	R22,R16
(0004)   } 
(0005) 
(0006) void delay_nus(unsigned int n)       //N us延时函数 
(0007)   { 
(0008)    unsigned int i=0; 
    00AA 2744      CLR	R20
    00AB 2755      CLR	R21
(0009)    for (i=0;i<n;i++) 
    00AC C003      RJMP	0x00B0
(0010)    delay_1us(); 
    00AD DFF7      RCALL	_delay_1us
    00AE 5F4F      SUBI	R20,0xFF
    00AF 4F5F      SBCI	R21,0xFF
    00B0 1746      CP	R20,R22
    00B1 0757      CPC	R21,R23
    00B2 F3D0      BCS	0x00AD
    00B3 940E0267  CALL	pop_gset2
    00B5 9508      RET
(0011)   } 
(0012)    
(0013) void delay_1ms(void)                 //1ms延时函数 
(0014)   { 
(0015)    unsigned int i; 
(0016)    for (i=0;i<1140;i++); 
_delay_1ms:
  i                    --> R16
    00B6 2700      CLR	R16
    00B7 2711      CLR	R17
    00B8 C002      RJMP	0x00BB
    00B9 5F0F      SUBI	R16,0xFF
    00BA 4F1F      SBCI	R17,0xFF
    00BB 3704      CPI	R16,0x74
    00BC E0E4      LDI	R30,4
    00BD 071E      CPC	R17,R30
    00BE F3D0      BCS	0x00B9
    00BF 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    00C0 940E0273  CALL	push_gset2
    00C2 01B8      MOVW	R22,R16
(0017)   } 
(0018)    
(0019) void delay_nms(unsigned int n)       //N ms延时函数 
(0020)   { 
(0021)    unsigned int i=0; 
    00C3 2744      CLR	R20
    00C4 2755      CLR	R21
(0022)    for (i=0;i<n;i++) 
    00C5 C003      RJMP	0x00C9
(0023)    delay_1ms(); 
    00C6 DFEF      RCALL	_delay_1ms
    00C7 5F4F      SUBI	R20,0xFF
    00C8 4F5F      SBCI	R21,0xFF
    00C9 1746      CP	R20,R22
    00CA 0757      CPC	R21,R23
    00CB F3D0      BCS	0x00C6
    00CC 940E0267  CALL	pop_gset2
    00CE 9508      RET
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2\1602.h
(0001)  #include <iom16v.h>
(0002)  #include <macros.h>
(0003)  #include <delay.h>
(0004)  
(0005)  /********************************************
(0006)  液晶 LCD1602  4条数据线(D4~D7)
(0007)  编译器:ICC-AVR v6.31A 日期: 2007-4-7 下午
(0008)  目标芯片 : ATmega16
(0009)  时钟: 8.0000Mhz
(0010)  下面是AVR与LCD连接信息
(0011)  PA2 ->RS
(0012)  PA3 ->EN
(0013)  地  ->RW
(0014)  PA4 ->D4
(0015)  PA5 ->D5
(0016)  PA6 ->D6
(0017)  PA7 ->D7
(0018)  *********************************************/
(0019)  
(0020)  #define uchar unsigned char
(0021)  
(0022)  #define C_On_B_On   0x0F  //光标开,闪烁
(0023)  #define C_On_B_Off  0x0E  //光标开,不闪烁
(0024)  #define C_Off_B_On  0x0D  //光标关,闪烁
(0025)  #define C_Off_B_Off 0x0C  //光标关,不闪烁  
(0026)  
(0027)  #define EN_PORT PORTA
(0028)  #define EN_DDR  DDRA
(0029)  #define RS_PORT PORTA
(0030)  #define RS_DDR  DDRA
(0031)  
(0032)  #define DATA_OUT PORTA
(0033)  #define DATA_DDR  DDRA
(0034)  #define DATA_IN  PINA
(0035)  
(0036)  #define LCD_EN  (1<<PA3)
(0037)  #define LCD_RS  (1<<PA2)  
(0038)  #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) 
(0039)  
(0040)  #define Set_RS_0 RS_PORT&=~LCD_RS   
(0041)  #define Set_RS_1 RS_PORT|=LCD_RS
(0042)  #define Set_EN_0 EN_PORT&=~LCD_EN
(0043)  #define Set_EN_1 EN_PORT|=LCD_EN
(0044)  
(0045)  /*****************************
(0046)   功能:EN下降沿写指令及数据
(0047)   *****************************/
(0048)  void LCD_Write(void)
(0049)  {Set_EN_1;
_LCD_Write:
    00CF 9ADB      SBI	0x1B,3
(0050)   delay_1us();
    00D0 DFD4      RCALL	_delay_1us
(0051)   Set_EN_0;    
    00D1 98DB      CBI	0x1B,3
    00D2 9508      RET
_LCD_WriteC:
  cmd                  --> R20
    00D3 940E0275  CALL	push_gset1
    00D5 2F40      MOV	R20,R16
(0052)  }
(0053)  /*****************************
(0054)   功能:写指令
(0055)  *****************************/
(0056)  void LCD_WriteC(uchar cmd)
(0057)  {delay_nus(20);
    00D6 E104      LDI	R16,0x14
    00D7 E010      LDI	R17,0
    00D8 DFCE      RCALL	_delay_nus
(0058)   Set_RS_0;
    00D9 98DA      CBI	0x1B,2
(0059)   DATA_OUT&=0x0F;   // 清高四位 
    00DA B38B      IN	R24,0x1B
    00DB 708F      ANDI	R24,0xF
    00DC BB8B      OUT	0x1B,R24
(0060)   DATA_OUT|=cmd&0xF0; //写高四位
    00DD 2F84      MOV	R24,R20
    00DE 7F80      ANDI	R24,0xF0
    00DF B22B      IN	R2,0x1B
    00E0 2A28      OR	R2,R24
    00E1 BA2B      OUT	0x1B,R2
(0061)   LCD_Write();
    00E2 DFEC      RCALL	_LCD_Write
(0062)   cmd=cmd<<4;
    00E3 2F84      MOV	R24,R20
    00E4 708F      ANDI	R24,0xF
    00E5 9582      SWAP	R24
    00E6 2F48      MOV	R20,R24
(0063)   DATA_OUT&=0x0F;   // 清高四位 
    00E7 B38B      IN	R24,0x1B
    00E8 708F      ANDI	R24,0xF
    00E9 BB8B      OUT	0x1B,R24
(0064)   DATA_OUT|=cmd&0xF0; //写低四位
    00EA 2F84      MOV	R24,R20
    00EB 7F80      ANDI	R24,0xF0
    00EC B22B      IN	R2,0x1B
    00ED 2A28      OR	R2,R24
    00EE BA2B      OUT	0x1B,R2
(0065)   LCD_Write();
    00EF DFDF      RCALL	_LCD_Write
    00F0 940E0278  CALL	pop_gset1
    00F2 9508      RET
_LCD_WriteD:
  data                 --> R20
    00F3 940E0275  CALL	push_gset1
    00F5 2F40      MOV	R20,R16
(0066)  }
(0067)  /****************************
(0068)   功能:写数据
(0069)  ****************************/ 
(0070)  void LCD_WriteD(uchar data)
(0071)  {delay_nus(20);
    00F6 E104      LDI	R16,0x14
    00F7 E010      LDI	R17,0
    00F8 DFAE      RCALL	_delay_nus
(0072)   Set_RS_1;
    00F9 9ADA      SBI	0x1B,2
(0073)   DATA_OUT&=0x0F;   // 清高四位 
    00FA B38B      IN	R24,0x1B
    00FB 708F      ANDI	R24,0xF
    00FC BB8B      OUT	0x1B,R24
(0074)   DATA_OUT|=data&0xF0; //写高四位
    00FD 2F84      MOV	R24,R20
    00FE 7F80      ANDI	R24,0xF0
    00FF B22B      IN	R2,0x1B
    0100 2A28      OR	R2,R24
    0101 BA2B      OUT	0x1B,R2
(0075)   LCD_Write();
    0102 DFCC      RCALL	_LCD_Write
(0076)   data=data<<4;
    0103 2F84      MOV	R24,R20
    0104 708F      ANDI	R24,0xF
    0105 9582      SWAP	R24
    0106 2F48      MOV	R20,R24
(0077)   DATA_OUT&=0x0F;   // 清高四位 
    0107 B38B      IN	R24,0x1B
    0108 708F      ANDI	R24,0xF
    0109 BB8B      OUT	0x1B,R24
(0078)   DATA_OUT|=data&0xF0; //写低四位
    010A 2F84      MOV	R24,R20
    010B 7F80      ANDI	R24,0xF0
    010C B22B      IN	R2,0x1B
    010D 2A28      OR	R2,R24
    010E BA2B      OUT	0x1B,R2
(0079)   LCD_Write();
    010F DFBF      RCALL	_LCD_Write
    0110 940E0278  CALL	pop_gset1
    0112 9508      RET
_LCD_SetXY:
  add                  --> R20
  y                    --> R20
  x                    --> R22
    0113 940E0273  CALL	push_gset2
    0115 2F42      MOV	R20,R18
    0116 2F60      MOV	R22,R16
(0080)  }
(0081)  /*************************************
(0082)   功能:设置位置坐标 
(0083)   LCD第一行显示寄存器地址:0x80-0x8F
(0084)   LCD第一行显示寄存器地址:0xC0-0xCF
(0085)   输入:X:0-15,y:1-2
(0086)  **************************************/
(0087)  void LCD_SetXY(uchar x,uchar y)  
(0088)  {uchar add;
(0089)   y++;
    0117 9543      INC	R20
(0090)   x=x%16;y=y%2;
    0118 E110      LDI	R17,0x10
    0119 2F06      MOV	R16,R22
    011A 940E024F  CALL	mod8u
    011C 2F60      MOV	R22,R16
    011D E012      LDI	R17,2
    011E 2F04      MOV	R16,R20
    011F 940E024F  CALL	mod8u
    0121 2F40      MOV	R20,R16
(0091)   if(y==0)     add=0x80+x;
    0122 2300      TST	R16
    0123 F419      BNE	0x0127
    0124 2F46      MOV	R20,R22
    0125 5840      SUBI	R20,0x80
    0126 C002      RJMP	0x0129
(0092)   else		   add=0xC0+x;
    0127 2F46      MOV	R20,R22
    0128 5440      SUBI	R20,0x40
(0093)   LCD_WriteC(add);
    0129 2F04      MOV	R16,R20
    012A DFA8      RCALL	_LCD_WriteC
    012B 940E0267  CALL	pop_gset2
    012D 9508      RET
(0094)  } 
(0095)  /************************************
(0096)  功能:清屏,光标返回初始位置
(0097)  *************************************/
(0098)  void LCD_Clear()
(0099)  {LCD_WriteC(0x01);  //清屏
_LCD_Clear:
    012E E001      LDI	R16,1
    012F DFA3      RCALL	_LCD_WriteC
(0100)   delay_nms(2);    //指令执行时间:1.64ms
    0130 E002      LDI	R16,2
    0131 E010      LDI	R17,0
    0132 DF8D      RCALL	_delay_nms
(0101)   LCD_SetXY(0,1);
    0133 E021      LDI	R18,1
    0134 2700      CLR	R16
    0135 DFDD      RCALL	_LCD_SetXY
    0136 9508      RET
_LCD_Write_Char:
  i                    --> Y+4
  y                    --> R22
  x                    --> R20
    0137 940E0273  CALL	push_gset2
    0139 2F62      MOV	R22,R18
    013A 2F40      MOV	R20,R16
(0102)  }
(0103)  /************************************
(0104)   功能:在(x,y)处显示字符
(0105)  *************************************/
(0106)  void LCD_Write_Char(uchar x,uchar y,uchar i)
(0107)  {LCD_SetXY(x,y);
    013B 2F26      MOV	R18,R22
    013C 2F04      MOV	R16,R20
    013D DFD5      RCALL	_LCD_SetXY
(0108)   LCD_WriteD(i);
    013E 810C      LDD	R16,Y+4
    013F DFB3      RCALL	_LCD_WriteD
    0140 940E0267  CALL	pop_gset2
    0142 9508      RET
_LCD_Write_String:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    0143 940E0271  CALL	push_gset3
    0145 2EA2      MOV	R10,R18
    0146 2F60      MOV	R22,R16
    0147 814E      LDD	R20,Y+6
    0148 815F      LDD	R21,Y+7
(0109)  }
(0110)  /***********************************
(0111)   功能:在(x,y)处开始显示字符串
(0112)  ************************************/
(0113)  void LCD_Write_String(uchar x,uchar y, uchar *s)
(0114)  {LCD_SetXY(x,y);
    0149 2D2A      MOV	R18,R10
    014A 2F06      MOV	R16,R22
    014B DFC7      RCALL	_LCD_SetXY
    014C C005      RJMP	0x0152
(0115)   while(*s){
(0116)   	LCD_WriteD(*s);
    014D 01FA      MOVW	R30,R20
    014E 8100      LDD	R16,Z+0
    014F DFA3      RCALL	_LCD_WriteD
(0117) 	s++;}
    0150 5F4F      SUBI	R20,0xFF
    0151 4F5F      SBCI	R21,0xFF
    0152 01FA      MOVW	R30,R20
    0153 8020      LDD	R2,Z+0
    0154 2022      TST	R2
    0155 F7B9      BNE	0x014D
    0156 940E026A  CALL	pop_gset3
    0158 9508      RET
(0118)  }
(0119)  /************************************
(0120)   功能:LCD初始化
(0121)  *************************************/ 
(0122)  void LCD_Init(void)
(0123)  {DATA_DDR|=LCD_DATA;  //数据口方向:输出
_LCD_Init:
    0159 B38A      IN	R24,0x1A
    015A 6F80      ORI	R24,0xF0
    015B BB8A      OUT	0x1A,R24
(0124)   RS_DDR|=LCD_RS;     //RS口方向:输出
    015C 9AD2      SBI	0x1A,2
(0125)   EN_DDR|=LCD_EN;     //EN口方向:输出
    015D 9AD3      SBI	0x1A,3
(0126)   LCD_WriteC(0x28);  //4位总线接口,两行显示
    015E E208      LDI	R16,0x28
    015F DF73      RCALL	_LCD_WriteC
(0127)   LCD_Write();       // !! 此处需要一个下降沿!!!!!! 
    0160 DF6E      RCALL	_LCD_Write
(0128)   LCD_WriteC(0x28);  //!!! 此处需要两个0x28!!!!!!!!
    0161 E208      LDI	R16,0x28
    0162 DF70      RCALL	_LCD_WriteC
(0129)   LCD_WriteC(C_Off_B_Off);  //开显示,设置光标与闪烁开关  
    0163 E00C      LDI	R16,0xC
    0164 DF6E      RCALL	_LCD_WriteC
(0130)   LCD_WriteC(0x01);  //清屏
    0165 E001      LDI	R16,1
    0166 DF6C      RCALL	_LCD_WriteC
(0131)   delay_nms(2);    //指令执行时间:1.64ms
    0167 E002      LDI	R16,2
    0168 E010      LDI	R17,0
    0169 DF56      RCALL	_delay_nms
(0132)   LCD_SetXY(0,1);
    016A E021      LDI	R18,1
    016B 2700      CLR	R16
    016C DFA6      RCALL	_LCD_SetXY
    016D 9508      RET
_Decode:
  i                    --> R20
  temp                 --> R22
  ScanCode             --> R16
    016E 940E0273  CALL	push_gset2
FILE: C:\DOCUME~1\wpzhao.USTC\MYDOCU~1\我的文档\我的ICC\我的PS2\KeyCode.h
(0001) /*-------------------------------------------
(0002) 键盘通码编码表
(0003) PS/2接口:
(0004)    1(数据)--PD1
(0005)    5(时钟)--PD2(INT0)
(0006)    只需一个外部中断接口
(0007) 2007.4.8
(0008) ---------------------------------------------*/
(0009) #define uchar unsigned char
(0010) 

⌨️ 快捷键说明

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