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

📄 avrstudy.lst

📁 AVR学习开发 板
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0231 2433      CLR	R3
    0232 0DE2      ADD	R30,R2
    0233 1DF3      ADC	R31,R3
    0234 E680      LDI	R24,0x60
    0235 E090      LDI	R25,0
    0236 0FE8      ADD	R30,R24
    0237 1FF9      ADC	R31,R25
    0238 8100      LDD	R16,Z+0
    0239 DF93      RCALL	_WriteCommand
    023A C020      RJMP	0x025B
(0148)     while(*puts != '\0')
(0149)     {
(0150)         if(col==8)
    023B 3068      CPI	R22,0x8
    023C F411      BNE	0x023F
(0151)         {
(0152)             col=0;
    023D 2766      CLR	R22
(0153)             row++;
    023E 94A3      INC	R10
(0154)         }
(0155)         if(row==4) row=0;
    023F 2D8A      MOV	R24,R10
    0240 3084      CPI	R24,4
    0241 F409      BNE	0x0243
    0242 24AA      CLR	R10
(0156)         WriteCommand(AC_TABLE[8*row+col]);
    0243 E088      LDI	R24,0x8
    0244 9D8A      MUL	R24,R10
    0245 01F0      MOVW	R30,R0
    0246 2E26      MOV	R2,R22
    0247 2433      CLR	R3
    0248 0DE2      ADD	R30,R2
    0249 1DF3      ADC	R31,R3
    024A E680      LDI	R24,0x60
    024B E090      LDI	R25,0
    024C 0FE8      ADD	R30,R24
    024D 1FF9      ADC	R31,R25
    024E 8100      LDD	R16,Z+0
    024F DF7D      RCALL	_WriteCommand
(0157)         WriteData(*puts);		//一个汉字的ASC码是一个16位的,所以要写入两个字节
    0250 01FA      MOVW	R30,R20
    0251 8100      LDD	R16,Z+0
    0252 DF89      RCALL	_WriteData
(0158)         puts++;
    0253 5F4F      SUBI	R20,0xFF
    0254 4F5F      SBCI	R21,0xFF
(0159)         WriteData(*puts);
    0255 01FA      MOVW	R30,R20
    0256 8100      LDD	R16,Z+0
    0257 DF84      RCALL	_WriteData
(0160)         puts++;
    0258 5F4F      SUBI	R20,0xFF
    0259 4F5F      SBCI	R21,0xFF
(0161)         col++;
    025A 9563      INC	R22
    025B 01FA      MOVW	R30,R20
    025C 8020      LDD	R2,Z+0
    025D 2022      TST	R2
    025E F6E1      BNE	0x023B
    025F D8A3      RCALL	pop_gset3
    0260 9508      RET
_PutBMP:
  k                    --> R20
  x                    --> R22
  j                    --> R14
  y                    --> R12
  i                    --> R10
  puts                 --> Y+10
    0261 931A      ST	R17,-Y
    0262 930A      ST	R16,-Y
    0263 D8A5      RCALL	push_gset5
(0162) 	}
(0163) }
(0164) //========写入一屏图片128*64=======
(0165) void PutBMP(unsigned char *puts)
(0166) {
(0167)     unsigned char x,y,i,j,k;
(0168) 	x=0x80;
    0264 E860      LDI	R22,0x80
(0169) 	WriteCommand(0x34);	  		//关图显
    0265 E304      LDI	R16,0x34
    0266 DF66      RCALL	_WriteCommand
(0170)     for(k=0;k<2;k++)
    0267 2744      CLR	R20
    0268 C01B      RJMP	0x0284
(0171) 	{	
(0172) 	    y=0x80;
    0269 E880      LDI	R24,0x80
    026A 2EC8      MOV	R12,R24
(0173) 		for(j=0;j<32;j++)
    026B 24EE      CLR	R14
    026C C012      RJMP	0x027F
(0174) 		{
(0175) 		    WriteCommand(y);	//写入列地址
    026D 2D0C      MOV	R16,R12
    026E DF5E      RCALL	_WriteCommand
(0176)             WriteCommand(x);  	//写入行地址
    026F 2F06      MOV	R16,R22
    0270 DF5C      RCALL	_WriteCommand
(0177)             for(i=0;i<16;i++)
    0271 24AA      CLR	R10
    0272 C007      RJMP	0x027A
(0178) 			{
(0179) 			 WriteData(*(puts++));			
    0273 85EA      LDD	R30,Y+10
    0274 85FB      LDD	R31,Y+11
    0275 9101      LD	R16,Z+
    0276 87FB      STD	Y+11,R31
    0277 87EA      STD	Y+10,R30
    0278 DF63      RCALL	_WriteData
    0279 94A3      INC	R10
    027A 2D8A      MOV	R24,R10
    027B 3180      CPI	R24,0x10
    027C F3B0      BCS	0x0273
(0180) 			}
(0181) 			y++;
    027D 94C3      INC	R12
    027E 94E3      INC	R14
    027F 2D8E      MOV	R24,R14
    0280 3280      CPI	R24,0x20
    0281 F358      BCS	0x026D
(0182) 		}
(0183) 		x=0x88;
    0282 E868      LDI	R22,0x88
    0283 9543      INC	R20
    0284 3042      CPI	R20,2
    0285 F318      BCS	0x0269
(0184) 	}
(0185) 	WriteCommand(0x36);			//开图显
    0286 E306      LDI	R16,0x36
    0287 DF45      RCALL	_WriteCommand
    0288 D87E      RCALL	pop_gset5
    0289 9622      ADIW	R28,2
    028A 9508      RET
_Delayus:
  i                    --> R20
  US                   --> R22
    028B D883      RCALL	push_gset2
    028C 01B8      MOVW	R22,R16
FILE: E:\AVR学习专区\AVR学习板\ds1302.c
(0001) /****************************************************************************************
(0002)                          DS1302的mega8控制程序   
(0003) 		                                                
(0004)              程序功能:该程序是用AVR来控制对ds1302
(0005) 			           读写信号等的操作.
(0006)              硬件连接:分配PC1=SCLK,PC2=I/O,PC3=RST
(0007) 			           三个I/O口分别作为时钟、数据、复位
(0008) 					   的控制。
(0009) 			 显示部分用12864液晶来显示时时时间
(0010) 					                                 作者:张国旗
(0011) 													 2008年12月31号       
(0012) ****************************************************************************************/
(0013) #define uchar unsigned char
(0014) #define uint unsigned int
(0015) #define TRUE 1
(0016) #define FALSE 0
(0017) //=========RTC常量=================
(0018) #define RTC_DDR     DDRC
(0019) #define RTC_PORT	PORTC
(0020) #define RTC_CLK   	PC1	    //时钟
(0021) #define RTC_DATA  	PC2		//数据
(0022) #define RTC_CS    	PC3		//复位
(0023) //============命令=================
(0024) #define RD	  	0x01
(0025) #define WR	  	0x00
(0026) #define C_SEC		0x80	//秒
(0027) #define C_MIN		0x82	//分
(0028) #define C_HR		0x84	//时
(0029) #define C_DAY		0x86	//日
(0030) #define C_MTH		0x88	//月
(0031) #define C_WK		0x8A	//星期 DATE
(0032) #define C_YR		0x8C	//年
(0033) #define C_WP		0x8E	//控制(写保护)
(0034) #define C_CHARGE	0x90	//涓流充电
(0035) #define C_BURST		0xBE	//时钟多字节
(0036) //===========配置================
(0037) #define CLK_HALT	0x80	//停止时钟控制位    SECOND	bit7
(0038) #define CLK_START	0x00	//启动时钟
(0039) #define M12_24		0x80	//12/24小时值选择位 HOUR		bit7 
(0040) #define PROTECT		0x80	//写保护控制位      CONTROL	bit7 
(0041) #define UPROTECT	0x00	//写保护控制位      CONTROL	bit7 
(0042) //=========涓流充电控制常量======
(0043) #define TC_D1R2		0xA5	//high 1 Diode +2K Resistors  
(0044) #define TC_D2R8		0xAB	//low  2 Diodes+8K Resistors  
(0045) #define TC_DISABLED	0x00	//Disabled(TCS<>1010 or DS=00 or RS=00)
(0046) //=========RAM 命令=============
(0047) #define C_RAMBASE		0xC0	//RAM0~RAM30<<1 地址需左移一位 
(0048) //===================延时函数========================
(0049) //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
(0050) //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
(0051) //==================================================
(0052) void Delayus(uint US)		  
(0053) {
(0054)     uint i;
(0055)  	US=US*5/4;		  	    //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    028D E005      LDI	R16,5
    028E E010      LDI	R17,0
    028F 019B      MOVW	R18,R22
    0290 D860      RCALL	empy16s
    0291 01B8      MOVW	R22,R16
    0292 9576      LSR	R23
    0293 9567      ROR	R22
    0294 9576      LSR	R23
    0295 9567      ROR	R22
(0056)  	for( i=0;i<US;i++); 
    0296 2744      CLR	R20
    0297 2755      CLR	R21
    0298 C002      RJMP	0x029B
    0299 5F4F      SUBI	R20,0xFF
    029A 4F5F      SBCI	R21,0xFF
    029B 1746      CP	R20,R22
    029C 0757      CPC	R21,R23
    029D F3D8      BCS	0x0299
    029E D862      RCALL	pop_gset2
    029F 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    02A0 D86E      RCALL	push_gset2
(0057) }
(0058) void Delayms(uint MS)		  
(0059) {
(0060)     uint i,j;
(0061)  	for( i=0;i<MS;i++)
    02A1 2744      CLR	R20
    02A2 2755      CLR	R21
    02A3 C00B      RJMP	0x02AF
(0062)  	for(j=0;j<1141;j++); 	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    02A4 2766      CLR	R22
    02A5 2777      CLR	R23
    02A6 C002      RJMP	0x02A9
    02A7 5F6F      SUBI	R22,0xFF
    02A8 4F7F      SBCI	R23,0xFF
    02A9 3765      CPI	R22,0x75
    02AA E0E4      LDI	R30,4
    02AB 077E      CPC	R23,R30
    02AC F3D0      BCS	0x02A7
    02AD 5F4F      SUBI	R20,0xFF
    02AE 4F5F      SBCI	R21,0xFF
    02AF 1740      CP	R20,R16
    02B0 0751      CPC	R21,R17
    02B1 F390      BCS	0x02A4
    02B2 D84E      RCALL	pop_gset2
    02B3 9508      RET
(0063) }
(0064) /*******************************************
(0065) 函数名称: DS1302_init
(0066) 功    能: 初始化DS1302的数据接口
(0067) 参    数: 无
(0068) 返回值  : 无
(0069) /********************************************/
(0070) void DS1302_portinit(void)		  
(0071) {
(0072)     RTC_DDR|=BIT(RTC_CLK)|BIT(RTC_DATA)|BIT(RTC_CS);
_DS1302_portinit:
    02B4 B384      IN	R24,0x14
    02B5 608E      ORI	R24,0xE
    02B6 BB84      OUT	0x14,R24
    02B7 9508      RET
_DS1302_writeB:
  i                    --> R20
  byte                 --> R22
    02B8 D856      RCALL	push_gset2
    02B9 2F60      MOV	R22,R16
(0073) 	//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
(0074) }
(0075) /*******************************************
(0076) 函数名称: DS1302_writeB
(0077) 功    能: 向DS1302写入一个字节数据(没有RST操作)
(0078) 参    数: byte--要写入的数据
(0079) 返回值  : 无
(0080) ********************************************/
(0081) void DS1302_writeB(uchar byte)
(0082) {
(0083)     uchar i;
(0084)  	for(i=0;i<8;i++)		 	        //8位数据计数
    02BA 2744      CLR	R20
    02BB C00C      RJMP	0x02C8
(0085)  	{
(0086)         RTC_PORT&=~BIT(RTC_CLK);	    //拉低时钟端
    02BC 98A9      CBI	0x15,1
(0087)   		if(byte&0x01)				    //当前位是否是1
    02BD FF60      SBRS	R22,0
    02BE C002      RJMP	0x02C1
(0088)   		{
(0089)     	    RTC_PORT|=BIT(RTC_DATA);   //当前位是1,拉高数据端
    02BF 9AAA      SBI	0x15,2
(0090)   		}
    02C0 C001      RJMP	0x02C2
(0091)   		else						  
(0092)   		{
(0093)    	 		RTC_PORT&=~BIT(RTC_DATA);  //当前位是0,拉低数据端
    02C1 98AA      CBI	0x15,2
(0094)   		}  
(0095)   		Delayus(10);				    //调整时钟和脉冲宽度
    02C2 E00A      LDI	R16,0xA
    02C3 E010      LDI	R17,0
    02C4 DFC6      RCALL	_Delayus
(0096)   		RTC_PORT|=BIT(RTC_CLK);	    //时钟上升沿(DS1302采样数据)
    02C5 9AA9      SBI	0x15,1
(0097)   		byte>>=1;					    //数据右移1位,为送出新数据位做准备
    02C6 9566      LSR	R22
    02C7 9543      INC	R20
    02C8 3048      CPI	R20,0x8
    02C9 F390      BCS	0x02BC
    02CA D836      RCALL	pop_gset2
    02CB 9508      RET
_DS1302_readB:
  i                    --> R20
  byte                 --> R22
    02CC D842      RCALL	push_gset2
(0098)  	}
(0099) }
(0100) /*******************************************
(0101) 函数名称: DS1302_readB
(0102) 功    能: 从DS1302读出一个字节数据(没有RST操作)
(0103) 参    数: 无
(0104) 返回值  : byte--读出的数据
(0105) ********************************************/
(0106) uchar DS1302_readB(void)
(0107) {
(0108)     uchar i,byte=0;
    02CD 2766      CLR	R22
(0109)  	RTC_DDR&=~BIT(RTC_DATA);		    //将数据端口设置为输入		  
    02CE 98A2      CBI	0x14,2
(0110)  	RTC_PORT&=~BIT(RTC_DATA);		    //无上拉电阻
    02CF 98AA      CBI	0x15,2
(0111)  	for(i=0;i<8;i++)			 	    //8位数据计数
    02D0 2744      CLR	R20
    02D1 C00F      RJMP	0x02E1
(0112)  	{
(0113)   	    byte>>=1;  					    //保存读入的数据位
    02D2 9566      LSR	R22
(0114)   		RTC_PORT|=BIT(RTC_CLK);	    //时钟上升沿
    02D3 9AA9      SBI	0x15,1
(0115)   		Delayus(10);				    //延时,调整时钟脉冲宽度
    02D4 E00A      LDI	R16,0xA
    02D5 E010      LDI	R17,0
    02D6 DFB4      RCALL	_Delayus
(0116)   		RTC_PORT&=~BIT(RTC_CLK);	    //时钟下降沿,DS1302输出数据位
    02D7 98A9      CBI	0x15,1
(0117)   		Delayus(10);					//等待数据变化(MEGA16太快,必须等待DS1302的数据位输出,否则不能正确读出)
    02D8 E00A      LDI	R16,0xA
    02D9 E010      LDI	R17,0
    02DA DFB0      RCALL	_Delayus
(0118)   		if(PINC&BIT(RTC_DATA))	 		//当前位是否是高电平
    02DB 9B9A      SBIS	0x13,2
    02DC C002      RJMP	0x02DF
(0119)   		{
(0120)    		    byte|=BIT(PB7);			 	//是高电平就将返回数据的当前位置1
    02DD 6860      ORI	R22,0x80
(0121)   		}
    02DE C001      RJMP	0x02E0
(0122)   		else
(0123)   		{
(0124)    		    byte&=~BIT(PB7);			//是低电平就将返回数据的当前位置0
    02DF 776F      ANDI	R22,0x7F
    02E0 9543      INC	R20
    02E1 3048      CPI	R20,0x8
    02E2 F378      BCS	0x02D2
(0125)   		}
(0126)  	}
(0127)  	RTC_DDR|=BIT(RTC_DATA);		 		//最后将数据端口设置为输出
    02E3 9AA2      SBI	0x14,2
(0128)  	return byte;				 		//返回读出的数据
    02E4 2F06      MOV	R16,R22
    02E5 D81B      RCALL	pop_gset2
    02E6 9508      RET
_DS1302_writeD:

⌨️ 快捷键说明

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