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

📄 rtc.lst

📁 在AVR开发板驱动时钟芯片DS1302
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    005A E5CF      LDI	R28,0x5F
    005B E0D4      LDI	R29,4
    005C BFCD      OUT	P3D,R28
    005D BFDE      OUT	P3E,R29
    005E 51C0      SUBI	R28,0x10
    005F 40D0      SBCI	R29,0
    0060 EA0A      LDI	R16,0xAA
    0061 8308      STD	R16,0+Y
    0062 2400      CLR	R0
    0063 E7E7      LDI	R30,0x77
    0064 E0F0      LDI	R31,0
    0065 E010      LDI	R17,0
    0066 37E7      CPI	R30,0x77
    0067 07F1      CPC	R31,R17
    0068 F011      BEQ	0x006B
    0069 9201      ST	R0,Z+
    006A CFFB      RJMP	0x0066
    006B 8300      STD	R16,0+Z
    006C E9EC      LDI	R30,0x9C
    006D E0F0      LDI	R31,0
    006E E6A0      LDI	R26,0x60
    006F E0B0      LDI	R27,0
    0070 E010      LDI	R17,0
    0071 3BE3      CPI	R30,0xB3
    0072 07F1      CPC	R31,R17
    0073 F021      BEQ	0x0078
    0074 95C8      LPM
    0075 9631      ADIW	R30,1
    0076 920D      ST	R0,X+
    0077 CFF9      RJMP	0x0071
    0078 940E0353  CALL	_main
_exit:
    007A CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    007B 940E06FF  CALL	push_gset2
    007D 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晶振下,通过软件仿真反复实验得到的数值
    007E E005      LDI	R16,5
    007F E010      LDI	R17,0
    0080 019B      MOVW	R18,R22
    0081 940E06D8  CALL	empy16s
    0083 01B8      MOVW	R22,R16
    0084 9576      LSR	R23
    0085 9567      ROR	R22
    0086 9576      LSR	R23
    0087 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    0088 2744      CLR	R20
    0089 2755      CLR	R21
    008A C002      RJMP	0x008D
    008B 5F4F      SUBI	R20,0xFF
    008C 4F5F      SBCI	R21,0xFF
    008D 1746      CP	R20,R22
    008E 0757      CPC	R21,R23
    008F F3D8      BCS	0x008B
(0032) }
    0090 940E0707  CALL	pop_gset2
    0092 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    0093 940E06FF  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++)
    0095 2744      CLR	R20
    0096 2755      CLR	R21
    0097 C00B      RJMP	0x00A3
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0098 2766      CLR	R22
    0099 2777      CLR	R23
    009A C002      RJMP	0x009D
    009B 5F6F      SUBI	R22,0xFF
    009C 4F7F      SBCI	R23,0xFF
    009D 3765      CPI	R22,0x75
    009E E0E4      LDI	R30,4
    009F 077E      CPC	R23,R30
    00A0 F3D0      BCS	0x009B
    00A1 5F4F      SUBI	R20,0xFF
    00A2 4F5F      SBCI	R21,0xFF
    00A3 1740      CP	R20,R16
    00A4 0751      CPC	R21,R17
    00A5 F390      BCS	0x0098
(0044) }
    00A6 940E0707  CALL	pop_gset2
    00A8 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    00A9 EF8F      LDI	R24,0xFF
    00AA BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    00AB BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    00AC BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    00AD BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    00AE 2422      CLR	R2
    00AF B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    00B0 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    00B1 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    00B2 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    00B3 BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    00B4 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    00B5 E005      LDI	R16,5
    00B6 E010      LDI	R17,0
    00B7 DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    00B8 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    00B9 2422      CLR	R2
    00BA BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    00BB 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    00BC E302      LDI	R16,0x32
    00BD E010      LDI	R17,0
    00BE DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    00BF 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    00C0 EF8F      LDI	R24,0xFF
    00C1 BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    00C2 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    00C3 E302      LDI	R16,0x32
    00C4 E010      LDI	R17,0
    00C5 DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    00C6 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    00C7 EF8F      LDI	R24,0xFF
    00C8 BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    00C9 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    00CA E302      LDI	R16,0x32
    00CB E010      LDI	R17,0
    00CC DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    00CD 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    00CE 9508      RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\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:
    00CF B381      IN	R24,P11
    00D0 6780      ORI	R24,0x70
    00D1 BB81      OUT	P11,R24
(0022) 	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
    00D2 B387      IN	R24,P17
    00D3 6F8F      ORI	R24,0xFF
    00D4 BB87      OUT	P17,R24
(0023) }
    00D5 9508      RET
_LCD1602_readbyte:
  dByte                --> R20
  DatCmd               --> R20
    00D6 940E06E8  CALL	push_gset1
    00D8 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)		 //指令操作
    00D9 2344      TST	R20
    00DA F411      BNE	0x00DD
(0034) 		LCDa_CLR_RS;
    00DB 9894      CBI	P12,4
    00DC C001      RJMP	0x00DE
(0035) 	else
(0036) 		LCDa_SET_RS;
    00DD 9A94      SBI	P12,4
(0037) 		
(0038) 	LCDa_SET_RW;	   	  	 //读操作
    00DE 9A95      SBI	P12,5
(0039) 	LCDa_SET_E;
    00DF 9A96      SBI	P12,6
(0040) 	LCDa_DATA_DDR=0x00;	 //数据总线定义为输入
    00E0 2422      CLR	R2
    00E1 BA27      OUT	P17,R2
(0041) 	dByte=LCDa_DI;			 //读数据或者指令
    00E2 B346      IN	R20,P16
(0042) 	Delayms(1);				 //时序调整
    00E3 E001      LDI	R16,1
    00E4 E010      LDI	R17,0
    00E5 DFAD      RCALL	_Delayms
(0043) 	LCDa_CLR_E;	
    00E6 9896      CBI	P12,6
(0044) 	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
    00E7 B387      IN	R24,P17
    00E8 6F8F      ORI	R24,0xFF
    00E9 BB87      OUT	P17,R24
(0045) 	return dByte;
    00EA 2F04      MOV	R16,R20
    00EB 940E06EB  CALL	pop_gset1
    00ED 9508      RET
_LCD1602_sendbyte:
  dByte                --> R20
  DatCmd               --> R22
    00EE 940E06FF  CALL	push_gset2
    00F0 2F42      MOV	R20,R18
    00F1 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)		//指令操作
    00F2 2366      TST	R22
    00F3 F411      BNE	0x00F6
(0057) 		LCDa_CLR_RS;
    00F4 9894      CBI	P12,4
    00F5 C001      RJMP	0x00F7
(0058) 	else
(0059) 		LCDa_SET_RS;
    00F6 9A94      SBI	P12,4
(0060) 		
(0061) 	LCDa_CLR_RW;			//写操作
    00F7 9895      CBI	P12,5
(0062) 	LCDa_SET_E;
    00F8 9A96      SBI	P12,6
(0063) 	LCDa_DO = dByte;		//写入数据
    00F9 BB48      OUT	P18,R20
(0064) 	Delayms(1);
    00FA E001      LDI	R16,1
    00FB E010      LDI	R17,0
    00FC DF96      RCALL	_Delayms
(0065) 	LCDa_CLR_E;	
    00FD 9896      CBI	P12,6
(0066) }
    00FE 940E0707  CALL	pop_gset2
    0100 9508      RET
_LCD1602_sendstr:
  ptString             --> R20
    0101 940E06E8  CALL	push_gset1
    0103 01A8      MOVW	R20,R16
(0067) /*******************************************
(0068) 函数名称: LCD1602_sendstr
(0069) 功    能: 向1602液晶写入一个字符串
(0070) 参    数: ptString--字符串指针
(0071) 返回值  : 无
(0072) /********************************************/
(0073) void LCD1602_sendstr(uchar *ptString)
(0074) {
    0104 C005      RJMP	0x010A
(0075) 	while((*ptString)!='\0')		 //字符串未结束
(0076) 	{
(0077) 		LCD1602_sendbyte(iDat, *ptString++);
    0105 01FA      MOVW	R30,R20
    0106 9121      LD	R18,Z+
    0107 01AF      MOVW	R20,R30
    0108 E001      LDI	R16,1
    0109 DFE4      RCALL	_LCD1602_sendbyte
    010A 01FA      MOVW	R30,R20
    010B 8020      LDD	R2,0+Z
    010C 2022      TST	R2
    010D F7B9      BNE	0x0105
(0078) 	}
(0079) }
    010E 940E06EB  CALL	pop_gset1
    0110 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:
    0111 E021      LDI	R18,1
    0112 2700      CLR	R16
    0113 DFDA      RCALL	_LCD1602_sendbyte
(0089) 	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
    0114 E002      LDI	R16,2
    0115 E010      LDI	R17,0
(0090) }

⌨️ 快捷键说明

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