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

📄 m16.lst

📁 ewts avr驱动程序 角速度传感器 104为秒
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -