📄 time_1302.lst
字号:
(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 + -