📄 max5478.lis
字号:
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 + -