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