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

📄 time_1302.lst

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

⌨️ 快捷键说明

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