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

📄 ps2_kb.lst

📁 驱动开发板上的PS2接口
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    00B9 E5CF      LDI	R28,0x5F
    00BA E0D4      LDI	R29,4
    00BB BFCD      OUT	P3D,R28
    00BC BFDE      OUT	P3E,R29
    00BD 51C0      SUBI	R28,0x10
    00BE 40D0      SBCI	R29,0
    00BF EA0A      LDI	R16,0xAA
    00C0 8308      STD	R16,0+Y
    00C1 2400      CLR	R0
    00C2 E6EE      LDI	R30,0x6E
    00C3 E0F0      LDI	R31,0
    00C4 E010      LDI	R17,0
    00C5 37E1      CPI	R30,0x71
    00C6 07F1      CPC	R31,R17
    00C7 F011      BEQ	0x00CA
    00C8 9201      ST	R0,Z+
    00C9 CFFB      RJMP	0x00C5
    00CA 8300      STD	R16,0+Z
    00CB E6E4      LDI	R30,0x64
    00CC E0F1      LDI	R31,1
    00CD E6A0      LDI	R26,0x60
    00CE E0B0      LDI	R27,0
    00CF E011      LDI	R17,1
    00D0 37E2      CPI	R30,0x72
    00D1 07F1      CPC	R31,R17
    00D2 F021      BEQ	0x00D7
    00D3 95C8      LPM
    00D4 9631      ADIW	R30,1
    00D5 920D      ST	R0,X+
    00D6 CFF9      RJMP	0x00D0
    00D7 940E029A  CALL	_main
_exit:
    00D9 CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    00DA 940E02F8  CALL	push_gset2
    00DC 01B8      MOVW	R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002)   文件:AVR_PQ1A.H
(0003)   功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005) 
(0006) #include <iom16v.h>			//包含型号头文件
(0007) #include <macros.h>			//包含"位"操作头文件
(0008) 
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) 
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2	//LED锁存器控制端
(0015) #define SEGLK PA3	//数码管段选锁存器控制端
(0016) #define BITLK PA4	//数码管位选锁存器控制端
(0017) 
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功    能: 延时指定微秒(8M晶振)
(0024) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值  : 无
(0026) /********************************************/
(0027) void Delayus(uint US)		  
(0028) {
(0029)  uint i;
(0030)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    00DD E005      LDI	R16,5
    00DE E010      LDI	R17,0
    00DF 019B      MOVW	R18,R22
    00E0 940E02A3  CALL	empy16s
    00E2 01B8      MOVW	R22,R16
    00E3 9576      LSR	R23
    00E4 9567      ROR	R22
    00E5 9576      LSR	R23
    00E6 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    00E7 2744      CLR	R20
    00E8 2755      CLR	R21
    00E9 C002      RJMP	0x00EC
    00EA 5F4F      SUBI	R20,0xFF
    00EB 4F5F      SBCI	R21,0xFF
    00EC 1746      CP	R20,R22
    00ED 0757      CPC	R21,R23
    00EE F3D8      BCS	0x00EA
(0032) }
    00EF 940E02FC  CALL	pop_gset2
    00F1 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    00F2 940E02F8  CALL	push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功    能: 延时指定毫秒(8M晶振)
(0036) 参    数: MS--延时的毫秒数
(0037) 返回值  : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)		  
(0040) {
(0041)  uint i,j;
(0042)  for( i=0;i<MS;i++)
    00F4 2744      CLR	R20
    00F5 2755      CLR	R21
    00F6 C00B      RJMP	0x0102
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    00F7 2766      CLR	R22
    00F8 2777      CLR	R23
    00F9 C002      RJMP	0x00FC
    00FA 5F6F      SUBI	R22,0xFF
    00FB 4F7F      SBCI	R23,0xFF
    00FC 3765      CPI	R22,0x75
    00FD E0E4      LDI	R30,4
    00FE 077E      CPC	R23,R30
    00FF F3D0      BCS	0x00FA
    0100 5F4F      SUBI	R20,0xFF
    0101 4F5F      SBCI	R21,0xFF
    0102 1740      CP	R20,R16
    0103 0751      CPC	R21,R17
    0104 F390      BCS	0x00F7
(0044) }
    0105 940E02FC  CALL	pop_gset2
    0107 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    0108 EF8F      LDI	R24,0xFF
    0109 BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    010A BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    010B BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    010C BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    010D 2422      CLR	R2
    010E B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    010F 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    0110 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    0111 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    0112 BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    0113 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    0114 E005      LDI	R16,5
    0115 E010      LDI	R17,0
    0116 DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    0117 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    0118 2422      CLR	R2
    0119 BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    011A 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    011B E302      LDI	R16,0x32
    011C E010      LDI	R17,0
    011D DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    011E 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    011F EF8F      LDI	R24,0xFF
    0120 BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    0121 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    0122 E302      LDI	R16,0x32
    0123 E010      LDI	R17,0
    0124 DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    0125 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    0126 EF8F      LDI	R24,0xFF
    0127 BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    0128 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    0129 E302      LDI	R16,0x32
    012A E010      LDI	R17,0
    012B DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    012C 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    012D 9508      RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\19_PS2\YJ1602.C
(0001) /*******************************************
(0002)   文件:YJ1602.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动开发板上的1602液晶
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) 
(0013) /*******************************************
(0014) 函数名称: LCD1602_portini
(0015) 功    能: 初始化1602液晶用到的IO口
(0016) 参    数: 无
(0017) 返回值  : 无
(0018) /********************************************/
(0019) void LCD1602_portini(void)
(0020) {
(0021) 	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
_LCD1602_portini:
    012E B381      IN	R24,P11
    012F 6780      ORI	R24,0x70
    0130 BB81      OUT	P11,R24
(0022) 	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
    0131 B387      IN	R24,P17
    0132 6F8F      ORI	R24,0xFF
    0133 BB87      OUT	P17,R24
(0023) }
    0134 9508      RET
_LCD1602_readbyte:
  dByte                --> R20
  DatCmd               --> R20
    0135 940E02E1  CALL	push_gset1
    0137 2F40      MOV	R20,R16
(0024) /*******************************************
(0025) 函数名称: LCD1602_readbyte
(0026) 功    能: 从1602液晶读出一个字节数据或者指令
(0027) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0028) 返回值  : dByte--读回的数据或者指令
(0029) /********************************************/
(0030) uchar LCD1602_readbyte(uchar DatCmd)
(0031) {
(0032)  	uchar dByte;
(0033) 	if (DatCmd == iCmd)		 //指令操作
    0138 2344      TST	R20
    0139 F411      BNE	0x013C
(0034) 		LCDa_CLR_RS;
    013A 9894      CBI	P12,4
    013B C001      RJMP	0x013D
(0035) 	else
(0036) 		LCDa_SET_RS;
    013C 9A94      SBI	P12,4
(0037) 		
(0038) 	LCDa_SET_RW;	   	  	 //读操作
    013D 9A95      SBI	P12,5
(0039) 	LCDa_SET_E;
    013E 9A96      SBI	P12,6
(0040) 	LCDa_DATA_DDR=0x00;	 //数据总线定义为输入
    013F 2422      CLR	R2
    0140 BA27      OUT	P17,R2
(0041) 	dByte=LCDa_DI;			 //读数据或者指令
    0141 B346      IN	R20,P16
(0042) 	Delayms(1);				 //时序调整
    0142 E001      LDI	R16,1
    0143 E010      LDI	R17,0
    0144 DFAD      RCALL	_Delayms
(0043) 	LCDa_CLR_E;	
    0145 9896      CBI	P12,6
(0044) 	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
    0146 B387      IN	R24,P17
    0147 6F8F      ORI	R24,0xFF
    0148 BB87      OUT	P17,R24
(0045) 	return dByte;
    0149 2F04      MOV	R16,R20
    014A 940E02E4  CALL	pop_gset1
    014C 9508      RET
_LCD1602_sendbyte:
  dByte                --> R20
  DatCmd               --> R22
    014D 940E02F8  CALL	push_gset2
    014F 2F42      MOV	R20,R18
    0150 2F60      MOV	R22,R16
(0046) }
(0047) /*******************************************
(0048) 函数名称: LCD1602_sendbyte
(0049) 功    能: 向1602液晶写入一个字节数据或者指令
(0050) 参    数: DatCmd--为iDat时是数据,为iCmd时是指令
(0051) 	  	  dByte--为写入1602的数据或者指令
(0052) 返回值  : 无
(0053) /********************************************/
(0054) void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
(0055) {
(0056) 	if (DatCmd == iCmd)		//指令操作
    0151 2366      TST	R22
    0152 F411      BNE	0x0155
(0057) 		LCDa_CLR_RS;
    0153 9894      CBI	P12,4
    0154 C001      RJMP	0x0156
(0058) 	else
(0059) 		LCDa_SET_RS;
    0155 9A94      SBI	P12,4
(0060) 		
(0061) 	LCDa_CLR_RW;			//写操作
    0156 9895      CBI	P12,5
(0062) 	LCDa_SET_E;
    0157 9A96      SBI	P12,6
(0063) 	LCDa_DO = dByte;		//写入数据
    0158 BB48      OUT	P18,R20
(0064) 	Delayms(1);
    0159 E001      LDI	R16,1
    015A E010      LDI	R17,0
    015B DF96      RCALL	_Delayms
(0065) 	LCDa_CLR_E;	
    015C 9896      CBI	P12,6
(0066) }
    015D 940E02FC  CALL	pop_gset2
    015F 9508      RET
_LCD1602_sendstr:
  ptString             --> R20
    0160 940E02E1  CALL	push_gset1
    0162 01A8      MOVW	R20,R16
(0067) /*******************************************
(0068) 函数名称: LCD1602_sendstr
(0069) 功    能: 向1602液晶写入一个字符串
(0070) 参    数: ptString--字符串指针
(0071) 返回值  : 无
(0072) /********************************************/
(0073) void LCD1602_sendstr(uchar *ptString)
(0074) {
    0163 C005      RJMP	0x0169
(0075) 	while((*ptString)!='\0')		 //字符串未结束
(0076) 	{
(0077) 		LCD1602_sendbyte(iDat, *ptString++);
    0164 01FA      MOVW	R30,R20
    0165 9121      LD	R18,Z+
    0166 01AF      MOVW	R20,R30
    0167 E001      LDI	R16,1
    0168 DFE4      RCALL	_LCD1602_sendbyte
    0169 01FA      MOVW	R30,R20
    016A 8020      LDD	R2,0+Z
    016B 2022      TST	R2
    016C F7B9      BNE	0x0164
(0078) 	}
(0079) }
    016D 940E02E4  CALL	pop_gset1
    016F 9508      RET
(0080) /*******************************************
(0081) 函数名称: LCD1602_clear
(0082) 功    能: 1602液晶清屏
(0083) 参    数: 无
(0084) 返回值  : 无
(0085) /********************************************/
(0086) void LCD1602_clear(void)
(0087) {
(0088) 	LCD1602_sendbyte(iCmd,LCDa_CLS);
_LCD1602_clear:
    0170 E021      LDI	R18,1
    0171 2700      CLR	R16

⌨️ 快捷键说明

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