📄 ad5161.lis
字号:
.module AD5161.c
.area text(rom, con, rel)
0000 .dbfile C:/icc/include/AVR_PQ1A.h
0000 .dbfunc e Delayus _Delayus fV
0000 ; i -> R20,R21
0000 ; US -> R22,R23
.even
0000 _Delayus::
0000 0E940000 xcall push_gset2
0004 B801 movw R22,R16
0006 .dbline -1
0006 .dbline 28
0006 ; /*******************************************
0006 ; 文件:AD5161.C
0006 ; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
0006 ; 硬件:ATMEGA16芯片
0006 ; 日期:2006年12月10日
0006 ; 功能:驱动开发板上的数字电位器(AD5161采用IIC接口)
0006 ; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
0006 ; /******************************************/
0006 ; #include <iom16v.h> //包含型号头文件
0006 ; #include <macros.h> //包含"位"操作头文件
0006 ; #include <stdio.h> //标准输入输出头文件
0006 ; #include <AVR_PQ1A.h> //包含自定义常量头文件
0006 ; #include "Skey.C" //包含数码管显示函数
0006 ;
0006 ; /*******************************************
0006 ; 函数名称: Twi_init
0006 ; 功 能: 初始化TWI
0006 ; 参 数: MS--延时的毫秒数
0006 ; 返回值 : 无
0006 ; /********************************************/
0006 ; void Twi_init(void)
0006 ; {
0006 ; TWBR= 0x20; //设置波特率
0006 ; TWSR= 0x00; //设置预分频比
0006 ; TWCR= 0x44; //使能应答,使能TWI
0006 ; }
0006 ; /*******************************************
0006 ; 函数名称: AD5161_writeB
0006 .dbline 30
0006 ; 功 能: 向AD5161写入电阻值数据
0006 ; 参 数: devadd--器件地址
0006 05E0 ldi R16,5
0008 10E0 ldi R17,0
000A 9B01 movw R18,R22
000C 0E940000 xcall empy16s
0010 B801 movw R22,R16
0012 7695 lsr R23
0014 6795 ror R22
0016 7695 lsr R23
0018 6795 ror R22
001A .dbline 31
001A 4427 clr R20
001C 5527 clr R21
001E 02C0 xjmp L5
0020 L2:
0020 .dbline 31
0020 L3:
0020 .dbline 31
0020 4F5F subi R20,255 ; offset = 1
0022 5F4F sbci R21,255
0024 L5:
0024 .dbline 31
0024 ; cmd--控制命令
0024 4617 cp R20,R22
0026 5707 cpc R21,R23
0028 D8F3 brlo L2
002A .dbline -2
002A .dbline 32
002A ; rdata--电阻数据
002A L1:
002A 0E940000 xcall pop_gset2
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r i 20 i
0030 .dbsym r US 22 i
0030 .dbend
0030 .dbfunc e Delayms _Delayms fV
0030 ; i -> R20,R21
0030 ; j -> R22,R23
0030 ; MS -> R16,R17
.even
0030 _Delayms::
0030 0E940000 xcall push_gset2
0034 .dbline -1
0034 .dbline 40
0034 ; 返回值 : success--数据成功标志(为TRUE时写入成功,为FALSE时失败)
0034 ; /********************************************/
0034 ; uchar AD5161_writeB(uchar devadd,uchar cmd,uchar rdata)
0034 ; {
0034 ; uchar success=FALSE; //默认返回是写入失败
0034 ; Start(); //产生START信号
0034 ; Wait(); //等待START信号发送完毕
0034 ; if(TestACK()!=START) //检查是否是START信号发送完毕状态
0034 .dbline 42
0034 ; {
0034 ; success=FALSE; //如果不是,则返回写入失败
0034 4427 clr R20
0036 5527 clr R21
0038 0BC0 xjmp L10
003A L7:
003A .dbline 43
003A 6627 clr R22
003C 7727 clr R23
003E 02C0 xjmp L14
0040 L11:
0040 .dbline 43
0040 L12:
0040 .dbline 43
0040 6F5F subi R22,255 ; offset = 1
0042 7F4F sbci R23,255
0044 L14:
0044 .dbline 43
0044 6537 cpi R22,117
0046 E4E0 ldi R30,4
0048 7E07 cpc R23,R30
004A D0F3 brlo L11
004C L8:
004C .dbline 42
004C 4F5F subi R20,255 ; offset = 1
004E 5F4F sbci R21,255
0050 L10:
0050 .dbline 42
0050 4017 cp R20,R16
0052 5107 cpc R21,R17
0054 90F3 brlo L7
0056 .dbline -2
0056 .dbline 44
0056 ; return success;
0056 ; }
0056 L6:
0056 0E940000 xcall pop_gset2
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r i 20 i
005C .dbsym r j 22 i
005C .dbsym r MS 16 i
005C .dbend
005C .dbfunc e Board_init _Board_init fV
.even
005C _Board_init::
005C .dbline -1
005C .dbline 52
005C ; Writebyte(devadd); //发送从器件地址
005C ; Wait(); //等待发送完毕
005C ; if(TestACK()!=MT_SLA_ACK)//检查是否是从器件地址发送完毕状态
005C ; {
005C ; success=FALSE; //如果不是,则返回写入失败
005C ; return success;
005C ; }
005C ; Writebyte(cmd); //发送AD5161的命令字节(具体含义请参看AD5161的数据手册)
005C .dbline 53
005C ; Wait(); //等待发送完毕
005C 8FEF ldi R24,255
005E 8ABB out 0x1a,R24
0060 .dbline 54
0060 ; if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
0060 87BB out 0x17,R24
0062 .dbline 55
0062 ; {
0062 84BB out 0x14,R24
0064 .dbline 56
0064 ; success=FALSE; //如果不是,则返回写入失败
0064 81BB out 0x11,R24
0066 .dbline 58
0066 ; return success;
0066 ; }
0066 2224 clr R2
0068 2DB8 out 0xd,R2
006A .dbline 60
006A ; Writebyte(rdata); //发送电阻值数据
006A ; Wait(); //等待发送完毕
006A DE9A sbi 0x1b,6
006C .dbline 61
006C ; if(TestACK()!=MT_DATA_ACK)//检查是否是数据发送完毕
006C AE98 cbi 0x15,6
006E .dbline 62
006E ; {
006E D998 cbi 0x1b,1
0070 .dbline 63
0070 ; success=FALSE; //如果不是,则返回写入失败
0070 88BB out 0x18,R24
0072 .dbline 64
0072 ; return success;
0072 DA9A sbi 0x1b,2
0074 .dbline 65
0074 ; }
0074 05E0 ldi R16,5
0076 10E0 ldi R17,0
0078 C3DF xcall _Delayus
007A .dbline 66
007A ; Stop(); //对AD5161的一次操作完毕,发送STOP信号
007A DA98 cbi 0x1b,2
007C .dbline 68
007C ; Delayms(10); //等待发送完毕
007C ; success=TRUE; //本次写入成功
007C 2224 clr R2
007E 28BA out 0x18,R2
0080 .dbline 69
0080 ; return success; //返回写入成功状态
0080 DB9A sbi 0x1b,3
0082 .dbline 70
0082 ; }
0082 02E3 ldi R16,50
0084 10E0 ldi R17,0
0086 BCDF xcall _Delayus
0088 .dbline 71
0088 ; /*******************************************
0088 DB98 cbi 0x1b,3
008A .dbline 73
008A ; 函数名称: main
008A ; 功 能: 按键更新数字电位器的阻值(电阻是A和W端的阻值,默认B端是开路的)
008A 8FEF ldi R24,255
008C 88BB out 0x18,R24
008E .dbline 74
008E ; 参 数: 无
008E DC9A sbi 0x1b,4
0090 .dbline 75
0090 ; 返回值 : 无
0090 02E3 ldi R16,50
0092 10E0 ldi R17,0
0094 B5DF xcall _Delayus
0096 .dbline 76
0096 ; /********************************************/
0096 DC98 cbi 0x1b,4
0098 .dbline 78
0098 ; void main(void)
0098 ; {
0098 8FEF ldi R24,255
009A 82BB out 0x12,R24
009C .dbline 79
009C ; uchar i,data=0; //初始电阻是满量程
009C DF9A sbi 0x1b,7
009E .dbline 80
009E ; Board_init( ); //初始化开发板
009E 02E3 ldi R16,50
00A0 10E0 ldi R17,0
00A2 AEDF xcall _Delayus
00A4 .dbline 81
00A4 ; Twi_init( ); //初始化TWI
00A4 DF98 cbi 0x1b,7
00A6 .dbline -2
00A6 .dbline 84
00A6 ; AD5161_writeB(0x58,0x00,data); //设置初始电阻
00A6 ; while(1)
00A6 ; {
00A6 L15:
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbend
00A8 .dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\12_TWI(IIC)/Skey.C
00A8 .dbfunc e Skey_press _Skey_press fc
00A8 ; pressed -> R16
.even
00A8 _Skey_press::
00A8 .dbline -1
00A8 .dbline 20
00A8 .dbline 22
00A8 8FEF ldi R24,255
00AA 81BB out 0x11,R24
00AC .dbline 23
00AC 82B3 in R24,0x12
00AE 8F60 ori R24,15
00B0 82BB out 0x12,R24
00B2 .dbline 24
00B2 80EF ldi R24,240
00B4 81BB out 0x11,R24
00B6 .dbline 25
00B6 80B3 in R24,0x10
00B8 8F70 andi R24,15
00BA 8F30 cpi R24,15
00BC 11F0 breq L17
00BE .dbline 26
00BE 01E0 ldi R16,1
00C0 01C0 xjmp L18
00C2 L17:
00C2 .dbline 28
00C2 0027 clr R16
00C4 L18:
00C4 .dbline 29
00C4 8FEF ldi R24,255
00C6 81BB out 0x11,R24
00C8 .dbline 30
00C8 .dbline -2
00C8 L16:
00C8 .dbline 0 ; func end
00C8 0895 ret
00CA .dbsym r pressed 16 c
00CA .dbend
00CA .dbfunc e Skey_scan _Skey_scan fc
00CA ; keycode -> R20
.even
00CA _Skey_scan::
00CA 0E940000 xcall push_gset2
00CE .dbline -1
00CE .dbline 39
00CE .dbline 40
00CE 4FEF ldi R20,255
00D0 .dbline 41
00D0 0FE0 ldi R16,15
00D2 10E0 ldi R17,0
00D4 ADDF xcall _Delayms
00D6 .dbline 42
00D6 E8DF xcall _Skey_press
00D8 0130 cpi R16,1
00DA 19F5 brne L20
00DC .dbline 43
00DC .dbline 44
00DC 80EF ldi R24,240
00DE 81BB out 0x11,R24
00E0 .dbline 45
00E0 40B3 in R20,0x10
00E2 .dbline 46
00E2 4F70 andi R20,15
00E4 .dbline 47
00E4 642F mov R22,R20
00E6 7727 clr R23
00E8 6730 cpi R22,7
00EA E0E0 ldi R30,0
00EC 7E07 cpc R23,R30
00EE 99F0 breq L28
00F0 6B30 cpi R22,11
00F2 E0E0 ldi R30,0
00F4 7E07 cpc R23,R30
00F6 69F0 breq L27
00F8 6D30 cpi R22,13
00FA E0E0 ldi R30,0
00FC 7E07 cpc R23,R30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -