📄 sleep.lst
字号:
0146 0000 NOP
(0164) EN_0;
0147 9897 CBI 0x12,7
(0165) delay125ns;
0148 0000 NOP
(0166) RS_0;
0149 9894 CBI 0x12,4
(0167) RW_1;
014A 9A95 SBI 0x12,5
014B 940E0396 CALL pop_gset1
014D 9508 RET
(0168) }
(0169) void LcdInit(void)
(0170) {
(0171) LCDReady();
_LcdInit:
014E DFDD RCALL _LCDReady
(0172) FunctionSet();
014F DFA5 RCALL _FunctionSet
(0173) LCDReady();
0150 DFDB RCALL _LCDReady
(0174) DdramSet(0);
0151 2700 CLR R16
0152 DFB6 RCALL _DdramSet
(0175) LCDReady();
0153 DFD8 RCALL _LCDReady
(0176) VisionSet();
0154 DF8F RCALL _VisionSet
(0177) LCDReady();
0155 DFD6 RCALL _LCDReady
(0178) InputSet();
0156 DF7D RCALL _InputSet
(0179) LCDReady();
0157 DFD4 RCALL _LCDReady
(0180) ClearLcd();
0158 DF58 RCALL _ClearLcd
(0181) LCDReady();
0159 DFD2 RCALL _LCDReady
(0182) home();
015A DF69 RCALL _home
(0183) delay_us(10);
015B E00A LDI R16,0xA
015C E010 LDI R17,0
015D 940E01BB CALL _delay_us
015F 9508 RET
_CharsWrite:
addr --> R22
s --> R20
addry --> R12
addrx --> R10
0160 940E038D CALL push_gset4
0162 2EC2 MOV R12,R18
0163 2EA0 MOV R10,R16
0164 8548 LDD R20,Y+8
0165 8559 LDD R21,Y+9
(0184) }
(0185) void CharsWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
(0186) {
(0187) unsigned char addr;
(0188) if (addry==1)
0166 2D8C MOV R24,R12
0167 3081 CPI R24,1
0168 F411 BNE 0x016B
(0189) {
(0190) addr = addrx;
0169 2D6A MOV R22,R10
(0191) }
016A C007 RJMP 0x0172
(0192) else if (addry==2)
016B 2D8C MOV R24,R12
016C 3082 CPI R24,2
016D F419 BNE 0x0171
(0193) {
(0194) addr = (addrx+0x40);
016E 2D6A MOV R22,R10
016F 5C60 SUBI R22,0xC0
(0195) }
0170 C001 RJMP 0x0172
(0196) else
(0197) {
(0198) addr = 0;
0171 2766 CLR R22
(0199) }
(0200) DdramSet(0); //初始化ddram地址
0172 2700 CLR R16
0173 DF95 RCALL _DdramSet
(0201) LCDReady();
0174 DFB7 RCALL _LCDReady
(0202) DdramSet(addr); //设定ddram地址
0175 2F06 MOV R16,R22
0176 DF92 RCALL _DdramSet
(0203) delay_us(80);
0177 E500 LDI R16,0x50
0178 E010 LDI R17,0
0179 940E01BB CALL _delay_us
017B C009 RJMP 0x0185
(0204) while(*s)
(0205) {
(0206) CharWrite(*s);
017C 01FA MOVW R30,R20
017D 8100 LDD R16,Z+0
017E DFBA RCALL _CharWrite
(0207) s++;
017F 5F4F SUBI R20,0xFF
0180 4F5F SBCI R21,0xFF
(0208) delay_us(80); //等待写入操作完成
0181 E500 LDI R16,0x50
0182 E010 LDI R17,0
0183 940E01BB CALL _delay_us
0185 01FA MOVW R30,R20
0186 8020 LDD R2,Z+0
0187 2022 TST R2
0188 F799 BNE 0x017C
0189 940E0388 CALL pop_gset4
018B 9508 RET
_DataWrite:
addr --> R22
s --> R20
addry --> R12
addrx --> R10
018C 940E038D CALL push_gset4
018E 2EC2 MOV R12,R18
018F 2EA0 MOV R10,R16
0190 8548 LDD R20,Y+8
0191 8559 LDD R21,Y+9
(0209) }
(0210) }
(0211) void DataWrite(unsigned char addrx,unsigned char addry,unsigned char *s)
(0212) {
(0213) unsigned char addr;
(0214) if (addry==1)
0192 2D8C MOV R24,R12
0193 3081 CPI R24,1
0194 F411 BNE 0x0197
(0215) {
(0216) addr = addrx;
0195 2D6A MOV R22,R10
(0217) }
0196 C007 RJMP 0x019E
(0218) else if (addry==2)
0197 2D8C MOV R24,R12
0198 3082 CPI R24,2
0199 F419 BNE 0x019D
(0219) {
(0220) addr = (addrx+0x40);
019A 2D6A MOV R22,R10
019B 5C60 SUBI R22,0xC0
(0221) }
019C C001 RJMP 0x019E
(0222) else
(0223) {
(0224) addr = 0;
019D 2766 CLR R22
(0225) }
(0226) DdramSet(0); //初始化ddram地址
019E 2700 CLR R16
019F DF69 RCALL _DdramSet
(0227) LCDReady();
01A0 DF8B RCALL _LCDReady
(0228) DdramSet(addr); //设定ddram地址
01A1 2F06 MOV R16,R22
01A2 DF66 RCALL _DdramSet
(0229) delay_us(80);
01A3 E500 LDI R16,0x50
01A4 E010 LDI R17,0
01A5 940E01BB CALL _delay_us
01A7 C00A RJMP 0x01B2
(0230) while(*s!=0XFF)
(0231) {
(0232) CharWrite((*s)+0x30);
01A8 01FA MOVW R30,R20
01A9 8100 LDD R16,Z+0
01AA 5D00 SUBI R16,0xD0
01AB DF8D RCALL _CharWrite
(0233) s++;
01AC 5F4F SUBI R20,0xFF
01AD 4F5F SBCI R21,0xFF
(0234) delay_us(80); //等待写入操作完成
01AE E500 LDI R16,0x50
01AF E010 LDI R17,0
01B0 940E01BB CALL _delay_us
01B2 01FA MOVW R30,R20
01B3 8180 LDD R24,Z+0
01B4 3F8F CPI R24,0xFF
01B5 F791 BNE 0x01A8
01B6 940E0388 CALL pop_gset4
01B8 9508 RET
FILE: F:\radio\第十二篇\sleep\delay.c
(0001) /*时钟为8MHZ*/
(0002) void delay_1us(void)
(0003) {
(0004) asm("nop");
_delay_1us:
01B9 0000 NOP
01BA 9508 RET
_delay_us:
itemp --> R20
itimes --> R22
01BB 940E0391 CALL push_gset2
01BD 01B8 MOVW R22,R16
(0005) }
(0006) void delay_us(unsigned int itimes)
(0007) {
(0008) unsigned int itemp;
(0009) for (itemp=0;itemp<itimes;itemp++)
01BE 2744 CLR R20
01BF 2755 CLR R21
01C0 C003 RJMP 0x01C4
(0010) {
(0011) delay_1us();
01C1 DFF7 RCALL _delay_1us
01C2 5F4F SUBI R20,0xFF
01C3 4F5F SBCI R21,0xFF
01C4 1746 CP R20,R22
01C5 0757 CPC R21,R23
01C6 F3D0 BCS 0x01C1
01C7 940E0385 CALL pop_gset2
01C9 9508 RET
(0012) }
(0013) }
(0014) void delay_1ms(void)
(0015) {
(0016) unsigned int itemp;
(0017) for(itemp=1;itemp<1142;itemp++);
_delay_1ms:
itemp --> R16
01CA E001 LDI R16,1
01CB E010 LDI R17,0
01CC C002 RJMP 0x01CF
01CD 5F0F SUBI R16,0xFF
01CE 4F1F SBCI R17,0xFF
01CF 3706 CPI R16,0x76
01D0 E0E4 LDI R30,4
01D1 071E CPC R17,R30
01D2 F3D0 BCS 0x01CD
01D3 9508 RET
_delay_ms:
itemp --> R20
itimes --> R22
01D4 940E0391 CALL push_gset2
01D6 01B8 MOVW R22,R16
(0018) }
(0019) void delay_ms(unsigned int itimes)
(0020) {
(0021) unsigned int itemp;
(0022) for (itemp=0;itemp<itimes;itemp++)
01D7 2744 CLR R20
01D8 2755 CLR R21
01D9 C003 RJMP 0x01DD
(0023) {
(0024) delay_1ms();
01DA DFEF RCALL _delay_1ms
01DB 5F4F SUBI R20,0xFF
01DC 4F5F SBCI R21,0xFF
01DD 1746 CP R20,R22
01DE 0757 CPC R21,R23
01DF F3D0 BCS 0x01DA
01E0 940E0385 CALL pop_gset2
01E2 9508 RET
FILE: F:\radio\第十二篇\sleep\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) #include "usart.h"
(0005) #include "delay.h"
(0006) #define vref 256
(0007) volatile unsigned int extint_count=0;
(0008) volatile unsigned char act_flag=0;
(0009) volatile unsigned int adc_result;
(0010) unsigned char adc_show[6];
(0011) /** /
(0012) volatile:数据类型声明,表明该变量在程序执行中可被隐含改变
(0013) 编译器有时会将SRAM中的数据拷贝到通用寄存器中以提高程序的执行效率
(0014) (在通用寄存器中对数据的操作速度比操作SRAM中的数据要快),这样会带来
(0015) 一个问题,如果该SRAM中的数据已经被隐含改变(比如中断),那么编译器仍然
(0016) 读取寄存器中之前的SRAM拷贝值显然与其实际值不同,从而出现错误。
(0017) 本例中extint_count的值在外部中断服务程序中被改变,通过volatile
(0018) 声明通知编译器。
(0019) /**/
(0020) /** /
(0021) MCUCR &= 0X40; //将休眠模式清0,即休眠模式1
(0022)
(0023) MCUCR |= 0X10; //将休眠模式为1,即休眠模式2
(0024) /**/
(0025) void port_init(void)
(0026) {
(0027) PORTA = 0xFE;
_port_init:
01E3 EF8E LDI R24,0xFE
01E4 BB8B OUT 0x1B,R24
(0028) DDRA = 0xFE;
01E5 BB8A OUT 0x1A,R24
(0029) PORTB = 0xFF;
01E6 EF8F LDI R24,0xFF
01E7 BB88 OUT 0x18,R24
(0030) DDRB = 0xFF;
01E8 BB87 OUT 0x17,R24
(0031) PORTC = 0xFF;
01E9 BB85 OUT 0x15,R24
(0032) DDRC = 0xFF;
01EA BB84 OUT 0x14,R24
(0033) DDRD = 0xFB; //PD2(INT0)引脚设置为输入
01EB EF8B LDI R24,0xFB
01EC BB81 OUT 0x11,R24
(0034) PORTD = 0xFB; //关闭内部上拉
01ED BB82 OUT 0x12,R24
01EE 9508 RET
_adc_isr:
temp --> R16
01EF 922A ST R2,-Y
01F0 923A ST R3,-Y
01F1 930A ST R16,-Y
01F2 931A ST R17,-Y
01F3 93EA ST R30,-Y
01F4 B62F IN R2,0x3F
01F5 922A ST R2,-Y
(0035) }
(0036) /* AD转换程序 */
(0037) #pragma interrupt_handler adc_isr:15
(0038) void adc_isr(void)
(0039) {
(0040) unsigned int temp=0;
01F6 2700 CLR R16
01F7 2711 CLR R17
01F8 C002 RJMP 0x01FB
(0041) while(temp<6)
(0042) temp++; //短延时
01F9 5F0F SUBI R16,0xFF
01FA 4F1F SBCI R17,0xFF
01FB 3006 CPI R16,6
01FC E0E0 LDI R30,0
01FD 071E CPC R17,R30
01FE F3D0 BCS 0x01F9
(0043) adc_result = ADC; //读取AD转换值
01FF B024 IN R2,0x04
0200 B035 IN R3,0x05
0201 923000C4 STS adc_result+1,R3
0203 922000C3 STS adc_result,R2
0205 9029 LD R2,Y+
0206 BE2F OUT 0x3F,R2
0207 91E9 LD R30,Y+
0208 9119 LD R17,Y+
0209 9109 LD R16,Y+
020A 9039 LD R3,Y+
020B 9029 LD R2,Y+
020C 9518 RETI
_data_con:
i --> R10
temp --> R12
020D 940E038D CALL push_gset4
(0044)
(0045) //ADCSRA |= (1<<ADSC); //再次启动转换
(0046) }
(0047) void data_con(void)
(0048) {
(0049) unsigned int temp;
(0050) unsigned char i;
(0051) temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
020F 902000C3 LDS R2,adc_result
0211 903000C4 LDS R3,adc_result+1
0213 2444 CLR R4
0214 2455 CLR R5
0215 E040 LDI R20,0
0216 E051 LDI R21,1
0217 E060 LDI R22,0
0218 E070 LDI R23,0
0219 925A ST R5,-Y
021A 924A ST R4,-Y
021B 923A ST R3,-Y
021C 922A ST R2,-Y
021D 018A MOVW R16,R20
021E 019B MOVW R18,R22
021F 940E0355 CALL empy32s
0221 E08A LDI R24,0xA
0222 E090 LDI R25,0
0223 938A ST R24,-Y
0224 940E03CF CALL lsr32
0226 0168 MOVW R12,R16
(0052) for(i=0;i<3;i++)
0227 24AA CLR R10
0228 C019 RJMP 0x0242
(0053) {
(0054) adc_show[3-i]=temp%10+0x30; //转换电压值用来在LCD上显示
0229 2C2A MOV R2,R10
022A 2433 CLR R3
022B E0E3 LDI R30,3
022C E0F0 LDI R31,0
022D 19E2 SUB R30,R2
022E 09F3 SBC R31,R3
022F EB8D LDI R24,0xBD
0230 E090 LDI R25,0
0231 0FE8 ADD R30,R24
0232 1FF9 ADC R31,R25
0233 E02A LDI R18,0xA
0234 E030 LDI R19,0
0235 0186 MOVW R16,R12
0236 940E0339 CALL mod16u
0238 01C8 MOVW R24,R16
0239 96C0 ADIW R24,0x30
023A 8380 STD Z+0,R24
(0055) temp=temp/10;
023B E02A LDI R18,0xA
023C E030 LDI R19,0
023D 0186 MOVW R16,R12
023E 940E033B CALL div16u
0240 0168 MOVW R12,R16
0241 94A3 INC R10
0242 2D8A MOV R24,R10
0243 3083 CPI R24,3
0244 F320 BCS 0x0229
(0056) }
(0057) adc_show[0]=adc_show[1];
0245 902000BE LDS R2,adc_show+1
0247 922000BD STS adc_show,R2
(0058) adc_show[1]='.';
0249 E28E LDI R24,0x2E
024A 938000BE STS adc_show+1,R24
(0059) adc_show[4]='V';
024C E586 LDI R24,0x56
024D 938000C1 STS 0xC1,R24
(0060) adc_show[5]=0; //数组结束标记
024F 2422 CLR R2
0250 922000C2 STS 0xC2,R2
0252 940E0388 CALL pop_gset4
0254 9508 RET
_int0_isr:
0255 938A ST R24,-Y
0256 939A ST R25,-Y
0257 B78F IN R24,0x3F
0258 938A ST R24,-Y
(0061) }
(0062)
(0063) #pragma interrupt_handler int0_isr:2
(0064) void int0_isr(void)
(0065) {
(0066) extint_count++;
0259 91800060 LDS R24,extint_count
025B 91900061 LDS R25,extint_count+1
025D 9601 ADIW R24,1
025E 93900061 STS extint_count+1,R25
0260 93800060 STS extint_count,R24
(0067) if (act_flag!=1)
0262 91800062 LDS R24,act_flag
0264 3081 CPI R24,1
0265 F019 BEQ 0x0269
(0068) {
(0069) act_flag = 1;
0266 E081 LDI R24,1
0267 93800062 STS act_flag,R24
(0070) }
0269 9189 LD R24,Y+
026A BF8F OUT 0x3F,R24
026B 9199 LD R25,Y+
026C 9189 LD R24,Y+
026D 9518 RETI
(0071) }
(0072) void adc_init(void)
(0073) {
(0074) ADMUX = (1<<REFS1)|
_adc_init:
026E EC80 LDI R24,0xC0
026F B987 OUT 0x07,R24
(0075) (1<<REFS0)| //选择内部2.56v作为参考电压
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -