📄 ad5161.lst
字号:
(0055) case 0x0B:
(0056) keycode=2;
00DA E042 LDI R20,2
(0057) break;
00DB C003 RJMP 0x00DF
(0058) case 0x07:
(0059) keycode=3;
00DC E043 LDI R20,3
(0060) break;
00DD C001 RJMP 0x00DF
(0061) default:
(0062) keycode=0x00;
00DE 2744 CLR R20
(0063) }
(0064) do
(0065) {
(0066) }while(Skey_press()==TRUE); //等待按键释放(为了防止按一次,执行多次的现象)
00DF DFC5 RCALL _Skey_press
00E0 3001 CPI R16,1
00E1 F3E9 BEQ 0x00DF
(0067) }
(0068) return keycode;
00E2 2F04 MOV R16,R20
00E3 940E018D CALL pop_gset2
00E5 9508 RET
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\12_TWI(IIC)\AD5161.c
(0001) /*******************************************
(0002) 文件:AD5161.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的数字电位器(AD5161采用IIC接口)
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012) #include <AVR_PQ1A.h> //包含自定义常量头文件
(0013) #include "Skey.C" //包含数码管显示函数
(0014)
(0015) /*******************************************
(0016) 函数名称: Twi_init
(0017) 功 能: 初始化TWI
(0018) 参 数: MS--延时的毫秒数
(0019) 返回值 : 无
(0020) /********************************************/
(0021) void Twi_init(void)
(0022) {
(0023) TWBR= 0x20; //设置波特率
_Twi_init:
00E6 E280 LDI R24,0x20
00E7 B980 OUT P00,R24
(0024) TWSR= 0x00; //设置预分频比
00E8 2422 CLR R2
00E9 B821 OUT P01,R2
(0025) TWCR= 0x44; //使能应答,使能TWI
00EA E484 LDI R24,0x44
00EB BF86 OUT P36,R24
(0026) }
00EC 9508 RET
_AD5161_writeB:
success --> R20
rdata --> Y+6
cmd --> R22
devadd --> R10
00ED 940E0189 CALL push_gset3
00EF 2F62 MOV R22,R18
00F0 2EA0 MOV R10,R16
(0027) /*******************************************
(0028) 函数名称: AD5161_writeB
(0029) 功 能: 向AD5161写入电阻值数据
(0030) 参 数: devadd--器件地址
(0031) cmd--控制命令
(0032) rdata--电阻数据
(0033) 返回值 : success--数据成功标志(为TRUE时写入成功,为FALSE时失败)
(0034) /********************************************/
(0035) uchar AD5161_writeB(uchar devadd,uchar cmd,uchar rdata)
(0036) {
(0037) uchar success=FALSE; //默认返回是写入失败
00F1 2744 CLR R20
(0038) Start(); //产生START信号
00F2 EA84 LDI R24,0xA4
00F3 BF86 OUT P36,R24
(0039) Wait(); //等待START信号发送完毕
00F4 B626 IN R2,P36
00F5 FE27 SBRS R2,7
00F6 CFFD RJMP 0x00F4
(0040) if(TestACK()!=START) //检查是否是START信号发送完毕状态
00F7 B181 IN R24,P01
00F8 7F88 ANDI R24,0xF8
00F9 3088 CPI R24,0x8
00FA F019 BEQ 0x00FE
(0041) {
(0042) success=FALSE; //如果不是,则返回写入失败
00FB 2744 CLR R20
(0043) return success;
00FC 2F04 MOV R16,R20
00FD C02F RJMP 0x012D
(0044) }
(0045) Writebyte(devadd); //发送从器件地址
00FE B8A3 OUT P03,R10
00FF E884 LDI R24,0x84
0100 BF86 OUT P36,R24
(0046) Wait(); //等待发送完毕
0101 B626 IN R2,P36
0102 FE27 SBRS R2,7
0103 CFFD RJMP 0x0101
(0047) if(TestACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
0104 B181 IN R24,P01
0105 7F88 ANDI R24,0xF8
0106 3188 CPI R24,0x18
0107 F019 BEQ 0x010B
(0048) {
(0049) success=FALSE; //如果不是,则返回写入失败
0108 2744 CLR R20
(0050) return success;
0109 2F04 MOV R16,R20
010A C022 RJMP 0x012D
(0051) }
(0052) Writebyte(cmd); //发送AD5161的命令字节(具体含义请参看AD5161的数据手册)
010B B963 OUT P03,R22
010C E884 LDI R24,0x84
010D BF86 OUT P36,R24
(0053) Wait(); //等待发送完毕
010E B626 IN R2,P36
010F FE27 SBRS R2,7
0110 CFFD RJMP 0x010E
(0054) if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
0111 B181 IN R24,P01
0112 7F88 ANDI R24,0xF8
0113 3288 CPI R24,0x28
0114 F019 BEQ 0x0118
(0055) {
(0056) success=FALSE; //如果不是,则返回写入失败
0115 2744 CLR R20
(0057) return success;
0116 2F04 MOV R16,R20
0117 C015 RJMP 0x012D
(0058) }
(0059) Writebyte(rdata); //发送电阻值数据
0118 800E LDD R0,6+Y
0119 B803 OUT P03,R0
011A E884 LDI R24,0x84
011B BF86 OUT P36,R24
(0060) Wait(); //等待发送完毕
011C B626 IN R2,P36
011D FE27 SBRS R2,7
011E CFFD RJMP 0x011C
(0061) if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
011F B181 IN R24,P01
0120 7F88 ANDI R24,0xF8
0121 3288 CPI R24,0x28
0122 F019 BEQ 0x0126
(0062) {
(0063) success=FALSE; //如果不是,则返回写入失败
0123 2744 CLR R20
(0064) return success;
0124 2F04 MOV R16,R20
0125 C007 RJMP 0x012D
(0065) }
(0066) Stop(); //对AD5161的一次操作完毕,发送STOP信号
0126 E984 LDI R24,0x94
0127 BF86 OUT P36,R24
(0067) Delayms(10); //等待发送完毕
0128 E00A LDI R16,0xA
0129 E010 LDI R17,0
012A DF3E RCALL _Delayms
(0068) success=TRUE; //本次写入成功
012B E041 LDI R20,1
(0069) return success; //返回写入成功状态
012C 2F04 MOV R16,R20
012D 940E0190 CALL pop_gset3
012F 9508 RET
_main:
data --> R20
i --> R10
0130 9721 SBIW R28,1
(0070) }
(0071) /*******************************************
(0072) 函数名称: main
(0073) 功 能: 按键更新数字电位器的阻值(电阻是A和W端的阻值,默认B端是开路的)
(0074) 参 数: 无
(0075) 返回值 : 无
(0076) /********************************************/
(0077) void main(void)
(0078) {
(0079) uchar i,data=0; //初始电阻是满量程
0131 2744 CLR R20
(0080) Board_init( ); //初始化开发板
0132 DF4C RCALL _Board_init
(0081) Twi_init( ); //初始化TWI
0133 DFB2 RCALL _Twi_init
(0082) AD5161_writeB(0x58,0x00,data); //设置初始电阻
0134 8348 STD R20,0+Y
0135 2722 CLR R18
0136 E508 LDI R16,0x58
0137 DFB5 RCALL _AD5161_writeB
0138 C022 RJMP 0x015B
(0083) while(1)
(0084) {
(0085) if(Skey_press()) //是否有按键按下
0139 DF6B RCALL _Skey_press
013A 2300 TST R16
013B F0F9 BEQ 0x015B
(0086) {
(0087) i=Skey_scan(); //扫描并反回翻译后的键码
013C DF79 RCALL _Skey_scan
013D 2EA0 MOV R10,R16
(0088) switch(i)
013E 2D6A MOV R22,R10
013F 2777 CLR R23
0140 3060 CPI R22,0
0141 0767 CPC R22,R23
0142 F069 BEQ 0x0150
0143 3061 CPI R22,1
0144 E0E0 LDI R30,0
0145 077E CPC R23,R30
0146 F059 BEQ 0x0152
0147 3062 CPI R22,2
0148 E0E0 LDI R30,0
0149 077E CPC R23,R30
014A F049 BEQ 0x0154
014B 3063 CPI R22,3
014C E0E0 LDI R30,0
014D 077E CPC R23,R30
014E F039 BEQ 0x0156
014F C007 RJMP 0x0157
(0089) {
(0090) case 0: //S1键按下,减少电阻的数字量(AD5161的特性是减少电阻的数字量,阻值增加)
(0091) data-=16;
0150 5140 SUBI R20,0x10
(0092) break;
0151 C005 RJMP 0x0157
(0093) case 1: //S2键按下,增加电阻的数字量
(0094) data+=16;
0152 5F40 SUBI R20,0xF0
(0095) break;
0153 C003 RJMP 0x0157
(0096) case 2: //S3键按下,使电阻的数字量为零(阻值满量程)
(0097) data=0;
0154 2744 CLR R20
(0098) break;
0155 C001 RJMP 0x0157
(0099) case 3: //S3键按下,使电阻的数字量为满(阻值清零,只剩下接触电阻)
(0100) data=255;
0156 EF4F LDI R20,0xFF
(0101) break;
(0102) }
(0103) AD5161_writeB(0x58,0x00,data); //更新电阻
0157 8348 STD R20,0+Y
0158 2722 CLR R18
0159 E508 LDI R16,0x58
015A DF92 RCALL _AD5161_writeB
015B CFDD RJMP 0x0139
(0104) }
(0105) }
(0106) } FILE: <library>
015C 9621 ADIW R28,1
015D 9508 RET
empy16s:
015E 920A ST R0,-Y
015F 921A ST R1,-Y
0160 938A ST R24,-Y
0161 939A ST R25,-Y
0162 9F02 MUL R16,R18
0163 01C0 MOVW R24,R0
0164 9F12 MUL R17,R18
0165 0D90 ADD R25,R0
0166 9F03 MUL R16,R19
0167 0D90 ADD R25,R0
0168 018C MOVW R16,R24
0169 9199 LD R25,Y+
016A 9189 LD R24,Y+
016B 9019 LD R1,Y+
016C 9009 LD R0,Y+
016D 9508 RET
push_gset1:
016E 935A ST R21,-Y
016F 934A ST R20,-Y
0170 9508 RET
pop_gset1:
0171 E0E1 LDI R30,1
pop:
0172 9149 LD R20,Y+
0173 9159 LD R21,Y+
0174 FDE0 SBRC R30,0
0175 9508 RET
0176 9169 LD R22,Y+
0177 9179 LD R23,Y+
0178 FDE1 SBRC R30,1
0179 9508 RET
017A 90A9 LD R10,Y+
017B 90B9 LD R11,Y+
017C FDE2 SBRC R30,2
017D 9508 RET
017E 90C9 LD R12,Y+
017F 90D9 LD R13,Y+
0180 FDE3 SBRC R30,3
0181 9508 RET
0182 90E9 LD R14,Y+
0183 90F9 LD R15,Y+
0184 9508 RET
push_gset2:
0185 937A ST R23,-Y
0186 936A ST R22,-Y
0187 940C016E JMP push_gset1
push_gset3:
0189 92BA ST R11,-Y
018A 92AA ST R10,-Y
018B 940C0185 JMP push_gset2
pop_gset2:
018D E0E2 LDI R30,2
018E 940C0172 JMP pop
pop_gset3:
0190 E0E4 LDI R30,4
0191 940C0172 JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -