📄 m16.lst
字号:
__start:
__text_start:
002D E5CF LDI R28,0x5F
002E E0D4 LDI R29,4
002F BFCD OUT 0x3D,R28
0030 BFDE OUT 0x3E,R29
0031 51C0 SUBI R28,0x10
0032 40D0 SBCI R29,0
0033 EA0A LDI R16,0xAA
0034 8308 STD Y+0,R16
0035 2400 CLR R0
0036 E6E0 LDI R30,0x60
0037 E0F0 LDI R31,0
0038 E010 LDI R17,0
0039 36EC CPI R30,0x6C
003A 07F1 CPC R31,R17
003B F011 BEQ 0x003E
003C 9201 ST R0,Z+
003D CFFB RJMP 0x0039
003E 8300 STD Z+0,R16
003F E5EA LDI R30,0x5A
0040 E0F0 LDI R31,0
0041 E6A0 LDI R26,0x60
0042 E0B0 LDI R27,0
0043 E010 LDI R17,0
0044 35EA CPI R30,0x5A
0045 07F1 CPC R31,R17
0046 F021 BEQ 0x004B
0047 95C8 LPM
0048 9631 ADIW R30,1
0049 920D ST R0,X+
004A CFF9 RJMP 0x0044
004B 940E004E CALL _main
_exit:
004D CFFF RJMP _exit
FILE: D:\PROTEU~1.7\PROTEU~1.7\JOHU\a___EWTS82\m16.c
(0001) #include <iom16v.h>
(0002) #define uchar unsigned char
(0003) #define uint unsigned int
(0004) #define LcdBus PORTA
(0005) #define BIT(i) (1<<i)
(0006) #define rs 2 //LCD端口定义
(0007) #define rw 3
(0008) #define en 4
(0009)
(0010) const char DisV[]={"V:"} ;//灵敏度
(0011) const char DisP[]={"P:"} ;//精确度
(0012)
(0013) void LcdIni(void) ;
(0014) void WrOp(uchar dat) ;
(0015) void WrDat(uchar dat) ;
(0016) void ChkBusy(void) ;
(0017) void DisText(uchar addr,uchar *text) ;
(0018) void DisTextConst(uchar addr,uchar const *text) ;
(0019) void ShowNum(uchar addr,uint num) ; //在addr处显示数字num
(0020) int AdcVal(uchar n) ;
(0021) void delayms(uint n) ;
(0022) int AdcValPro(uchar n) ;
(0023) char BCD[6] ; //十位二进制的显示码分别是千百十个位的显示
(0024) int Adc[3] ; //存放Adc转换后的值
(0025) void main(void)
(0026) {
(0027) LcdIni() ;
_main:
004E D0ED RCALL _LcdIni
(0028) DisTextConst(0x80,DisV) ;
004F E524 LDI R18,0x54
0050 E030 LDI R19,0
0051 E800 LDI R16,0x80
0052 D0D5 RCALL _DisTextConst
(0029) DisTextConst(0xc0,DisP) ;
0053 E527 LDI R18,0x57
0054 E030 LDI R19,0
0055 EC00 LDI R16,0xC0
0056 D0D1 RCALL _DisTextConst
0057 C00A RJMP 0x0062
(0030)
(0031) while(1)
(0032) {
(0033) ShowNum(0x82,AdcVal(1)) ;
0058 E001 LDI R16,1
0059 D00A RCALL _AdcVal
005A 0198 MOVW R18,R16
005B E802 LDI R16,0x82
005C D091 RCALL _ShowNum
(0034) ShowNum(0xC2,AdcVal(2)) ;
005D E002 LDI R16,2
005E D005 RCALL _AdcVal
005F 0198 MOVW R18,R16
0060 EC02 LDI R16,0xC2
0061 D08C RCALL _ShowNum
0062 CFF5 RJMP 0x0058
0063 9508 RET
_AdcVal:
k --> R22
i --> R12
tmp --> R10
n --> R20
0064 940E01D0 CALL push_gset4
0066 2F40 MOV R20,R16
(0035) }
(0036) }
(0037)
(0038) int AdcVal(uchar n)
(0039) {//软件滤波
(0040) uchar i,k ;
(0041) uint tmp=0 ;
0067 24AA CLR R10
0068 24BB CLR R11
(0042) for(i=0 ;i<20 ;i++)
0069 24CC CLR R12
006A C009 RJMP 0x0074
(0043) tmp=(tmp+AdcValPro(n))/2 ;
006B 2F04 MOV R16,R20
006C D051 RCALL _AdcValPro
006D 0115 MOVW R2,R10
006E 0E20 ADD R2,R16
006F 1E31 ADC R3,R17
0070 9436 LSR R3
0071 9427 ROR R2
0072 0151 MOVW R10,R2
0073 94C3 INC R12
0074 2D8C MOV R24,R12
0075 3184 CPI R24,0x14
0076 F3A0 BCS 0x006B
(0044) k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp) ;
0077 E082 LDI R24,2
0078 9F84 MUL R24,R20
0079 01F0 MOVW R30,R0
007A E680 LDI R24,0x60
007B E090 LDI R25,0
007C 0FE8 ADD R30,R24
007D 1FF9 ADC R31,R25
007E 8020 LDD R2,Z+0
007F 8031 LDD R3,Z+1
0080 142A CP R2,R10
0081 043B CPC R3,R11
0082 F468 BCC 0x0090
0083 E082 LDI R24,2
0084 9F84 MUL R24,R20
0085 01F0 MOVW R30,R0
0086 E680 LDI R24,0x60
0087 E090 LDI R25,0
0088 0FE8 ADD R30,R24
0089 1FF9 ADC R31,R25
008A 8020 LDD R2,Z+0
008B 8031 LDD R3,Z+1
008C 01B5 MOVW R22,R10
008D 1962 SUB R22,R2
008E 0973 SBC R23,R3
008F C00B RJMP 0x009B
0090 E082 LDI R24,2
0091 9F84 MUL R24,R20
0092 01F0 MOVW R30,R0
0093 E680 LDI R24,0x60
0094 E090 LDI R25,0
0095 0FE8 ADD R30,R24
0096 1FF9 ADC R31,R25
0097 8160 LDD R22,Z+0
0098 8171 LDD R23,Z+1
0099 196A SUB R22,R10
009A 097B SBC R23,R11
(0045) Adc[n]=k>5 ? tmp:Adc[n] ;
009B E085 LDI R24,5
009C 1786 CP R24,R22
009D F410 BCC 0x00A0
009E 01B5 MOVW R22,R10
009F C009 RJMP 0x00A9
00A0 E082 LDI R24,2
00A1 9F84 MUL R24,R20
00A2 01F0 MOVW R30,R0
00A3 E680 LDI R24,0x60
00A4 E090 LDI R25,0
00A5 0FE8 ADD R30,R24
00A6 1FF9 ADC R31,R25
00A7 8160 LDD R22,Z+0
00A8 8171 LDD R23,Z+1
00A9 E082 LDI R24,2
00AA 9F84 MUL R24,R20
00AB 01F0 MOVW R30,R0
00AC E680 LDI R24,0x60
00AD E090 LDI R25,0
00AE 0FE8 ADD R30,R24
00AF 1FF9 ADC R31,R25
00B0 8371 STD Z+1,R23
00B1 8360 STD Z+0,R22
(0046) return Adc[n] ;
00B2 E082 LDI R24,2
00B3 9F84 MUL R24,R20
00B4 01F0 MOVW R30,R0
00B5 E680 LDI R24,0x60
00B6 E090 LDI R25,0
00B7 0FE8 ADD R30,R24
00B8 1FF9 ADC R31,R25
00B9 8100 LDD R16,Z+0
00BA 8111 LDD R17,Z+1
00BB 940E01CB CALL pop_gset4
00BD 9508 RET
_AdcValPro:
dat0 --> R20
dat1 --> R22
val --> R10
n --> R20
00BE 940E01D2 CALL push_gset3
00C0 2F40 MOV R20,R16
(0047) }
(0048)
(0049) int AdcValPro(uchar n)
(0050) {//返回第N个ADC的值从0到7
(0051) uchar dat1,dat0 ;
(0052) int val ;
(0053) DDRA &=~BIT(n) ; //设置对应的ADC口为输入
00C1 E001 LDI R16,1
00C2 2F14 MOV R17,R20
00C3 940E01ED CALL lsl8
00C5 2E20 MOV R2,R16
00C6 9420 COM R2
00C7 B23A IN R3,0x1A
00C8 2032 AND R3,R2
00C9 BA3A OUT 0x1A,R3
(0054) PORTA &=~BIT(n) ;
00CA E001 LDI R16,1
00CB 2F14 MOV R17,R20
00CC 940E01ED CALL lsl8
00CE 2E20 MOV R2,R16
00CF 9420 COM R2
00D0 B23B IN R3,0x1B
00D1 2032 AND R3,R2
00D2 BA3B OUT 0x1B,R3
(0055) ADMUX=0x40+n ; //选择AVCC,选择第N个ADC
00D3 2F84 MOV R24,R20
00D4 5C80 SUBI R24,0xC0
00D5 B987 OUT 0x07,R24
(0056) ADCSRA=0xc0 ; //允许转换ADEN,ADSC
00D6 EC80 LDI R24,0xC0
00D7 B986 OUT 0x06,R24
(0057) while(ADCSRA & BIT(ADSC)) ; //
00D8 9936 SBIC 0x06,6
00D9 CFFE RJMP 0x00D8
(0058) dat1=ADCH ;
00DA B165 IN R22,0x05
(0059) dat0=ADCL ;
00DB B144 IN R20,0x04
(0060) val=ADCH*256+ADCL ;
00DC B125 IN R18,0x05
00DD 2733 CLR R19
00DE E000 LDI R16,0
00DF E011 LDI R17,1
00E0 940E01B5 CALL empy16s
00E2 0158 MOVW R10,R16
00E3 B024 IN R2,0x04
00E4 2433 CLR R3
00E5 0CA2 ADD R10,R2
00E6 1CB3 ADC R11,R3
(0061)
(0062) DDRB=0xff;
00E7 EF8F LDI R24,0xFF
00E8 BB87 OUT 0x17,R24
(0063) PORTB=val; return val ;
00E9 BAA8 OUT 0x18,R10
00EA 0185 MOVW R16,R10
00EB 940E01C8 CALL pop_gset3
00ED 9508 RET
_ShowNum:
i --> R20
num --> R22
addr --> R10
00EE 940E01D2 CALL push_gset3
00F0 01B9 MOVW R22,R18
00F1 2EA0 MOV R10,R16
(0064) }
(0065)
(0066) void ShowNum(uchar addr,uint num) //在addr处显示数字num
(0067) {//将num转化成五个BCD码存放在全局数组BCD[5]中
(0068) uchar i ;
(0069) for(i=5 ;i>0 ;i--) //将NUM数据转化成ASCII码,如521会转化为00521
00F2 E045 LDI R20,5
00F3 C015 RJMP 0x0109
(0070) {
(0071) BCD[i-1]=(uchar)(num%10+0x30) ; //取出最低位
00F4 E02A LDI R18,0xA
00F5 E030 LDI R19,0
00F6 018B MOVW R16,R22
00F7 940E0199 CALL mod16u
00F9 01C8 MOVW R24,R16
00FA 96C0 ADIW R24,0x30
00FB E6E5 LDI R30,0x65
00FC E0F0 LDI R31,0
00FD 2FA4 MOV R26,R20
00FE 27BB CLR R27
00FF 0FAE ADD R26,R30
0100 1FBF ADC R27,R31
0101 938C ST R24,0(X)
(0072) num/=10 ; //去掉最低位
0102 E02A LDI R18,0xA
0103 E030 LDI R19,0
0104 018B MOVW R16,R22
0105 940E019B CALL div16u
0107 01B8 MOVW R22,R16
0108 954A DEC R20
0109 2422 CLR R2
010A 1624 CP R2,R20
010B F340 BCS 0x00F4
(0073) }
(0074) i=0 ;
010C 2744 CLR R20
(0075) // while(BCD ==0x30 && i<4) BCD[i++]=' ' ; //NUM转换成数组存放,但还没有加上小数点
(0076) BCD[5]='\0' ;
010D 9220006B STS 0x6B,R2
(0077) DisText(addr,BCD+1) ;
010F E627 LDI R18,0x67
0110 E030 LDI R19,0
0111 2D0A MOV R16,R10
0112 D003 RCALL _DisText
0113 940E01C8 CALL pop_gset3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -