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

📄 bi2.lst

📁 驱动320240
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    00BA E5CF      LDI	R28,0x5F
    00BB E0D4      LDI	R29,4
    00BC BFCD      OUT	0x3D,R28
    00BD BFDE      OUT	0x3E,R29
    00BE 51C0      SUBI	R28,0x10
    00BF 40D0      SBCI	R29,0
    00C0 EA0A      LDI	R16,0xAA
    00C1 8308      STD	Y+0,R16
    00C2 2400      CLR	R0
    00C3 E2E6      LDI	R30,0x26
    00C4 E0F1      LDI	R31,1
    00C5 E011      LDI	R17,1
    00C6 33E0      CPI	R30,0x30
    00C7 07F1      CPC	R31,R17
    00C8 F011      BEQ	0x00CB
    00C9 9201      ST	R0,Z+
    00CA CFFB      RJMP	0x00C6
    00CB 8300      STD	Z+0,R16
    00CC EAEE      LDI	R30,0xAE
    00CD E0F0      LDI	R31,0
    00CE E6A0      LDI	R26,0x60
    00CF E0B0      LDI	R27,0
    00D0 E011      LDI	R17,1
    00D1 37E4      CPI	R30,0x74
    00D2 07F1      CPC	R31,R17
    00D3 F021      BEQ	0x00D8
    00D4 95C8      LPM
    00D5 9631      ADIW	R30,1
    00D6 920D      ST	R0,X+
    00D7 CFF9      RJMP	0x00D1
    00D8 940E0616  CALL	_main
_exit:
    00DA CFFF      RJMP	_exit
FILE: E:\temp\avr\bi2\bi2.c
(0001) /**********************
(0002) 编写者:赖行
(0003) 创建时间:2006年1月
(0004) 最后修改:2006年1月
(0005) 用途:1602液晶在MEGEA8上的显示
(0006) 接法:见图
(0007) **************************/
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) #inclede <eeprom.h> 
(0011) 
(0012) #define LCD_EN_PORT    PORTD
(0013) #define LCD_RS_PORT    PORTD
(0014) #define LCD_DATA_PORT  PORTD
(0015) #define LCD_DATA_DDR   DDRD
(0016) #define LCD_DATA_PIN   PIND
(0017) #define LCD_EN         0x10   //portB2        out
(0018) #define LCD_RS         0x40   //portB0        out
(0019) #define LCD_DATA       0x0F   //portB4/5/6/7   out
(0020) /*--------------------------------------------------------------------------------------------------
(0021) Public function prototypes
(0022) --------------------------------------------------------------------------------------------------*/
(0023) void LCD_init         (void);
(0024) void LCD_en_write     (void);
(0025) void LCD_write_char   (unsigned command,unsigned data);
(0026) void LCD_set_xy       (unsigned char x, unsigned char y);
(0027) void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
(0028) void delay_nus        (unsigned int n);
(0029) void delay_nms        (unsigned int n);
(0030) /*unsigned char time[0][0]=10;
(0031) unsigned char time[0][1]=55;
(0032) unsigned char time[0][2]=23;*/
(0033) unsigned char alarmfalg=1;
(0034) unsigned char mo=0;
(0035) unsigned char time[10][3]={9,5,8,0,56,10,0,0,13,0,0,12,0,0,10,0,0,11};
(0036) unsigned char change=10;
(0037) 
(0038)   #define DS1302_CE			4		//PB4 SS 必须设为输出 ----DS1302 pin5
(0039) 
(0040) //宏定义
(0041) #define EnDS1302 PORTB|= (1<<DS1302_CE)	// 置CE为高电平,使能SPI接口
(0042) #define DiDS1302 PORTB&=~(1<<DS1302_CE)	// 置CE为低电平,关闭SPI接口
(0043) 
(0044) //函数声明+
(0045) void init_SPI(void);			//初始化SPI接口
(0046) //unsigned char check_RTC(void);			//检测DS1302
(0047) //void init_RTC(void);			//初始化DS1302
(0048) void read_date(void);			//读取当前时间并解释
(0049) extern unsigned char date_init[8]={0x50,	//59秒
(0050) 						   0x27,	//59分
(0051) 						   0x3,	//23时  24小时制
(0052) 						   0x15,	//06日
(0053) 						   0x04,	//10月
(0054) 						   0x06,	//星期四
(0055) 						   0x06,	//2005年
(0056) 						   0x80		//写保护,
(0057) 						   };
(0058) extern unsigned char CURDATE[7];
(0059) unsigned char sCURDATE[]="                                                    ";
(0060) extern unsigned char sWEEK[];
(0061) unsigned char date;
(0062) unsigned char temp_1302[7];
(0063) //全局变量声明
(0064) 
(0065) 
(0066)    /*-----------------------------------------------------------------------
(0067) 延时函数
(0068) 系统时钟:8M
(0069) -----------------------------------------------------------------------*/
(0070) void delay_1us(void)                 //1us延时函数
(0071)   {
(0072)    asm("nop");
_delay_1us:
    00DB 0000      NOP
(0073)       asm("nop");
    00DC 0000      NOP
(0074)       asm("nop");
    00DD 0000      NOP
(0075)       asm("nop");
    00DE 0000      NOP
    00DF 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    00E0 940E072D  CALL	push_gset2
    00E2 01B8      MOVW	R22,R16
(0076)   }
(0077) 
(0078) void delay_nus(unsigned int n)       //N us延时函数
(0079)   {
(0080)    unsigned int i=0;
    00E3 2744      CLR	R20
    00E4 2755      CLR	R21
(0081)    for (i=0;i<n;i++)
    00E5 C003      RJMP	0x00E9
(0082)    delay_1us();
    00E6 DFF4      RCALL	_delay_1us
    00E7 5F4F      SUBI	R20,0xFF
    00E8 4F5F      SBCI	R21,0xFF
    00E9 1746      CP	R20,R22
    00EA 0757      CPC	R21,R23
    00EB F3D0      BCS	0x00E6
    00EC 940E071B  CALL	pop_gset2
    00EE 9508      RET
(0083)   }
(0084)   
(0085) void delay_1ms(void)                 //1ms延时函数
(0086)   {
(0087)    unsigned int i;
(0088)    for (i=0;i<1142;i++);
_delay_1ms:
  i                    --> R16
    00EF 2700      CLR	R16
    00F0 2711      CLR	R17
    00F1 C002      RJMP	0x00F4
    00F2 5F0F      SUBI	R16,0xFF
    00F3 4F1F      SBCI	R17,0xFF
    00F4 3706      CPI	R16,0x76
    00F5 E0E4      LDI	R30,4
    00F6 071E      CPC	R17,R30
    00F7 F3D0      BCS	0x00F2
    00F8 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    00F9 940E072D  CALL	push_gset2
    00FB 01B8      MOVW	R22,R16
(0089)   }
(0090)   
(0091) void delay_nms(unsigned int n)       //N ms延时函数
(0092)   {
(0093)    unsigned int i=0;
    00FC 2744      CLR	R20
    00FD 2755      CLR	R21
(0094)    for (i=0;i<n;i++)
    00FE C003      RJMP	0x0102
(0095)    delay_1ms();
    00FF DFEF      RCALL	_delay_1ms
    0100 5F4F      SUBI	R20,0xFF
    0101 4F5F      SBCI	R21,0xFF
    0102 1746      CP	R20,R22
    0103 0757      CPC	R21,R23
    0104 F3D0      BCS	0x00FF
    0105 940E071B  CALL	pop_gset2
    0107 9508      RET
_delay:
  i                    --> R20
  n                    --> R22
    0108 940E072D  CALL	push_gset2
    010A 01B8      MOVW	R22,R16
(0096)   }
(0097)    
(0098) void delay(unsigned int n)//延时n毫秒
(0099) {
(0100)   unsigned int i;
(0101)   for (i=0;i<n;i++)//执行n次1毫秒延时
    010B 2744      CLR	R20
    010C 2755      CLR	R21
    010D C003      RJMP	0x0111
(0102)   delay_1ms();
    010E DFE0      RCALL	_delay_1ms
    010F 5F4F      SUBI	R20,0xFF
    0110 4F5F      SBCI	R21,0xFF
    0111 1746      CP	R20,R22
    0112 0757      CPC	R21,R23
    0113 F3D0      BCS	0x010E
    0114 940E071B  CALL	pop_gset2
    0116 9508      RET
_change_1302:
  j                    --> R20
  i                    --> R22
  p                    --> R16
    0117 940E072D  CALL	push_gset2
(0103) }
(0104) char change_1302(char*p)
(0105) {
(0106) 	unsigned char i,j;
(0107) 	j=*p&0x0F;
    0119 01F8      MOVW	R30,R16
    011A 8140      LDD	R20,Z+0
    011B 704F      ANDI	R20,0xF
(0108) 	i=(*p>>4)&0x0f;
    011C 8160      LDD	R22,Z+0
    011D 9562      SWAP	R22
    011E 706F      ANDI	R22,0xF
    011F 706F      ANDI	R22,0xF
(0109) 	*p=i*10+j;
    0120 E08A      LDI	R24,0xA
    0121 9F86      MUL	R24,R22
    0122 2C20      MOV	R2,R0
    0123 0E24      ADD	R2,R20
    0124 8220      STD	Z+0,R2
(0110) 	return *p;
    0125 8100      LDD	R16,Z+0
    0126 940E071B  CALL	pop_gset2
    0128 9508      RET
(0111) 
(0112) }
(0113) 
(0114) 
(0115) //初始化SPI接口
(0116) void init_SPI(void)
(0117) {
(0118)     SPCR = (1<<SPE)|(1<<MSTR)|(1<<DORD)|(1<<SPR0)|(1<<SPR1);		
_init_SPI:
    0129 E783      LDI	R24,0x73
    012A B98D      OUT	0x0D,R24
    012B 9508      RET
_Single_SPI:
  rdata                --> Y+0
  wdata                --> R20
  command              --> R22
    012C 940E072D  CALL	push_gset2
    012E 2F42      MOV	R20,R18
    012F 2F60      MOV	R22,R16
    0130 9721      SBIW	R28,1
(0119) // 使能SPI接口,主机模式,LSB低位在先,模式0,16分频,SPI时钟约460KHz
(0120) 
(0121) }
(0122) /*-----------------------------------------------------------------------
(0123) Single_SPI    : 使用SPI接口读写数据到DS1302
(0124)  
(0125) 输入参数:	command:	命令选择;
(0126) 			wdata:		写入的数据;
(0127) 返回值		rdata:		读回的数据;	
(0128)    (SPI的收发是同时进行的)
(0129) -----------------------------------------------------------------------*/
(0130) unsigned char Single_SPI(unsigned char command,unsigned char wdata)
(0131) {
(0132)     char rdata;
(0133)     EnDS1302;							// 使能LCD
    0131 9AC4      SBI	0x18,4
(0134)    delay_nus(10);
    0132 E00A      LDI	R16,0xA
    0133 E010      LDI	R17,0
    0134 DFAB      RCALL	_delay_nus
(0135)     SPDR = command;			 			// 传送命令到SPI寄存器
    0135 B96F      OUT	0x0F,R22
(0136) 	while(!(SPSR&(1<<SPIF)))
    0136 9B77      SBIS	0x0E,7
    0137 CFFE      RJMP	0x0136
(0137)      ;	
(0138) 
(0139)    delay_nus(10);
    0138 E00A      LDI	R16,0xA
    0139 E010      LDI	R17,0
    013A DFA5      RCALL	_delay_nus
(0140)     SPDR = wdata;	
    013B B94F      OUT	0x0F,R20
(0141) 	    delay_nus(10);		 			// 传送数据到SPI寄存器
    013C E00A      LDI	R16,0xA
    013D E010      LDI	R17,0
    013E DFA1      RCALL	_delay_nus
(0142) 	while(!(SPSR&(1<<SPIF)))
    013F 9B77      SBIS	0x0E,7
    0140 CFFE      RJMP	0x013F
(0143) 		   ;
(0144) 
(0145)     rdata=SPDR;							// 读取数据
    0141 B02F      IN	R2,0x0F
    0142 8228      STD	Y+0,R2
(0146) 		    delay_nus(10);	
    0143 E00A      LDI	R16,0xA
    0144 E010      LDI	R17,0
    0145 DF9A      RCALL	_delay_nus
(0147)     DiDS1302;							// 关断LCD SPI通讯
    0146 98C4      CBI	0x18,4
(0148)     delay_nus(10);
    0147 E00A      LDI	R16,0xA
    0148 E010      LDI	R17,0
    0149 DF96      RCALL	_delay_nus
(0149) 	change_1302(& rdata);
    014A 018E      MOVW	R16,R28
    014B DFCB      RCALL	_change_1302
(0150)     return rdata;
    014C 8108      LDD	R16,Y+0
    014D 9621      ADIW	R28,1
    014E 940E071B  CALL	pop_gset2
    0150 9508      RET
_Burst_SPI:
  prdata               --> R20
  pwdata               --> R22
  len                  --> R10
  CMD                  --> R12
    0151 940E0729  CALL	push_gset4
    0153 2EA2      MOV	R10,R18
    0154 2EC0      MOV	R12,R16
    0155 8568      LDD	R22,Y+8
    0156 8579      LDD	R23,Y+9
    0157 854A      LDD	R20,Y+10
    0158 855B      LDD	R21,Y+11
(0151) }
(0152) 
(0153) /*-----------------------------------------------------------------------
(0154) Burst_SPI    : 使用SPI接口读写一批数据到DS1302
(0155)  
(0156) 输入参数:	CMD:		选择Clock/RAM,选择读写
(0157) 			lenth:		数据长度
(0158) 			pwdata:		写入数据的缓冲区;
(0159) 			prdata:		读回数据的缓冲区;	
(0160)    (SPI的收发是同时进行的)
(0161) 读CLOCK的数据从SECOND寄存器开始,到CONTROL寄存器,最大8字节
(0162) 写CLOCK的数据必须一次写完8个字节
(0163) 读写RAM的数据从 RAM0地址开始,到RAM30地址,最大31字节
(0164) -----------------------------------------------------------------------*/
(0165) void Burst_SPI(unsigned char CMD,unsigned char len,
(0166) 						unsigned char *pwdata,unsigned char *prdata)
(0167) {
(0168) //unsigned char *prdata;
(0169) //*prdata=*temp[0];
(0170)     EnDS1302;								// 使能SPI通讯
    0159 9AC4      SBI	0x18,4
(0171)     delay_nus(10);
    015A E00A      LDI	R16,0xA
    015B E010      LDI	R17,0
    015C DF83      RCALL	_delay_nus
(0172) 	SPDR=CMD;								// 传送命令到SPI寄存器
    015D B8CF      OUT	0x0F,R12
(0173)     while(!(SPSR&(1<<SPIF)))
    015E 9B77      SBIS	0x0E,7
    015F CFFE      RJMP	0x015E
(0174) 		   ;
(0175)     delay_nus(10);    
    0160 E00A      LDI	R16,0xA
    0161 E010      LDI	R17,0
    0162 DF7D      RCALL	_delay_nus
    0163 C00A      RJMP	0x016E
(0176)     while (len--)
(0177)     {
(0178)     	SPDR = *pwdata++;			 		// 传送数据到SPI寄存器
    0164 01FB      MOVW	R30,R22
    0165 9021      LD	R2,Z+
    0166 01BF      MOVW	R22,R30
    0167 B82F      OUT	0x0F,R2
(0179)     	while(!(SPSR&(1<<SPIF)))
    0168 9B77      SBIS	0x0E,7
    0169 CFFE      RJMP	0x0168
(0180) 		   ;
(0181)     	*prdata++=SPDR;						// 读取数据
    016A B02F      IN	R2,0x0F
    016B 01FA      MOVW	R30,R20
    016C 9221      ST	R2,Z+
    016D 01AF      MOVW	R20,R30
    016E 2C2A      MOV	R2,R10
    016F 2433      CLR	R3
    0170 2D82      MOV	R24,R2
    0171 5081      SUBI	R24,1
    0172 2EA8      MOV	R10,R24
    0173 2022      TST	R2
    0174 F779      BNE	0x0164
(0182) 	};
(0183) 	DiDS1302;								// 关断SPI通讯
    0175 98C4      CBI	0x18,4
(0184)    sCURDATE[0]=change_1302(&temp_1302[0]);
    0176 E208      LDI	R16,0x28
    0177 E011      LDI	R17,1
    0178 DF9E      RCALL	_change_1302
    0179 93000089  STS	sCURDATE,R16
(0185) sCURDATE[1]=change_1302(&temp_1302[1]);
    017B E209      LDI	R16,0x29
    017C E011      LDI	R17,1
    017D DF99      RCALL	_change_1302
    017E 9300008A  STS	sCURDATE+1,R16
(0186) sCURDATE[2]=change_1302(&temp_1302[2]);
    0180 E20A      LDI	R16,0x2A
    0181 E011      LDI	R17,1
    0182 DF94      RCALL	_change_1302
    0183 9300008B  STS	sCURDATE+2,R16
(0187) sCURDATE[3]=change_1302(&temp_1302[3]);
    0185 E20B      LDI	R16,0x2B
    0186 E011      LDI	R17,1
    0187 DF8F      RCALL	_change_1302
    0188 9300008C  STS	sCURDATE+3,R16
(0188) sCURDATE[4]=change_1302(&temp_1302[4]);
    018A E20C      LDI	R16,0x2C
    018B E011      LDI	R17,1
    018C DF8A      RCALL	_change_1302
    018D 9300008D  STS	0x8D,R16
(0189) sCURDATE[5]=change_1302(&temp_1302[5]);

⌨️ 快捷键说明

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