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

📄 max5478.lis

📁 Max5479 数字电位器的驱动源程序 用M16来实现C语言的编程!
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 00CC 0E940000          xcall push_xgset00FC
 00D0 C22E              mov R12,R18
 00D2 E02E              mov R14,R16
 00D4                   .dbline -1
 00D4                   .dbline 60
 00D4           ; }
 00D4           ; 
 00D4           ; /*******************************************
 00D4           ; 函数名称: MAX5478_writeB
 00D4           ; 功    能: 向MAX5478写入电阻值数据
 00D4           ; 参    数: devadd--器件地址
 00D4           ;                 cmd--控制命令
 00D4           ;                 rdata--电阻数据
 00D4           ; 返回值  : success--数据成功标志(为TRUE时写入成功,为FALSE时失败)
 00D4           ; /********************************************/
 00D4           ; uchar MAX5478_writeB(uchar devadd,uchar cmd,uchar rdata)
 00D4           ; {
 00D4                   .dbline 61
 00D4           ;  uchar success=FALSE;   //默认返回是写入失败
 00D4 AA24              clr R10
 00D6                   .dbline 62
 00D6           ;  Start();                               //产生START信号
 00D6 84EA              ldi R24,164
 00D8 86BF              out 0x36,R24
 00DA           L28:
 00DA                   .dbline 63
 00DA           ;  Wait();                                //等待START信号发送完毕
 00DA           L29:
 00DA                   .dbline 63
 00DA 26B6              in R2,0x36
 00DC 27FE              sbrs R2,7
 00DE FDCF              rjmp L28
 00E0           X9:
 00E0                   .dbline 64
 00E0           ;  if(TestACK()!=START)   //检查是否是START信号发送完毕状态
 00E0 81B1              in R24,0x1
 00E2 887F              andi R24,248
 00E4 8830              cpi R24,8
 00E6 19F0              breq L31
 00E8           X10:
 00E8                   .dbline 65
 00E8           ;  {
 00E8                   .dbline 66
 00E8           ;   success=FALSE;                //如果不是,则返回写入失败
 00E8 AA24              clr R10
 00EA                   .dbline 67
 00EA           ;   return success;
 00EA 0A2D              mov R16,R10
 00EC 30C0              xjmp L27
 00EE           L31:
 00EE                   .dbline 69
 00EE           ;  }
 00EE           ;  Writebyte(devadd);             //发送从器件地址
 00EE                   .dbline 69
 00EE E3B8              out 0x3,R14
 00F0                   .dbline 69
 00F0 84E8              ldi R24,132
 00F2 86BF              out 0x36,R24
 00F4                   .dbline 69
 00F4                   .dbline 69
 00F4           L33:
 00F4                   .dbline 70
 00F4           ;  Wait();                                //等待发送完毕
 00F4           L34:
 00F4                   .dbline 70
 00F4 26B6              in R2,0x36
 00F6 27FE              sbrs R2,7
 00F8 FDCF              rjmp L33
 00FA           X11:
 00FA                   .dbline 71
 00FA           ;  if(TestACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
 00FA 81B1              in R24,0x1
 00FC 887F              andi R24,248
 00FE 8831              cpi R24,24
 0100 19F0              breq L36
 0102           X12:
 0102                   .dbline 72
 0102           ;  {
 0102                   .dbline 73
 0102           ;   success=FALSE;                //如果不是,则返回写入失败
 0102 AA24              clr R10
 0104                   .dbline 74
 0104           ;   return success;
 0104 0A2D              mov R16,R10
 0106 23C0              xjmp L27
 0108           L36:
 0108                   .dbline 76
 0108           ;  }
 0108           ;  Writebyte(cmd);                //发送MAX5478的命令字节(具体含义请参看MAX5478的数据手册)
 0108                   .dbline 76
 0108 C3B8              out 0x3,R12
 010A                   .dbline 76
 010A 84E8              ldi R24,132
 010C 86BF              out 0x36,R24
 010E                   .dbline 76
 010E                   .dbline 76
 010E           L38:
 010E                   .dbline 77
 010E           ;  Wait();                                //等待发送完毕
 010E           L39:
 010E                   .dbline 77
 010E 26B6              in R2,0x36
 0110 27FE              sbrs R2,7
 0112 FDCF              rjmp L38
 0114           X13:
 0114                   .dbline 78
 0114           ;  if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
 0114 81B1              in R24,0x1
 0116 887F              andi R24,248
 0118 8832              cpi R24,40
 011A 19F0              breq L41
 011C           X14:
 011C                   .dbline 79
 011C           ;  {
 011C                   .dbline 80
 011C           ;   success=FALSE;                //如果不是,则返回写入失败
 011C AA24              clr R10
 011E                   .dbline 81
 011E           ;   return success;
 011E 0A2D              mov R16,R10
 0120 16C0              xjmp L27
 0122           L41:
 0122                   .dbline 83
 0122           ;  }
 0122           ;  Writebyte(rdata);              //发送电阻值数据
 0122                   .dbline 83
 0122 0E80              ldd R0,y+6
 0124 03B8              out 0x3,R0
 0126                   .dbline 83
 0126 84E8              ldi R24,132
 0128 86BF              out 0x36,R24
 012A                   .dbline 83
 012A                   .dbline 83
 012A           L43:
 012A                   .dbline 84
 012A           ;  Wait();                                //等待发送完毕
 012A           L44:
 012A                   .dbline 84
 012A 26B6              in R2,0x36
 012C 27FE              sbrs R2,7
 012E FDCF              rjmp L43
 0130           X15:
 0130                   .dbline 85
 0130           ;  if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
 0130 81B1              in R24,0x1
 0132 887F              andi R24,248
 0134 8832              cpi R24,40
 0136 19F0              breq L46
 0138           X16:
 0138                   .dbline 86
 0138           ;  {
 0138                   .dbline 87
 0138           ;   success=FALSE;                //如果不是,则返回写入失败
 0138 AA24              clr R10
 013A                   .dbline 88
 013A           ;   return success;
 013A 0A2D              mov R16,R10
 013C 08C0              xjmp L27
 013E           L46:
 013E                   .dbline 90
 013E           ;  }
 013E           ;  Stop();                                //对MAX5478的一次操作完毕,发送STOP信号
 013E 84E9              ldi R24,148
 0140 86BF              out 0x36,R24
 0142                   .dbline 91
 0142           ;  Delayms(10);                   //等待发送完毕
 0142 0AE0              ldi R16,10
 0144 10E0              ldi R17,0
 0146 5CDF              xcall _Delayms
 0148                   .dbline 92
 0148           ;  success=TRUE;                          //本次写入成功
 0148 AA24              clr R10
 014A A394              inc R10
 014C                   .dbline 93
 014C           ;  return success;                //返回写入成功状态
 014C 0A2D              mov R16,R10
 014E                   .dbline -2
 014E           L27:
 014E                   .dbline 0 ; func end
 014E 0C940000          xjmp pop_xgset00FC
 0152                   .dbsym r success 10 c
 0152                   .dbsym l rdata 6 c
 0152                   .dbsym r cmd 12 c
 0152                   .dbsym r devadd 14 c
 0152                   .dbend
 0152                   .dbfunc e main _main fV
 0152           ;           data -> R10
 0152           ;              i -> R12
                        .even
 0152           _main::
 0152 2197              sbiw R28,1
 0154                   .dbline -1
 0154                   .dbline 102
 0154           ; }
 0154           ; /*******************************************
 0154           ; 函数名称: main
 0154           ; 功    能: 按键更新数字电位器的阻值(电阻是A和W端的阻值,默认B端是开路的)
 0154           ; 参    数: 无
 0154           ; 返回值  : 无
 0154           ; /********************************************/
 0154           ; void main(void)
 0154           ; {
 0154                   .dbline 103
 0154           ;  uchar i,data=255;  //初始电阻是满量程
 0154 8FEF              ldi R24,255
 0156 A82E              mov R10,R24
 0158                   .dbline 105
 0158           ;  
 0158           ;  Twi_init( );   //初始化TWI 
 0158 B2DF              xcall _Twi_init
 015A                   .dbline 106
 015A           ;  MAX5478_writeB(0x50,0x13,data);      //设置初始电阻
 015A A882              std y+0,R10
 015C 23E1              ldi R18,19
 015E 00E5              ldi R16,80
 0160 B5DF              xcall _MAX5478_writeB
 0162 2BC0              xjmp L50
 0164           L49:
 0164                   .dbline 108
 0164           ;  while(1)
 0164           ;  {
 0164                   .dbline 109
 0164           ;   if(Skey_press())                    //是否有按键按下
 0164 65DF              xcall _Skey_press
 0166 0023              tst R16
 0168 41F1              breq L52
 016A           X17:
 016A                   .dbline 110
 016A           ;   {
 016A                   .dbline 111
 016A           ;    i=Skey_scan();                     //扫描并反回翻译后的键码
 016A 73DF              xcall _Skey_scan
 016C C02E              mov R12,R16
 016E                   .dbline 112
 016E           ;    switch(i)
 016E DD24              clr R13
 0170 CC20              tst R12
 0172 11F4              brne X18
 0174 DD20              tst R13
 0176 71F0              breq L57
 0178           X18:
 0178 C601              movw R24,R12
 017A 8130              cpi R24,1
 017C E0E0              ldi R30,0
 017E 9E07              cpc R25,R30
 0180 69F0              breq L58
 0182           X19:
 0182 8230              cpi R24,2
 0184 E0E0              ldi R30,0
 0186 9E07              cpc R25,R30
 0188 69F0              breq L59
 018A           X20:
 018A 8330              cpi R24,3
 018C E0E0              ldi R30,0
 018E 9E07              cpc R25,R30
 0190 59F0              breq L60
 0192           X21:
 0192 0CC0              xjmp L54
 0194           L57:
 0194                   .dbline 115
 0194           ;    {
 0194           ;       case 0:                                 //S1键按下,减少电阻的数字量(MAX5478的特性是减少电阻的数字量,阻值增加)
 0194           ;                data-=5;
 0194 8A2D              mov R24,R10
 0196 8550              subi R24,5
 0198 A82E              mov R10,R24
 019A                   .dbline 116
 019A           ;                break;
 019A 08C0              xjmp L55
 019C           L58:
 019C                   .dbline 118
 019C           ;       case 1:                                 //S2键按下,增加电阻的数字量
 019C           ;                data+=5;
 019C 8A2D              mov R24,R10
 019E 8B5F              subi R24,251    ; addi 5
 01A0 A82E              mov R10,R24
 01A2                   .dbline 119
 01A2           ;                break;
 01A2 04C0              xjmp L55
 01A4           L59:
 01A4                   .dbline 121
 01A4           ;       case 2:                                 //S3键按下,使电阻的数字量为零(阻值满量程)
 01A4           ;                data=0;
 01A4 AA24              clr R10
 01A6                   .dbline 122
 01A6           ;                break;
 01A6 02C0              xjmp L55
 01A8           L60:
 01A8                   .dbline 124
 01A8           ;       case 3:                                 //S3键按下,使电阻的数字量为满(阻值清零,只剩下接触电阻)
 01A8           ;                data=255;
 01A8 8FEF              ldi R24,255
 01AA A82E              mov R10,R24
 01AC                   .dbline 125
 01AC           ;                break;
 01AC           L54:
 01AC           L55:
 01AC                   .dbline 127
 01AC           ;    }
 01AC           ;    MAX5478_writeB(0x50,0x13,data);  //更新电阻
 01AC A882              std y+0,R10
 01AE 23E1              ldi R18,19
 01B0 00E5              ldi R16,80
 01B2 8CDF              xcall _MAX5478_writeB
 01B4                   .dbline 128
 01B4           ;    Delayms(5);        
 01B4 05E0              ldi R16,5
 01B6 10E0              ldi R17,0
 01B8 23DF              xcall _Delayms
 01BA                   .dbline 129
 01BA           ;   }
 01BA           L52:
 01BA                   .dbline 130
 01BA           ;  }
 01BA           L50:
 01BA                   .dbline 107
 01BA D4CF              xjmp L49
 01BC           X22:
 01BC                   .dbline -2
 01BC           L48:
 01BC                   .dbline 0 ; func end
 01BC 2196              adiw R28,1
 01BE 0895              ret
 01C0                   .dbsym r data 10 c
 01C0                   .dbsym r i 12 c
 01C0                   .dbend
 01C0           ; }     

⌨️ 快捷键说明

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