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

📄 ad5161.lst

📁 在AVR单片机开发板上驱动开发板上的数字电位器
💻 LST
📖 第 1 页 / 共 2 页
字号:
(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 + -