⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chengxu.lst

📁 015、AD转换的c语言编程
💻 LST
字号:
__text_start:
__start:
    0031 E5CF      LDI	R28,0x5F
    0032 E0D4      LDI	R29,4
    0033 BFCD      OUT	0x3D,R28
    0034 BFDE      OUT	0x3E,R29
    0035 51C0      SUBI	R28,0x10
    0036 40D0      SBCI	R29,0
    0037 EA0A      LDI	R16,0xAA
    0038 8308      STD	Y+0,R16
    0039 2400      CLR	R0
    003A E6EE      LDI	R30,0x6E
    003B E0F0      LDI	R31,0
    003C E010      LDI	R17,0
    003D 36EE      CPI	R30,0x6E
    003E 07F1      CPC	R31,R17
    003F F011      BEQ	0x0042
    0040 9201      ST	R0,Z+
    0041 CFFB      RJMP	0x003D
    0042 8300      STD	Z+0,R16
    0043 E5E4      LDI	R30,0x54
    0044 E0F0      LDI	R31,0
    0045 E6A0      LDI	R26,0x60
    0046 E0B0      LDI	R27,0
    0047 E010      LDI	R17,0
    0048 36E2      CPI	R30,0x62
    0049 07F1      CPC	R31,R17
    004A F021      BEQ	0x004F
    004B 95C8      LPM
    004C 9631      ADIW	R30,1
    004D 920D      ST	R0,X+
    004E CFF9      RJMP	0x0048
    004F 940E00D4  CALL	_main
_exit:
    0051 CFFF      RJMP	_exit
_DelayMs:
  j                    --> R20
  i                    --> R16
    0052 940E0119  CALL	push_gset1
FILE: E:\Proteus\AVR单片机应用系统开发经典实例\015、AD转换的c语言编程\icc\chengxu.c
(0001) #include <iom16v.h>
(0002) #include <macros.h> 
(0003) #define uchar unsigned char
(0004) #define uint  unsigned int
(0005) /**********************************************************************
(0006) 								定义数组								   	
(0007) **********************************************************************/
(0008) uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0009) uchar Data[4]={0,0,0,0};
(0010) /**********************************************************************
(0011) 								延时函数								   	
(0012) **********************************************************************/
(0013) void DelayMs(uint i)  //0.25ms
(0014) {uchar j;
(0015)  for(;i!=0;i--)
    0054 C007      RJMP	0x005C
(0016)   {for(j=250;j!=0;j--) {;}}
    0055 EF4A      LDI	R20,0xFA
    0056 C001      RJMP	0x0058
    0057 954A      DEC	R20
    0058 2344      TST	R20
    0059 F7E9      BNE	0x0057
    005A 5001      SUBI	R16,1
    005B 4010      SBCI	R17,0
    005C 3000      CPI	R16,0
    005D 0701      CPC	R16,R17
    005E F7B1      BNE	0x0055
    005F 940E011C  CALL	pop_gset1
    0061 9508      RET
_Display:
  sel                  --> R20
  i                    --> R22
  p                    --> R10
    0062 940E0134  CALL	push_gset3
    0064 0158      MOVW	R10,R16
(0017) }
(0018) /**********************************************************************
(0019) 				            显示函数		
(0020) 注意:使用开发板时sel=0xef;
(0021) **********************************************************************/
(0022) void Display(uchar *p)         //动态显示函数,参数p为待显示的数组名
(0023) {uchar i,sel=0x01;           
    0065 E041      LDI	R20,1
(0024)  for(i=0;i<4;i++)
    0066 2766      CLR	R22
    0067 C018      RJMP	0x0080
(0025)   {PORTD=sel;                  //选通最右边的数码管
    0068 BB42      OUT	0x12,R20
(0026)    PORTB=~Table[p[i]];         //送字型码
    0069 2FE6      MOV	R30,R22
    006A 27FF      CLR	R31
    006B 0DEA      ADD	R30,R10
    006C 1DFB      ADC	R31,R11
    006D 81E0      LDD	R30,Z+0
    006E 27FF      CLR	R31
    006F E680      LDI	R24,0x60
    0070 E090      LDI	R25,0
    0071 0FE8      ADD	R30,R24
    0072 1FF9      ADC	R31,R25
    0073 8020      LDD	R2,Z+0
    0074 9420      COM	R2
    0075 BA28      OUT	0x18,R2
(0027)    if(i==0){PORTB=PORTB&0X7f;} //增加小数点
    0076 2366      TST	R22
    0077 F419      BNE	0x007B
    0078 B388      IN	R24,0x18
    0079 778F      ANDI	R24,0x7F
    007A BB88      OUT	0x18,R24
(0028)    DelayMs(1);                 //显示延时    
    007B E001      LDI	R16,1
    007C E010      LDI	R17,0
    007D DFD4      RCALL	_DelayMs
(0029)    sel=sel<<1;                 //移位以显示前一位
    007E 0F44      LSL	R20
    007F 9563      INC	R22
    0080 3064      CPI	R22,4
    0081 F330      BCS	0x0068
    0082 940E0116  CALL	pop_gset3
    0084 9508      RET
_ADC_Convert:
  temp1                --> R22
  temp2                --> R20
    0085 940E0130  CALL	push_gset2
(0030)   }
(0031) }
(0032) /**********************************************************************
(0033) 								电压值处理函数								   	
(0034) **********************************************************************/
(0035) uint ADC_Convert(void)
(0036) {uint temp1,temp2;
(0037)  temp1=(uint)ADCL;//先读ADCL
    0087 B164      IN	R22,0x04
    0088 2777      CLR	R23
(0038)  temp2=(uint)ADCH;//再读ADCH
    0089 B145      IN	R20,0x05
    008A 2755      CLR	R21
(0039)  temp2=(temp2<<8)+temp1;//求值
    008B 011A      MOVW	R2,R20
    008C 2C32      MOV	R3,R2
    008D 2422      CLR	R2
    008E 0E26      ADD	R2,R22
    008F 1E37      ADC	R3,R23
(0040)  temp2=temp2*49/10;//求显示的电压值(0~5.12)V
    0090 E301      LDI	R16,0x31
    0091 E010      LDI	R17,0
    0092 0191      MOVW	R18,R2
    0093 940E0103  CALL	empy16s
    0095 E02A      LDI	R18,0xA
    0096 E030      LDI	R19,0
    0097 940E00E9  CALL	div16u
    0099 01A8      MOVW	R20,R16
(0041)  return(temp2);
    009A 940E0113  CALL	pop_gset2
    009C 9508      RET
_Process:
  p                    --> R20
  i                    --> R22
    009D 940E0130  CALL	push_gset2
    009F 01A9      MOVW	R20,R18
    00A0 01B8      MOVW	R22,R16
(0042) }
(0043) /**********************************************************************
(0044) 								显示处理函数										   	
(0045) **********************************************************************/
(0046) void Process(uint i,uchar *p)
(0047) {p[0]=i/1000;
    00A1 EE28      LDI	R18,0xE8
    00A2 E033      LDI	R19,3
    00A3 018B      MOVW	R16,R22
    00A4 940E00E9  CALL	div16u
    00A6 01FA      MOVW	R30,R20
    00A7 8300      STD	Z+0,R16
(0048)  i=i%1000;
    00A8 EE28      LDI	R18,0xE8
    00A9 E033      LDI	R19,3
    00AA 018B      MOVW	R16,R22
    00AB 940E00E7  CALL	mod16u
    00AD 01B8      MOVW	R22,R16
(0049)  p[1]=i/100;
    00AE E624      LDI	R18,0x64
    00AF E030      LDI	R19,0
    00B0 940E00E9  CALL	div16u
    00B2 01FA      MOVW	R30,R20
    00B3 8301      STD	Z+1,R16
(0050)  i=i%100;
    00B4 E624      LDI	R18,0x64
    00B5 E030      LDI	R19,0
    00B6 018B      MOVW	R16,R22
    00B7 940E00E7  CALL	mod16u
    00B9 01B8      MOVW	R22,R16
(0051)  p[2]=i/10;
    00BA E02A      LDI	R18,0xA
    00BB E030      LDI	R19,0
    00BC 940E00E9  CALL	div16u
    00BE 01FA      MOVW	R30,R20
    00BF 8302      STD	Z+2,R16
(0052)  i=i%10;
    00C0 E02A      LDI	R18,0xA
    00C1 E030      LDI	R19,0
    00C2 018B      MOVW	R16,R22
    00C3 940E00E7  CALL	mod16u
    00C5 01B8      MOVW	R22,R16
(0053)  p[3]=i;
    00C6 01FA      MOVW	R30,R20
    00C7 8363      STD	Z+3,R22
    00C8 940E0113  CALL	pop_gset2
    00CA 9508      RET
(0054) }
(0055) /**********************************************************************
(0056)                       初始化I/O口
(0057) **********************************************************************/
(0058) void Init_IO(void)             //初始化I/O口
(0059) {
(0060)  DDRA=0x00;                    //设置A口为不带上拉输入;
_Init_IO:
    00CB 2422      CLR	R2
    00CC BA2A      OUT	0x1A,R2
(0061)  PORTA=0x00;
    00CD BA2B      OUT	0x1B,R2
(0062)  DDRB=0xff;                    //设置B口为推挽1输出;
    00CE EF8F      LDI	R24,0xFF
    00CF BB87      OUT	0x17,R24
(0063)  PORTB=0xff;
    00D0 BB88      OUT	0x18,R24
(0064)  DDRD=0xff;                    //设置C口为推挽1输出;
    00D1 BB81      OUT	0x11,R24
(0065)  PORTD=0xff;
    00D2 BB82      OUT	0x12,R24
    00D3 9508      RET
(0066) }
(0067) /**********************************************************************
(0068) 								主函数								   	
(0069) **********************************************************************/
(0070) void main(void)
(0071) {uint i;
(0072)  Init_IO();
_main:
  i                    --> R20
    00D4 DFF6      RCALL	_Init_IO
(0073)  ADMUX=0x00;                   //选择第一通道;
    00D5 2422      CLR	R2
    00D6 B827      OUT	0x07,R2
(0074)  /**********************转换速率应在50~200K****************************/
(0075)  ADCSR=0xe6;                   //125K转换速率,自由转换模式;启动AD转换器;
    00D7 EE86      LDI	R24,0xE6
    00D8 B986      OUT	0x06,R24
(0076)  DelayMs(300);                //延时待系统稳定;
    00D9 E20C      LDI	R16,0x2C
    00DA E011      LDI	R17,1
    00DB DF76      RCALL	_DelayMs
    00DC C008      RJMP	0x00E5
(0077)  while(1)
(0078)  {
(0079)   i=ADC_Convert();             //显示电压值(0~1024)
    00DD DFA7      RCALL	_ADC_Convert
    00DE 01A8      MOVW	R20,R16
(0080)   Process(i,Data);
    00DF E62A      LDI	R18,0x6A
    00E0 E030      LDI	R19,0
    00E1 DFBB      RCALL	_Process
(0081)   Display(Data);
FILE: <library>
    00E2 E60A      LDI	R16,0x6A
    00E3 E010      LDI	R17,0
    00E4 DF7D      RCALL	_Display
    00E5 CFF7      RJMP	0x00DD
    00E6 9508      RET
mod16u:
    00E7 9468      BSET	6
    00E8 C001      RJMP	xdiv16u
div16u:
    00E9 94E8      BCLR	6
xdiv16u:
    00EA 92EA      ST	R14,-Y
    00EB 92FA      ST	R15,-Y
    00EC 938A      ST	R24,-Y
    00ED 24EE      CLR	R14
    00EE 24FF      CLR	R15
    00EF E180      LDI	R24,0x10
    00F0 0F00      LSL	R16
    00F1 1F11      ROL	R17
    00F2 1CEE      ROL	R14
    00F3 1CFF      ROL	R15
    00F4 16E2      CP	R14,R18
    00F5 06F3      CPC	R15,R19
    00F6 F018      BCS	0x00FA
    00F7 1AE2      SUB	R14,R18
    00F8 0AF3      SBC	R15,R19
    00F9 9503      INC	R16
    00FA 958A      DEC	R24
    00FB F7A1      BNE	0x00F0
    00FC F416      BRTC	0x00FF
    00FD 2D0E      MOV	R16,R14
    00FE 2D1F      MOV	R17,R15
    00FF 9189      LD	R24,Y+
    0100 90F9      LD	R15,Y+
    0101 90E9      LD	R14,Y+
    0102 9508      RET
empy16s:
    0103 920A      ST	R0,-Y
    0104 921A      ST	R1,-Y
    0105 938A      ST	R24,-Y
    0106 939A      ST	R25,-Y
    0107 9F02      MUL	R16,R18
    0108 01C0      MOVW	R24,R0
    0109 9F12      MUL	R17,R18
    010A 0D90      ADD	R25,R0
    010B 9F03      MUL	R16,R19
    010C 0D90      ADD	R25,R0
    010D 018C      MOVW	R16,R24
    010E 9199      LD	R25,Y+
    010F 9189      LD	R24,Y+
    0110 9019      LD	R1,Y+
    0111 9009      LD	R0,Y+
    0112 9508      RET
pop_gset2:
    0113 E0E2      LDI	R30,2
    0114 940C011D  JMP	pop
pop_gset3:
    0116 E0E4      LDI	R30,4
    0117 940C011D  JMP	pop
push_gset1:
    0119 935A      ST	R21,-Y
    011A 934A      ST	R20,-Y
    011B 9508      RET
pop_gset1:
    011C E0E1      LDI	R30,1
pop:
    011D 9149      LD	R20,Y+
    011E 9159      LD	R21,Y+
    011F FDE0      SBRC	R30,0
    0120 9508      RET
    0121 9169      LD	R22,Y+
    0122 9179      LD	R23,Y+
    0123 FDE1      SBRC	R30,1
    0124 9508      RET
    0125 90A9      LD	R10,Y+
    0126 90B9      LD	R11,Y+
    0127 FDE2      SBRC	R30,2
    0128 9508      RET
    0129 90C9      LD	R12,Y+
    012A 90D9      LD	R13,Y+
    012B FDE3      SBRC	R30,3
    012C 9508      RET
    012D 90E9      LD	R14,Y+
    012E 90F9      LD	R15,Y+
    012F 9508      RET
push_gset2:
    0130 937A      ST	R23,-Y
    0131 936A      ST	R22,-Y
    0132 940C0119  JMP	push_gset1
push_gset3:
    0134 92BA      ST	R11,-Y
    0135 92AA      ST	R10,-Y
    0136 940C0130  JMP	push_gset2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -