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