📄 test-adc.lst
字号:
(0142)
(0143) return bf;
0107 9508 RET
_LCDReady:
bf --> R20
0108 940E02FD CALL push_gset1
(0144) }
(0145) void LCDReady(void)
(0146) {
(0147) unsigned char bf;
(0148) do
(0149) {bf = BFRead();
010A DFEC RCALL _BFRead
010B 2F40 MOV R20,R16
(0150) //PORTA = bf; //just for debug
(0151) }
(0152) while((bf&0x80)==0x80);
010C 2E24 MOV R2,R20
010D 2433 CLR R3
010E FC27 SBRC R2,7
010F CFFA RJMP 0x010A
(0153) DataOut;
0110 EF8F LDI R24,0xFF
0111 BB87 OUT 0x17,R24
0112 940E0300 CALL pop_gset1
0114 9508 RET
_CharWrite:
data --> R20
0115 940E02FD CALL push_gset1
0117 2F40 MOV R20,R16
(0154) }
(0155) void CharWrite(unsigned char data)
(0156) {
(0157) LCDReady();
0118 DFEF RCALL _LCDReady
(0158) RS_1;
0119 9A94 SBI 0x12,4
(0159) RW_0;
011A 9895 CBI 0x12,5
(0160) DataLcd = data; //
011B BB48 OUT 0x18,R20
(0161) delay250ns;
011C 0000 NOP
011D 0000 NOP
(0162) EN_1;
011E 9A97 SBI 0x12,7
(0163) delay500ns;
011F 0000 NOP
0120 0000 NOP
0121 0000 NOP
0122 0000 NOP
(0164) EN_0;
0123 9897 CBI 0x12,7
(0165) delay125ns;
0124 0000 NOP
(0166) RS_0;
0125 9894 CBI 0x12,4
(0167) RW_1;
0126 9A95 SBI 0x12,5
0127 940E0300 CALL pop_gset1
0129 9508 RET
(0168) }
(0169) void LcdInit(void)
(0170) {
(0171) LCDReady();
_LcdInit:
012A DFDD RCALL _LCDReady
(0172) FunctionSet();
012B DFA5 RCALL _FunctionSet
(0173) LCDReady();
012C DFDB RCALL _LCDReady
(0174) DdramSet(0);
012D 2700 CLR R16
012E DFB6 RCALL _DdramSet
(0175) LCDReady();
012F DFD8 RCALL _LCDReady
(0176) VisionSet();
0130 DF8F RCALL _VisionSet
(0177) LCDReady();
0131 DFD6 RCALL _LCDReady
(0178) InputSet();
0132 DF7D RCALL _InputSet
(0179) LCDReady();
0133 DFD4 RCALL _LCDReady
(0180) ClearLcd();
0134 DF58 RCALL _ClearLcd
(0181) LCDReady();
0135 DFD2 RCALL _LCDReady
(0182) home();
0136 DF69 RCALL _home
(0183) delay_us(10);
0137 E00A LDI R16,0xA
0138 E010 LDI R17,0
0139 940E0197 CALL _delay_us
013B 9508 RET
_CharsWrite:
addr --> R22
s --> R20
addry --> R12
addrx --> R10
013C 940E02F7 CALL push_gset4
013E 2EC2 MOV R12,R18
013F 2EA0 MOV R10,R16
0140 8548 LDD R20,Y+8
0141 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)
0142 2D8C MOV R24,R12
0143 3081 CPI R24,1
0144 F411 BNE 0x0147
(0189) {
(0190) addr = addrx;
0145 2D6A MOV R22,R10
(0191) }
0146 C007 RJMP 0x014E
(0192) else if (addry==2)
0147 2D8C MOV R24,R12
0148 3082 CPI R24,2
0149 F419 BNE 0x014D
(0193) {
(0194) addr = (addrx+0x40);
014A 2D6A MOV R22,R10
014B 5C60 SUBI R22,0xC0
(0195) }
014C C001 RJMP 0x014E
(0196) else
(0197) {
(0198) addr = 0;
014D 2766 CLR R22
(0199) }
(0200) DdramSet(0); //初始化ddram地址
014E 2700 CLR R16
014F DF95 RCALL _DdramSet
(0201) LCDReady();
0150 DFB7 RCALL _LCDReady
(0202) DdramSet(addr); //设定ddram地址
0151 2F06 MOV R16,R22
0152 DF92 RCALL _DdramSet
(0203) delay_us(80);
0153 E500 LDI R16,0x50
0154 E010 LDI R17,0
0155 940E0197 CALL _delay_us
0157 C009 RJMP 0x0161
(0204) while(*s)
(0205) {
(0206) CharWrite(*s);
0158 01FA MOVW R30,R20
0159 8100 LDD R16,Z+0
015A DFBA RCALL _CharWrite
(0207) s++;
015B 5F4F SUBI R20,0xFF
015C 4F5F SBCI R21,0xFF
(0208) delay_us(80); //等待写入操作完成
015D E500 LDI R16,0x50
015E E010 LDI R17,0
015F 940E0197 CALL _delay_us
0161 01FA MOVW R30,R20
0162 8020 LDD R2,Z+0
0163 2022 TST R2
0164 F799 BNE 0x0158
0165 940E02F2 CALL pop_gset4
0167 9508 RET
_DataWrite:
addr --> R22
s --> R20
addry --> R12
addrx --> R10
0168 940E02F7 CALL push_gset4
016A 2EC2 MOV R12,R18
016B 2EA0 MOV R10,R16
016C 8548 LDD R20,Y+8
016D 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)
016E 2D8C MOV R24,R12
016F 3081 CPI R24,1
0170 F411 BNE 0x0173
(0215) {
(0216) addr = addrx;
0171 2D6A MOV R22,R10
(0217) }
0172 C007 RJMP 0x017A
(0218) else if (addry==2)
0173 2D8C MOV R24,R12
0174 3082 CPI R24,2
0175 F419 BNE 0x0179
(0219) {
(0220) addr = (addrx+0x40);
0176 2D6A MOV R22,R10
0177 5C60 SUBI R22,0xC0
(0221) }
0178 C001 RJMP 0x017A
(0222) else
(0223) {
(0224) addr = 0;
0179 2766 CLR R22
(0225) }
(0226) DdramSet(0); //初始化ddram地址
017A 2700 CLR R16
017B DF69 RCALL _DdramSet
(0227) LCDReady();
017C DF8B RCALL _LCDReady
(0228) DdramSet(addr); //设定ddram地址
017D 2F06 MOV R16,R22
017E DF66 RCALL _DdramSet
(0229) delay_us(80);
017F E500 LDI R16,0x50
0180 E010 LDI R17,0
0181 940E0197 CALL _delay_us
0183 C00A RJMP 0x018E
(0230) while(*s!=0XFF)
(0231) {
(0232) CharWrite((*s)+0x30);
0184 01FA MOVW R30,R20
0185 8100 LDD R16,Z+0
0186 5D00 SUBI R16,0xD0
0187 DF8D RCALL _CharWrite
(0233) s++;
0188 5F4F SUBI R20,0xFF
0189 4F5F SBCI R21,0xFF
(0234) delay_us(80); //等待写入操作完成
018A E500 LDI R16,0x50
018B E010 LDI R17,0
018C 940E0197 CALL _delay_us
018E 01FA MOVW R30,R20
018F 8180 LDD R24,Z+0
0190 3F8F CPI R24,0xFF
0191 F791 BNE 0x0184
0192 940E02F2 CALL pop_gset4
0194 9508 RET
FILE: F:\radio\第十一篇\test-adc\delay.c
(0001) /*时钟为8MHZ*/
(0002) void delay_1us(void)
(0003) {
(0004) asm("nop");
_delay_1us:
0195 0000 NOP
0196 9508 RET
_delay_us:
itemp --> R20
itimes --> R22
0197 940E02FB CALL push_gset2
0199 01B8 MOVW R22,R16
(0005) }
(0006) void delay_us(unsigned int itimes)
(0007) {
(0008) unsigned int itemp;
(0009) for (itemp=0;itemp<itimes;itemp++)
019A 2744 CLR R20
019B 2755 CLR R21
019C C003 RJMP 0x01A0
(0010) {
(0011) delay_1us();
019D DFF7 RCALL _delay_1us
019E 5F4F SUBI R20,0xFF
019F 4F5F SBCI R21,0xFF
01A0 1746 CP R20,R22
01A1 0757 CPC R21,R23
01A2 F3D0 BCS 0x019D
01A3 940E02EF CALL pop_gset2
01A5 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
01A6 E001 LDI R16,1
01A7 E010 LDI R17,0
01A8 C002 RJMP 0x01AB
01A9 5F0F SUBI R16,0xFF
01AA 4F1F SBCI R17,0xFF
01AB 3706 CPI R16,0x76
01AC E0E4 LDI R30,4
01AD 071E CPC R17,R30
01AE F3D0 BCS 0x01A9
01AF 9508 RET
_delay_ms:
itemp --> R20
itimes --> R22
01B0 940E02FB CALL push_gset2
01B2 01B8 MOVW R22,R16
(0018) }
(0019) void delay_ms(unsigned int itimes)
(0020) {
(0021) unsigned int itemp;
(0022) for (itemp=0;itemp<itimes;itemp++)
01B3 2744 CLR R20
01B4 2755 CLR R21
01B5 C003 RJMP 0x01B9
(0023) {
(0024) delay_1ms();
01B6 DFEF RCALL _delay_1ms
01B7 5F4F SUBI R20,0xFF
01B8 4F5F SBCI R21,0xFF
01B9 1746 CP R20,R22
01BA 0757 CPC R21,R23
01BB F3D0 BCS 0x01B6
01BC 940E02EF CALL pop_gset2
01BE 9508 RET
FILE: F:\radio\第十一篇\test-adc\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) void port_init(void)
(0021) {
(0022) PORTA = 0xFE;
_port_init:
01BF EF8E LDI R24,0xFE
01C0 BB8B OUT 0x1B,R24
(0023) DDRA = 0xFE;
01C1 BB8A OUT 0x1A,R24
(0024) PORTB = 0xFF;
01C2 EF8F LDI R24,0xFF
01C3 BB88 OUT 0x18,R24
(0025) DDRB = 0xFF;
01C4 BB87 OUT 0x17,R24
(0026) PORTC = 0xFF;
01C5 BB85 OUT 0x15,R24
(0027) DDRC = 0xFF;
01C6 BB84 OUT 0x14,R24
(0028) DDRD = 0xFB; //PD2(INT0)引脚设置为输入
01C7 EF8B LDI R24,0xFB
01C8 BB81 OUT 0x11,R24
(0029) PORTD = 0xFB; //关闭内部上拉
01C9 BB82 OUT 0x12,R24
01CA 9508 RET
_adc_isr:
temp --> R16
01CB 922A ST R2,-Y
01CC 923A ST R3,-Y
01CD 930A ST R16,-Y
01CE 931A ST R17,-Y
01CF 93EA ST R30,-Y
01D0 B62F IN R2,0x3F
01D1 922A ST R2,-Y
(0030) }
(0031) /* AD转换程序 */
(0032) #pragma interrupt_handler adc_isr:15
(0033) void adc_isr(void)
(0034) {
(0035) unsigned int temp=0;
01D2 2700 CLR R16
01D3 2711 CLR R17
01D4 C002 RJMP 0x01D7
(0036) while(temp<6)
(0037) temp++; //短延时
01D5 5F0F SUBI R16,0xFF
01D6 4F1F SBCI R17,0xFF
01D7 3006 CPI R16,6
01D8 E0E0 LDI R30,0
01D9 071E CPC R17,R30
01DA F3D0 BCS 0x01D5
(0038) adc_result = ADC; //读取AD转换值
01DB B024 IN R2,0x04
01DC B035 IN R3,0x05
01DD 9230007C STS adc_result+1,R3
01DF 9220007B STS adc_result,R2
(0039)
(0040) ADCSRA |= (1<<ADSC); //再次启动转换
01E1 9A36 SBI 0x06,6
01E2 9029 LD R2,Y+
01E3 BE2F OUT 0x3F,R2
01E4 91E9 LD R30,Y+
01E5 9119 LD R17,Y+
01E6 9109 LD R16,Y+
01E7 9039 LD R3,Y+
01E8 9029 LD R2,Y+
01E9 9518 RETI
_data_con:
i --> R10
temp --> R12
01EA 940E02F7 CALL push_gset4
(0041) }
(0042) void data_con(void)
(0043) {
(0044) unsigned int temp;
(0045) unsigned char i;
(0046) temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
01EC 9020007B LDS R2,adc_result
01EE 9030007C LDS R3,adc_result+1
01F0 2444 CLR R4
01F1 2455 CLR R5
01F2 E040 LDI R20,0
01F3 E051 LDI R21,1
01F4 E060 LDI R22,0
01F5 E070 LDI R23,0
01F6 925A ST R5,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -