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

📄 max5478.lis

📁 Max5479 数字电位器的驱动源程序 用M16来实现C语言的编程!
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module MAX5478.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\程序与资料\dpj\AVR\自己写的AVR\MAX5478\MAX5478.C
 0000                   .dbfunc e Delayms _Delayms fV
 0000           ;              i -> R10,R11
 0000           ;              j -> R12,R13
 0000           ;             MS -> R16,R17
                        .even
 0000           _Delayms::
 0000 0E940000          xcall push_xgset003C
 0004                   .dbline -1
 0004                   .dbline 23
 0004           ; /***************MAX5478数字电位器-I2C**********************/
 0004           ; #include <iom16v.h>                   //包含型号头文件
 0004           ; #include <macros.h>                   //包含"位"操作头文件
 0004           ; #include <stdio.h>                    //标准输入输出头文件
 0004           ; /******************数据类型宏定义******************/
 0004           ; #define TRUE  1
 0004           ; #define FALSE 0
 0004           ; #define uchar unsigned char
 0004           ; #define uint unsigned int
 0004           ; //******************按键常量******************/
 0004           ; #define KEY_DDR DDRD                  //按键方向定义
 0004           ; #define KEY_PORTO PORTD                       //按键端口输出定义
 0004           ; #define KEY_PORTI PIND                        //按键端口输入定义
 0004           ; #define OUT 0xFF                      //输出常量
 0004           ; #define IN  0xF0                      //输入常量
 0004           ; /*******************************************
 0004           ; 函数名称: Delayms
 0004           ; 功    能: 延时指定毫秒(12M晶振)
 0004           ; 参    数: MS--延时的毫秒数
 0004           ; 返回值  : 无
 0004           ; /********************************************/
 0004           ; void Delayms(uint MS)           
 0004           ; {
 0004                   .dbline 25
 0004           ;  uint i,j;
 0004           ;  for( i=0;i<MS;i++)
 0004 AA24              clr R10
 0006 BB24              clr R11
 0008 0EC0              xjmp L5
 000A           L2:
 000A                   .dbline 26
 000A           ;  for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
 000A CC24              clr R12
 000C DD24              clr R13
 000E 03C0              xjmp L9
 0010           L6:
 0010                   .dbline 26
 0010           L7:
 0010                   .dbline 26
 0010 C601              movw R24,R12
 0012 0196              adiw R24,1
 0014 6C01              movw R12,R24
 0016           L9:
 0016                   .dbline 26
 0016 C601              movw R24,R12
 0018 8537              cpi R24,117
 001A E4E0              ldi R30,4
 001C 9E07              cpc R25,R30
 001E C0F3              brlo L6
 0020           X0:
 0020           L3:
 0020                   .dbline 25
 0020 C501              movw R24,R10
 0022 0196              adiw R24,1
 0024 5C01              movw R10,R24
 0026           L5:
 0026                   .dbline 25
 0026 A016              cp R10,R16
 0028 B106              cpc R11,R17
 002A 78F3              brlo L2
 002C           X1:
 002C                   .dbline -2
 002C           L1:
 002C                   .dbline 0 ; func end
 002C 0C940000          xjmp pop_xgset003C
 0030                   .dbsym r i 10 i
 0030                   .dbsym r j 12 i
 0030                   .dbsym r MS 16 i
 0030                   .dbend
 0030                   .dbfile E:\程序与资料\dpj\AVR\自己写的AVR\MAX5478\Skey.C
 0030                   .dbfunc e Skey_press _Skey_press fc
 0030           ;        pressed -> R16
                        .even
 0030           _Skey_press::
 0030                   .dbline -1
 0030                   .dbline 10
 0030           ; 
 0030           ; 
 0030           ; /*******************************************
 0030           ; 函数名称: Skey_press
 0030           ; 功    能: 检测是否有键按下
 0030           ; 参    数: 无
 0030           ; 返回值  : pressed--有键按下时为TRUE,否则为FALSE
 0030           ; /********************************************/
 0030           ; uchar Skey_press(void)
 0030           ; {
 0030                   .dbline 12
 0030           ;  uchar pressed;                               
 0030           ;  KEY_DDR=OUT;                 //定义数据端口为输出
 0030 8FEF              ldi R24,255
 0032 81BB              out 0x11,R24
 0034                   .dbline 13
 0034           ;  KEY_PORTO|=0x0F;             //输出数据(输出检测码)
 0034 82B3              in R24,0x12
 0036 8F60              ori R24,15
 0038 82BB              out 0x12,R24
 003A                   .dbline 14
 003A           ;  KEY_DDR=IN;                          //定义数据端口为输入
 003A 80EF              ldi R24,240
 003C 81BB              out 0x11,R24
 003E                   .dbline 15
 003E           ;  if((KEY_PORTI&0x0F)!=0x0F)   //检测是否有键按下
 003E 80B3              in R24,0x10
 0040 8F70              andi R24,15
 0042 8F30              cpi R24,15
 0044 11F0              breq L11
 0046           X2:
 0046                   .dbline 16
 0046           ;       pressed=TRUE;                   //有键按下则返回TRUE
 0046 01E0              ldi R16,1
 0048 01C0              xjmp L12
 004A           L11:
 004A                   .dbline 18
 004A           ;  else
 004A           ;       pressed=FALSE;                  //无键按下则返回FALSE
 004A 0027              clr R16
 004C           L12:
 004C                   .dbline 19
 004C           ;  KEY_DDR=OUT;                         //数据端口还原为输出
 004C 8FEF              ldi R24,255
 004E 81BB              out 0x11,R24
 0050                   .dbline 20
 0050           ;  return pressed;
 0050                   .dbline -2
 0050           L10:
 0050                   .dbline 0 ; func end
 0050 0895              ret
 0052                   .dbsym r pressed 16 c
 0052                   .dbend
 0052                   .dbfunc e Skey_scan _Skey_scan fc
 0052           ;        keycode -> R10
                        .even
 0052           _Skey_scan::
 0052 0E940000          xcall push_xgset003C
 0056                   .dbline -1
 0056                   .dbline 29
 0056           ; }
 0056           ; /*******************************************
 0056           ; 函数名称: Skey_scan
 0056           ; 功    能: 扫描所按的键并返回键值
 0056           ; 参    数: 无
 0056           ; 返回值  : keycode--被按下键值
 0056           ; /********************************************/
 0056           ; uchar Skey_scan(void)
 0056           ; {
 0056                   .dbline 30
 0056           ;  uchar keycode=0xFF;
 0056 8FEF              ldi R24,255
 0058 A82E              mov R10,R24
 005A                   .dbline 31
 005A           ;  Delayms(15);                         //延时消抖
 005A 0FE0              ldi R16,15
 005C 10E0              ldi R17,0
 005E D0DF              xcall _Delayms
 0060                   .dbline 32
 0060           ;  if(Skey_press()==TRUE)               //如果有键按下
 0060 E7DF              xcall _Skey_press
 0062 0130              cpi R16,1
 0064 49F5              brne L14
 0066           X3:
 0066                   .dbline 33
 0066           ;  {
 0066                   .dbline 34
 0066           ;     KEY_DDR=IN;                               //定义数据端口为输入
 0066 80EF              ldi R24,240
 0068 81BB              out 0x11,R24
 006A                   .dbline 35
 006A           ;       keycode=KEY_PORTI;              //读入原始键码
 006A A0B2              in R10,0x10
 006C                   .dbline 36
 006C           ;       keycode&=0x0F;                  //屏蔽高4位
 006C 8A2D              mov R24,R10
 006E 8F70              andi R24,15
 0070 A82E              mov R10,R24
 0072                   .dbline 37
 0072           ;       switch(keycode)                 //翻译原始键码为0~3
 0072 C82E              mov R12,R24
 0074 DD24              clr R13
 0076 C601              movw R24,R12
 0078 8730              cpi R24,7
 007A E0E0              ldi R30,0
 007C 9E07              cpc R25,R30
 007E A9F0              breq L22
 0080           X4:
 0080 8B30              cpi R24,11
 0082 E0E0              ldi R30,0
 0084 9E07              cpc R25,R30
 0086 71F0              breq L21
 0088           X5:
 0088 8D30              cpi R24,13
 008A E0E0              ldi R30,0
 008C 9E07              cpc R25,R30
 008E 39F0              breq L20
 0090           X6:
 0090 8E30              cpi R24,14
 0092 E0E0              ldi R30,0
 0094 9E07              cpc R25,R30
 0096 09F0              breq L19
 0098           X7:
 0098 0BC0              xjmp L16
 009A           L19:
 009A                   .dbline 40
 009A           ;       {
 009A           ;          case 0x0E:
 009A           ;                       keycode=0;
 009A AA24              clr R10
 009C                   .dbline 41
 009C           ;                       break;
 009C 0AC0              xjmp L17
 009E           L20:
 009E                   .dbline 43
 009E           ;          case 0x0D:
 009E           ;                       keycode=1;
 009E AA24              clr R10
 00A0 A394              inc R10
 00A2                   .dbline 44
 00A2           ;                       break;
 00A2 07C0              xjmp L17
 00A4           L21:
 00A4                   .dbline 46
 00A4           ;          case 0x0B:
 00A4           ;                       keycode=2;
 00A4 82E0              ldi R24,2
 00A6 A82E              mov R10,R24
 00A8                   .dbline 47
 00A8           ;                       break;
 00A8 04C0              xjmp L17
 00AA           L22:
 00AA                   .dbline 49
 00AA           ;          case 0x07:
 00AA           ;                       keycode=3;
 00AA 83E0              ldi R24,3
 00AC A82E              mov R10,R24
 00AE                   .dbline 50
 00AE           ;                       break;
 00AE 01C0              xjmp L17
 00B0           L16:
 00B0                   .dbline 52
 00B0           ;          default:
 00B0           ;               keycode=0x00;
 00B0 AA24              clr R10
 00B2                   .dbline 53
 00B2           ;       }
 00B2           L17:
 00B2           L23:
 00B2                   .dbline 55
 00B2           ;       do
 00B2           ;       {
 00B2                   .dbline 56
 00B2           ;       }while(Skey_press()==TRUE);     //等待按键释放(为了防止按一次,执行多次的现象)
 00B2           L24:
 00B2                   .dbline 56
 00B2 BEDF              xcall _Skey_press
 00B4 0130              cpi R16,1
 00B6 E9F3              breq L23
 00B8           X8:
 00B8                   .dbline 57
 00B8           ;  }
 00B8           L14:
 00B8                   .dbline 58
 00B8           ;  return keycode;
 00B8 0A2D              mov R16,R10
 00BA                   .dbline -2
 00BA           L13:
 00BA                   .dbline 0 ; func end
 00BA 0C940000          xjmp pop_xgset003C
 00BE                   .dbsym r keycode 10 c
 00BE                   .dbend
 00BE                   .dbfile E:\程序与资料\dpj\AVR\自己写的AVR\MAX5478\MAX5478.C
 00BE                   .dbfunc e Twi_init _Twi_init fV
                        .even
 00BE           _Twi_init::
 00BE                   .dbline -1
 00BE                   .dbline 45
 00BE           ; }
 00BE           ; //************************************************
 00BE           ; #include "Skey.C"                     //包含键盘扫描函数
 00BE           ; /******************TWI(IIC)常量******************/
 00BE           ; #define START 0x08                    //START信号发送完毕状态
 00BE           ; #define MT_SLA_ACK 0x18               //从器件地址发送,返回ACK
 00BE           ; #define MT_SLA_NOACK 0x20     //从器件地址发送,但是返回NOACK
 00BE           ; #define MT_DATA_ACK  0x28     //数据已发送,返回ACK
 00BE           ; #define MT_DATA_NOACK 0x30    //数据已发送,返回NOACK
 00BE           ; 
 00BE           ; #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))        //产生START信号
 00BE           ; #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
 00BE           ; #define Wait() while(!(TWCR&(1<<TWINT)))              //等待当前操作完成
 00BE           ; #define TestACK() (TWSR&0xF8)                         //取出状态码
 00BE           ; #define SetACK() (TWCR|=(1<<TWEA))                    //产生ACK
 00BE           ; #define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);}    //发送一个字节(twi_d为写入的数据)
 00BE           ; //************************************************************************************************************
 00BE           ; void Twi_init(void)
 00BE           ; {
 00BE                   .dbline 46
 00BE           ;  TWBR= 0x20; //设置波特率
 00BE 80E2              ldi R24,32
 00C0 80B9              out 0x0,R24
 00C2                   .dbline 47
 00C2           ;  TWSR= 0x00; //设置预分频比
 00C2 2224              clr R2
 00C4 21B8              out 0x1,R2
 00C6                   .dbline 48
 00C6           ;  TWCR= 0x44; //使能应答,使能TWI
 00C6 84E4              ldi R24,68
 00C8 86BF              out 0x36,R24
 00CA                   .dbline -2
 00CA           L26:
 00CA                   .dbline 0 ; func end
 00CA 0895              ret
 00CC                   .dbend
 00CC                   .dbfunc e MAX5478_writeB _MAX5478_writeB fc
 00CC           ;        success -> R10
 00CC           ;          rdata -> y+6
 00CC           ;            cmd -> R12
 00CC           ;         devadd -> R14
                        .even
 00CC           _MAX5478_writeB::

⌨️ 快捷键说明

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