📄 text2.lst
字号:
Interrupt Vectors
00000 C00B RJMP __text_start|__start
Program Code (text area)
__text_start|__start:
0000C E5CF LDI R28,0x5F
0000D E0D2 LDI R29,2
0000E BFCD OUT 0x3D,R28
0000F BFDE OUT 0x3E,R29
00010 51C0 SUBI R28,0x10
00011 40D0 SBCI R29,0
00012 EA0A LDI R16,0xAA
00013 8308 ST Y,R16
00014 2400 CLR R0
00015 E6EB LDI R30,0x6B
00016 E0F0 LDI R31,0
00017 E010 LDI R17,0
00018 36EB CPI R30,0x6B
00019 07F1 CPC R31,R17
0001A F011 BEQ 0x001D
0001B 9201 ST Z+,R0
0001C CFFB RJMP 0x0018
0001D 8300 ST Z,R16
0001E E0EC LDI R30,0xC
0001F E0F0 LDI R31,0
00020 E6A0 LDI R26,0x60
00021 E0B0 LDI R27,0
00022 E010 LDI R17,0
00023 E000 LDI R16,0
00024 BF0B OUT 0x3B,R16
00025 31E7 CPI R30,0x17
00026 07F1 CPC R31,R17
00027 F021 BEQ 0x002C
00028 95C8 LPM
00029 9631 ADIW R30,1
0002A 920D ST X+,R0
0002B CFF9 RJMP 0x0025
0002C D0AF RCALL _main
_exit:
0002D CFFF RJMP _exit
FILE: F:\file\数控电源3\ad_da\text\delay.c
(0001) #define DELAY_C
(0002) #include "includes.h"
(0003) #define XTAL 8 //晶振频率,单位MHz
(0004) void delay_1us(void) //1us延时函数
(0005) {
(0006) asm("nop");
_delay_1us:
0002E 0000 NOP
0002F 9508 RET
_delay_nus:
i --> R20
n --> R10
00030 D287 RCALL push_xgset300C
00031 0158 MOVW R10,R16
(0007) }
(0008)
(0009) void delay_nus(unsigned int n) //N us延时函数
(0010) {
(0011) unsigned int i=0;
(0012) for (i=0;i<n;i++)
00032 2744 CLR R20
00033 2755 CLR R21
00034 C003 RJMP 0x0038
(0013) delay_1us();
00035 DFF8 RCALL _delay_1us
00036 5F4F SUBI R20,0xFF
00037 4F5F SBCI R21,0xFF
00038 154A CP R20,R10
00039 055B CPC R21,R11
0003A F3D0 BCS 0x0035
0003B C281 RJMP pop_xgset300C
(0014) }
(0015)
(0016) void delay_1ms(void) //1ms延时函数
(0017) {
(0018) unsigned int i;
(0019) for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
i --> R16
0003C 2700 CLR R16
0003D 2711 CLR R17
0003E C002 RJMP 0x0041
0003F 5F0F SUBI R16,0xFF
00040 4F1F SBCI R17,0xFF
00041 E786 LDI R24,0x76
00042 E094 LDI R25,4
00043 1708 CP R16,R24
00044 0719 CPC R17,R25
00045 F3C8 BCS 0x003F
00046 9508 RET
_delay_nms:
i --> R20
n --> R10
00047 D270 RCALL push_xgset300C
00048 0158 MOVW R10,R16
(0020) }
(0021)
(0022) void delay_nms(unsigned int n) //N ms延时函数
(0023) {
(0024) unsigned int i=0;
(0025) for (i=0;i<n;i++)
00049 2744 CLR R20
0004A 2755 CLR R21
0004B C003 RJMP 0x004F
(0026) {
(0027) delay_1ms();
0004C DFEF RCALL _delay_1ms
0004D 5F4F SUBI R20,0xFF
0004E 4F5F SBCI R21,0xFF
0004F 154A CP R20,R10
00050 055B CPC R21,R11
00051 F3D0 BCS 0x004C
00052 C26A RJMP pop_xgset300C
_adc:
temp --> R10
00053 92AA ST -Y,R10
00054 92BA ST -Y,R11
FILE: F:\file\数控电源3\ad_da\text\newadc.c
(0001) #define NEWADC_C
(0002) #include"includes.h"
(0003) unsigned int adc(void)
(0004) {
(0005) unsigned int temp;
(0006) DDRA&=~BIT(7); //PA0口输入数据
00055 98D7 CBI 0x1A,7
(0007) ADMUX=0x40;
00056 E480 LDI R24,0x40
00057 B987 OUT 0x07,R24
(0008) ADCSRA=0xC6;
00058 EC86 LDI R24,0xC6
00059 B986 OUT 0x06,R24
(0009) while(!(ADCSRA&(BIT(4))));//查询方式
0005A 9B34 SBIS 0x06,4
0005B CFFE RJMP 0x005A
(0010) temp=ADCL;
0005C B0A4 IN R10,0x04
0005D 24BB CLR R11
(0011) temp=temp+ADCH*256;
0005E B125 IN R18,0x05
0005F 2733 CLR R19
00060 E000 LDI R16,0
00061 E011 LDI R17,1
00062 D233 RCALL empy16s
00063 0EA0 ADD R10,R16
00064 1EB1 ADC R11,R17
(0012) ADCSRA|=BIT(4);
00065 9A34 SBI 0x06,4
(0013) return temp;
00066 0185 MOVW R16,R10
00067 90B9 LD R11,Y+
00068 90A9 LD R10,Y+
00069 9508 RET
_ADtoBCD:
Vref --> R20
j --> Y,+0
count --> R10
tmp --> R10
0006A D24D RCALL push_xgset300C
0006B 0158 MOVW R10,R16
0006C 9724 SBIW R28,4
FILE: F:\file\数控电源3\ad_da\mydesign1\cfile\main.c
(0001) #define MAIN_C
(0002) #include "includes.h"
(0003)
(0004) static unsigned char *value = "00.000 V";
(0005)
(0006) void ADtoBCD(unsigned int tmp)//将AD值转换成BCD码,并写入value
(0007) {
(0008) float j;
(0009) unsigned int count;
(0010) unsigned int Vref=50000;
0006D E540 LDI R20,0x50
0006E EC53 LDI R21,0xC3
(0011)
(0012) j = (float)(((float)((Vref/341)))*tmp)/1000.00;//1022-149853.3724-149.853
0006F E525 LDI R18,0x55
00070 E031 LDI R19,1
00071 018A MOVW R16,R20
00072 D209 RCALL div16u
00073 D2C9 RCALL uint2fp
00074 0118 MOVW R2,R16
00075 0129 MOVW R4,R18
00076 0185 MOVW R16,R10
00077 D2C5 RCALL uint2fp
00078 933A ST -Y,R19
00079 932A ST -Y,R18
0007A 931A ST -Y,R17
0007B 930A ST -Y,R16
0007C 0181 MOVW R16,R2
0007D 0192 MOVW R18,R4
0007E D456 RCALL fpmule2
0007F 0118 MOVW R2,R16
00080 0129 MOVW R4,R18
00081 E008 LDI R16,0x8
00082 E010 LDI R17,0
00083 D275 RCALL lpm32
00084 933A ST -Y,R19
00085 932A ST -Y,R18
00086 931A ST -Y,R17
00087 930A ST -Y,R16
00088 0181 MOVW R16,R2
00089 0192 MOVW R18,R4
0008A D2DD RCALL fpdiv2
0008B 8308 ST Y,R16
0008C 8319 STD Y+1,R17
0008D 832A STD Y+2,R18
0008E 833B STD Y+3,R19
(0013) count = j*100; //14985
0008F E004 LDI R16,4
00090 E010 LDI R17,0
00091 D267 RCALL lpm32
00092 01CE MOVW R24,R28
00093 939A ST -Y,R25
00094 938A ST -Y,R24
00095 D436 RCALL fpmule1
00096 D276 RCALL fpint
00097 0158 MOVW R10,R16
(0014) value[0] = count /10000+0x30; //1
00098 E120 LDI R18,0x10
00099 E237 LDI R19,0x27
0009A D1E1 RCALL div16u
0009B 01C8 MOVW R24,R16
0009C 96C0 ADIW R24,0x30
0009D 91E0 0060 LDS R30,main.c:value
0009F 91F0 0061 LDS R31,main.c:value+1
000A1 8380 ST Z,R24
(0015) count = count %10000; //4985
000A2 E120 LDI R18,0x10
000A3 E237 LDI R19,0x27
000A4 0185 MOVW R16,R10
000A5 D1D4 RCALL mod16u
000A6 0158 MOVW R10,R16
(0016) value[1] = count /1000+0x30;//4
000A7 EE28 LDI R18,0xE8
000A8 E033 LDI R19,3
000A9 D1D2 RCALL div16u
000AA 01C8 MOVW R24,R16
000AB 96C0 ADIW R24,0x30
000AC 91E0 0060 LDS R30,main.c:value
000AE 91F0 0061 LDS R31,main.c:value+1
000B0 8381 STD Z+1,R24
(0017) count = count %1000; //985
000B1 EE28 LDI R18,0xE8
000B2 E033 LDI R19,3
000B3 0185 MOVW R16,R10
000B4 D1C5 RCALL mod16u
000B5 0158 MOVW R10,R16
(0018) value[3] = count /100 + 0x30; //9
000B6 E624 LDI R18,0x64
000B7 E030 LDI R19,0
000B8 D1C3 RCALL div16u
000B9 01C8 MOVW R24,R16
000BA 96C0 ADIW R24,0x30
000BB 91E0 0060 LDS R30,main.c:value
000BD 91F0 0061 LDS R31,main.c:value+1
000BF 8383 STD Z+3,R24
(0019) count = count %100; //85
000C0 E624 LDI R18,0x64
000C1 E030 LDI R19,0
000C2 0185 MOVW R16,R10
000C3 D1B6 RCALL mod16u
000C4 0158 MOVW R10,R16
(0020) value[4] = count /10 + 0x30; //8
000C5 E02A LDI R18,0xA
000C6 E030 LDI R19,0
000C7 D1B4 RCALL div16u
000C8 01C8 MOVW R24,R16
000C9 96C0 ADIW R24,0x30
000CA 91E0 0060 LDS R30,main.c:value
000CC 91F0 0061 LDS R31,main.c:value+1
000CE 8384 STD Z+4,R24
(0021) value[5] = count %10 + 0x30; //5
000CF E02A LDI R18,0xA
000D0 E030 LDI R19,0
000D1 0185 MOVW R16,R10
000D2 D1A7 RCALL mod16u
000D3 01C8 MOVW R24,R16
000D4 96C0 ADIW R24,0x30
000D5 91E0 0060 LDS R30,main.c:value
000D7 91F0 0061 LDS R31,main.c:value+1
000D9 8385 STD Z+5,R24
000DA 9624 ADIW R28,4
000DB C1E1 RJMP pop_xgset300C
_main:
tmp --> R10
i --> R10
key_press_num --> R22
num --> R20
000DC 9722 SBIW R28,2
(0022) }
(0023) //主函数
(0024) void main(void)
(0025) { unsigned int i=0;
000DD 24AA CLR R10
000DE 24BB CLR R11
(0026) unsigned char key_press_num;
(0027) unsigned int num=0;
000DF 2744 CLR R20
000E0 2755 CLR R21
(0028)
(0029) DDRB=0XFF; //PB口输出SPI信号
000E1 EF8F LDI R24,0xFF
000E2 BB87 OUT 0x17,R24
(0030) DDRA&=~BIT(PA2);//PA2输入,检测加
000E3 98D2 CBI 0x1A,2
(0031) PORTA|=BIT(PA2);//PA2上拉电阻
000E4 9ADA SBI 0x1B,2
(0032) DDRA&=~BIT(PA3);//PA3输入,检测减
000E5 98D3 CBI 0x1A,3
(0033) PORTA|=BIT(PA3);//PA3上拉电阻
000E6 9ADB SBI 0x1B,3
(0034)
(0035) spi_init();
000E7 D070 RCALL _spi_init
(0036) spi_io_init();
000E8 D072 RCALL _spi_io_init
(0037) Init_LCD();
000E9 D121 RCALL _Init_LCD
(0038) LCD_Clear();
000EA D12D RCALL _LCD_Clear
(0039) delay_nms(10);
000EB E00A LDI R16,0xA
000EC E010 LDI R17,0
000ED DF59 RCALL _delay_nms
(0040)
(0041) LCD_DisplayString(2,1,value);//显示"00.000 V";
000EE 9020 0060 LDS R2,main.c:value
000F0 9030 0061 LDS R3,main.c:value+1
000F2 8239 STD Y+1,R3
000F3 8228 ST Y,R2
000F4 E021 LDI R18,1
000F5 E002 LDI R16,2
000F6 D13F RCALL _LCD_DisplayString
(0042) delay_nms(1000);
000F7 EE08 LDI R16,0xE8
000F8 E013 LDI R17,3
000F9 DF4D RCALL _delay_nms
000FA C05A RJMP 0x0155
(0043)
(0044) while (1) //主循环
(0045) {
(0046) unsigned int tmp;
(0047) tmp=adc();//启动AD并返回temp值
000FB DF57 RCALL _adc
000FC 0158 MOVW R10,R16
(0048) ADtoBCD(tmp);//将temp值转换成BCD码并写入value
000FD DF6C RCALL _ADtoBCD
(0049) LCD_DisplayString(2,1,value);
000FE 9020 0060 LDS R2,main.c:value
00100 9030 0061 LDS R3,main.c:value+1
00102 8239 STD Y+1,R3
00103 8228 ST Y,R2
00104 E021 LDI R18,1
00105 E002 LDI R16,2
00106 D12F RCALL _LCD_DisplayString
(0050)
(0051) if( (PINA&0x04)==0 ) //检测到加
00107 99CA SBIC 0x19,2
00108 C026 RJMP 0x012F
(0052) {
(0053) delay_nms(10); //延时去抖,一般10-20ms
00109 E00A LDI R16,0xA
0010A E010 LDI R17,0
0010B DF3B RCALL _delay_nms
(0054) if( (PINA&0x04)==0 ) //再次确认按键是否按下,没有按下则退出
0010C 99CA SBIC 0x19,2
0010D C021 RJMP 0x012F
(0055) {
0010E C015 RJMP 0x0124
(0056) while((PINA&0x04)==0)
(0057) {
(0058) key_press_num++;
0010F 9563 INC R22
(0059) delay_nms(10); //10x200=2000ms=2s
00110 E00A LDI R16,0xA
00111 E010 LDI R17,0
00112 DF34 RCALL _delay_nms
(0060) //****************************长按键模式开始***********************
(0061)
(0062) if(key_press_num==100) //大约2s,进入长按键模式
00113 3664 CPI R22,0x64
00114 F479 BNE 0x0124
(0063) {
(0064) key_press_num=0;
00115 2766 CLR R22
00116 C00B RJMP 0x0122
(0065) while((PINA&0x04)==0) //这里用于识别是否按键还在按下,如果按下执行相关动作,否则退出
(0066) {
(0067) if(num<1000) //是否达到最大值
00117 3E48 CPI R20,0xE8
00118 E0E3 LDI R30,3
00119 075E CPC R21,R30
0011A F410 BCC 0x011D
(0068) num=num+24; //未到达最大值则加操作
0011B 5E48 SUBI R20,0xE8
0011C 4F5F SBCI R21,0xFF
(0069) spi_tlc5615(num);
0011D 018A MOVW R16,R20
0011E D043 RCALL _spi_tlc5615
(0070) delay_nms(30); //用于调节长按循环操作的速度,可以自行调整此值以便达到最佳效果
0011F E10E LDI R16,0x1E
00120 E010 LDI R17,0
00121 DF25 RCALL _delay_nms
00122 9BCA SBIS 0x19,2
00123 CFF3 RJMP 0x0117
00124 9BCA SBIS 0x19,2
00125 CFE9 RJMP 0x010F
(0071) }
(0072) }
(0073) }
(0074) key_press_num=0;//防止累加造成错误识别
00126 2766 CLR R22
(0075)
(0076) //****************************长按键模式结束***********************
(0077)
(0078) if(num<1000)
00127 3E48 CPI R20,0xE8
00128 E0E3 LDI R30,3
00129 075E CPC R21,R30
0012A F410 BCC 0x012D
(0079) num=num+24;
0012B 5E48 SUBI R20,0xE8
0012C 4F5F SBCI R21,0xFF
(0080) spi_tlc5615(num);
0012D 018A MOVW R16,R20
0012E D033 RCALL _spi_tlc5615
(0081)
(0082) }
(0083) }
(0084)
(0085)
(0086)
(0087) if( (PINA&0x08)==0 ) //检测到减
0012F 99CB SBIC 0x19,3
00130 C024 RJMP 0x0155
(0088) {
(0089) delay_nms(10); //延时去抖,一般10-20ms
00131 E00A LDI R16,0xA
00132 E010 LDI R17,0
00133 DF13 RCALL _delay_nms
(0090) if( (PINA&0x08)==0 ) //再次确认按键是否按下,没有按下则退出
00134 99CB SBIC 0x19,3
00135 C01F RJMP 0x0155
(0091) {
00136 C014 RJMP 0x014B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -