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

📄 time_8515.lst

📁 AVR开发板例子源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0158) 	   else
(0159) 	   {
(0160) 	       mid |= (1<<i);          //读取1
    00DD E001      LDI	R16,1
    00DE 2F16      MOV	R17,R22
    00DF D18A      RCALL	lsl8
    00E0 2B40      OR	R20,R16
(0161) 	   }
(0162) 	   PORTA |= (1<<PA3);      //时钟置高
    00E1 9ADB      SBI	0x1B,3
(0163) 	   PORTA &= ~(1<<PA3);     //时钟置低,产生下降沿
    00E2 98DB      CBI	0x1B,3
    00E3 9563      INC	R22
    00E4 3068      CPI	R22,0x8
    00E5 F370      BCS	0x00D4
(0164) 	 }
(0165) 	 return (mid);
    00E6 2F04      MOV	R16,R20
    00E7 D161      RCALL	pop_gset2
    00E8 9508      RET
_write_DS1302:
  i                    --> R20
    00E9 D169      RCALL	push_gset1
(0166) }
(0167) /************************************************
(0168) 函 数 名:    write_DS1302
(0169) 功    能:    给DS1302写入上电数据,置需要设定的时钟值
(0170) 输入参数:     /
(0171) 输出参数:    /
(0172) 描    述:    单字节和多字节操作模式都用了。
(0173)               数据格式为:秒 分 时 日 月 星期 年 写保护字节
(0174) ***********************************************/
(0175) void write_DS1302 (void)
(0176) {
(0177)      uchar i;
(0178) 
(0179) 	 DDRA |= (1<<DDA5)|(1<<DDA4)|(1<<DDA3); //复位,数据和时钟脚都为输出   
    00EA B38A      IN	R24,0x1A
    00EB 6388      ORI	R24,0x38
    00EC BB8A      OUT	0x1A,R24
(0180) 	 PORTA &= ~(1<<PA5);        //RST=0
    00ED 98DD      CBI	0x1B,5
(0181) 	 PORTA &= ~(1<<PA3);        //CLK=0
    00EE 98DB      CBI	0x1B,3
(0182) 	 PORTA |= (1<<PA5);         //RST=1 
    00EF 9ADD      SBI	0x1B,5
(0183) 	 NOP();
    00F0 0000      NOP
(0184) 	 InputByte(0x8e);    //写保护命令字节的地址
    00F1 E80E      LDI	R16,0x8E
    00F2 DFC9      RCALL	_InputByte
(0185) 	 InputByte(0x00);    //解除写保护命令
    00F3 2700      CLR	R16
    00F4 DFC7      RCALL	_InputByte
(0186) 	 PORTA &= ~(1<<PA5);        //RST=0
    00F5 98DD      CBI	0x1B,5
(0187) 	 PORTA &= ~(1<<PA3);        //CLK=0
    00F6 98DB      CBI	0x1B,3
(0188) 	 PORTA |= (1<<PA5);        //RST=1
    00F7 9ADD      SBI	0x1B,5
(0189) 	 NOP();
    00F8 0000      NOP
(0190) 	 InputByte(0b10010000);    //涓流充电寄存器的地址
    00F9 E900      LDI	R16,0x90
    00FA DFC1      RCALL	_InputByte
(0191) 	 InputByte(0b10101010);    //设置涓流充电
    00FB EA0A      LDI	R16,0xAA
    00FC DFBF      RCALL	_InputByte
(0192) 	 PORTA &= ~(1<<PA5);        //RST=0
    00FD 98DD      CBI	0x1B,5
(0193) 	 PORTA &= ~(1<<PA3);        //CLK=0
    00FE 98DB      CBI	0x1B,3
(0194) 	 PORTA |= (1<<PA5);        //RST=1
    00FF 9ADD      SBI	0x1B,5
(0195) 	 NOP();
    0100 0000      NOP
(0196) 	 InputByte(0xbe);    //多字节写操作命令
    0101 EB0E      LDI	R16,0xBE
    0102 DFB9      RCALL	_InputByte
(0197) 	 for (i=0;i<8;i++)
    0103 2744      CLR	R20
    0104 C009      RJMP	0x010E
(0198) 	 {
(0199) 	    InputByte(buf_write[i]);
    0105 E881      LDI	R24,0x81
    0106 E090      LDI	R25,0
    0107 2FE4      MOV	R30,R20
    0108 27FF      CLR	R31
    0109 0FE8      ADD	R30,R24
    010A 1FF9      ADC	R31,R25
    010B 8100      LDD	R16,Z+0
    010C DFAF      RCALL	_InputByte
    010D 9543      INC	R20
    010E 3048      CPI	R20,0x8
    010F F3A8      BCS	0x0105
(0200) 	 }
(0201) 	 PORTA &= ~(1<<PA5);   //RST=0
    0110 98DD      CBI	0x1B,5
    0111 D144      RCALL	pop_gset1
    0112 9508      RET
_read_DS1302:
  i                    --> R20
    0113 D13F      RCALL	push_gset1
(0202) }
(0203) /************************************************
(0204) 函 数 名:    read_DS1302
(0205) 功    能:    读取DS1302的所有时间数据
(0206) 输入参数:     /
(0207) 输出参数:    /
(0208) 描    述:    使用多字节方式。
(0209)               数据格式为:秒 分 时 日 月 星期 年
(0210) ***********************************************/
(0211) void read_DS1302 (void) 
(0212) {
(0213)     uchar i;
(0214) 	DDRA |= (1<<DDA5)|(1<<DDA3); //复位和时钟脚都为输出
    0114 B38A      IN	R24,0x1A
    0115 6288      ORI	R24,0x28
    0116 BB8A      OUT	0x1A,R24
(0215) 	PORTA &= ~(1<<PA5);          //RST=0
    0117 98DD      CBI	0x1B,5
(0216)     PORTA &= ~(1<<PA3);          //CLK=0
    0118 98DB      CBI	0x1B,3
(0217) 	PORTA |= (1<<PA5);           //RST=1
    0119 9ADD      SBI	0x1B,5
(0218) 	DDRA |= (1<<DDA4);          //数据脚为输出 
    011A 9AD4      SBI	0x1A,4
(0219) 	NOP();
    011B 0000      NOP
(0220) 	InputByte(0xbf);            //多字节读命令
    011C EB0F      LDI	R16,0xBF
    011D DF9E      RCALL	_InputByte
(0221) 	DDRA &= ~(1<<DDA4);          //数据脚改为输入
    011E 98D4      CBI	0x1A,4
(0222) 	NOP();
    011F 0000      NOP
(0223) 	for (i=0;i<8;i++)
    0120 2744      CLR	R20
    0121 C009      RJMP	0x012B
(0224) 	{
(0225) 	   buf_read[i]=OutputByte();
    0122 DFAD      RCALL	_OutputByte
    0123 E889      LDI	R24,0x89
    0124 E090      LDI	R25,0
    0125 2FE4      MOV	R30,R20
    0126 27FF      CLR	R31
    0127 0FE8      ADD	R30,R24
    0128 1FF9      ADC	R31,R25
    0129 8300      STD	Z+0,R16
    012A 9543      INC	R20
    012B 3048      CPI	R20,0x8
    012C F3A8      BCS	0x0122
(0226) 	}
(0227) 	PORTA &= ~(1<<PA5);          //RST=0
    012D 98DD      CBI	0x1B,5
    012E D127      RCALL	pop_gset1
    012F 9508      RET
_write_pc232:
  i                    --> R20
    0130 D122      RCALL	push_gset1
    0131 2F40      MOV	R20,R16
(0228) }
(0229) 
(0230) /********************************************************
(0231)   子程序名:   write_pc232()
(0232)   功    能:   串口发送一个字节
(0233)   输入参数:   /
(0234)   输出参数:   /
(0235)   描    述:   把数据发送出去先发送再检测,发完后,才离开
(0236) ********************************************************/
(0237) void write_pc232(uchar i)
(0238) {
(0239)  	 while(!(UCSRA&(1<<UDRE)));     //1字节发送完毕?
    0132 9B5D      SBIS	0x0B,5
    0133 CFFE      RJMP	0x0132
(0240) 	 UDR = i;                     //发送一个字符数据
    0134 B94C      OUT	0x0C,R20
(0241) 	 DelaymS (10);
    0135 E00A      LDI	R16,0xA
    0136 E010      LDI	R17,0
    0137 DF2E      RCALL	_DelaymS
    0138 D11D      RCALL	pop_gset1
    0139 9508      RET
(0242) }
(0243) /************************************************
(0244) 函 数 名:    mcu_Init()
(0245) 功    能:    单片机初始化函数
(0246) 输入参数:     /
(0247) 输出参数:    /
(0248) 描    述:    相关口方向的设置等
(0249) ***********************************************/
(0250) void mcu_Init(void)
(0251) {
(0252)  	DDRC = 0xff;     //PC口为推挽1输出,段码
_mcu_Init:
    013A EF8F      LDI	R24,0xFF
    013B BB84      OUT	0x14,R24
(0253) 	DDRD = 0xff;     //PD口为推挽1输出,位码,PD7为485DE脚。
    013C BB81      OUT	0x11,R24
(0254) 	DDRA = 0xff;     //PA口接DS1302
    013D BB8A      OUT	0x1A,R24
    013E 9508      RET
(0255) }
(0256) /********************************************************
(0257)   子程序名:   usart_Init()
(0258)   功    能:   串口初始化
(0259)   输入参数:   /
(0260)   输出参数:   /
(0261)   描    述:   /
(0262) ********************************************************/
(0263) void usart_Init (void)
(0264) {
(0265) 	 UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
_usart_Init:
    013F E383      LDI	R24,0x33
    0140 B989      OUT	0x09,R24
(0266) 	 UCSRB = (1<<RXEN)|(1<<TXEN);    //UART控制寄存器,RXD&TXD使能
    0141 E188      LDI	R24,0x18
    0142 B98A      OUT	0x0A,R24
    0143 9508      RET
_spk:
  i                    --> R20
    0144 D10E      RCALL	push_gset1
    0145 2F40      MOV	R20,R16
(0267) }
(0268) /************************************************
(0269) 函 数 名:    spk()
(0270) 功    能:    蜂鸣器鸣叫一声函数
(0271) 输入参数:     
(0272) 输出参数:    
(0273) 描    述:    /
(0274) ***********************************************/
(0275) void spk (uchar i) 
(0276) {
(0277)  	 DDRA |= (1<<2);    //DDRA2为输出。
    0146 9AD2      SBI	0x1A,2
(0278) 	 PORTA &= ~(1<<PA2);     //蜂鸣器响
    0147 98DA      CBI	0x1B,2
(0279) 	 DelaymS (i);          //延迟
    0148 2F04      MOV	R16,R20
    0149 2711      CLR	R17
    014A DF1B      RCALL	_DelaymS
(0280) 	 PORTA |= (1<<PA2);     //蜂鸣器关闭
    014B 9ADA      SBI	0x1B,2
    014C D109      RCALL	pop_gset1
    014D 9508      RET
(0281) }
(0282) /********************************************************
(0283)   子程序名:   data_conversion()
(0284)   输入参数:   数据转换程序
(0285)   输出参数:   /
(0286)   描    述:   /1302读出的数据是BCD码形式,必须进行数制转换。
(0287)   数据格式:    秒   分   时    日   月 星期 年  写保护字节
(0288)   显示格式:   秒秒 分分 时时  日日 月月    年年 辅助
(0289) ********************************************************/
(0290) void data_conversion (void)
(0291) {
(0292) 	 buf_time[29] = (buf_read[0] & 0x0f) + '0';   //秒的低位
_data_conversion:
    014E 91800089  LDS	R24,buf_read
    0150 708F      ANDI	R24,0xF
    0151 5D80      SUBI	R24,0xD0
    0152 9380007D  STS	0x7D,R24
(0293) 	 buf_time[28] = (buf_read[0] >> 4 ) + '0';  //秒的高位
    0154 91800089  LDS	R24,buf_read
    0156 9582      SWAP	R24
    0157 708F      ANDI	R24,0xF
    0158 5D80      SUBI	R24,0xD0
    0159 9380007C  STS	0x7C,R24
(0294) 	 
(0295) 	 buf_time[26] = (buf_read[1] & 0x0f) + '0';   //分的低位
    015B 9180008A  LDS	R24,buf_read+1
    015D 708F      ANDI	R24,0xF
    015E 5D80      SUBI	R24,0xD0
    015F 9380007A  STS	0x7A,R24
(0296) 	 buf_time[25] = (buf_read[1] >> 4 ) + '0';  //分的高位
    0161 9180008A  LDS	R24,buf_read+1
    0163 9582      SWAP	R24
    0164 708F      ANDI	R24,0xF
    0165 5D80      SUBI	R24,0xD0
    0166 93800079  STS	0x79,R24
(0297) 	 
(0298) 	 buf_time[23] = (buf_read[2] & 0x0f) + '0';   //时的低位
    0168 9180008B  LDS	R24,buf_read+2
    016A 708F      ANDI	R24,0xF
    016B 5D80      SUBI	R24,0xD0
    016C 93800077  STS	0x77,R24
(0299) 	 buf_time[22] = (buf_read[2] >> 4 ) + '0';  //时的高位
    016E 9180008B  LDS	R24,buf_read+2
    0170 9582      SWAP	R24
    0171 708F      ANDI	R24,0xF
    0172 5D80      SUBI	R24,0xD0
    0173 93800076  STS	0x76,R24
(0300) 	 
(0301) 	 buf_time[14] = (buf_read[3] & 0x0f) + '0';   //日的低位
    0175 9180008C  LDS	R24,buf_read+3
    0177 708F      ANDI	R24,0xF
    0178 5D80      SUBI	R24,0xD0
    0179 9380006E  STS	0x6E,R24
(0302) 	 buf_time[13] = (buf_read[3] >> 4 ) + '0';  //日的高位
    017B 9180008C  LDS	R24,buf_read+3
    017D 9582      SWAP	R24
    017E 708F      ANDI	R24,0xF
    017F 5D80      SUBI	R24,0xD0
    0180 9380006D  STS	0x6D,R24
(0303) 	 
(0304) 	 buf_time[11] = (buf_read[4] & 0x0f) + '0';   //月的高位
    0182 9180008D  LDS	R24,0x8D
    0184 708F      ANDI	R24,0xF
    0185 5D80      SUBI	R24,0xD0
    0186 9380006B  STS	0x6B,R24
(0305) 	 buf_time[10] = (buf_read[4] >> 4 ) + '0';  //月的高位
    0188 9180008D  LDS	R24,0x8D
    018A 9582      SWAP	R24
    018B 708F      ANDI	R24,0xF
    018C 5D80      SUBI	R24,0xD0
    018D 9380006A  STS	0x6A,R24
(0306) 	 
(0307) 	 buf_time[8]  = (buf_read[6] & 0x0f) + '0';   //年的高位
    018F 9180008F  LDS	R24,0x8F
    0191 708F      ANDI	R24,0xF
    0192 5D80      SUBI	R24,0xD0
    0193 93800068  STS	0x68,R24
(0308) 	 buf_time[7]  = (buf_read[6] >> 4 ) + '0';  //年的高位
    0195 9180008F  LDS	R24,0x8F
    0197 9582      SWAP	R24
    0198 708F      ANDI	R24,0xF
    0199 5D80      SUBI	R24,0xD0
    019A 93800067  STS	0x67,R24
    019C 9508      RET

⌨️ 快捷键说明

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