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

📄 key5.s

📁 本设计以ATMEL公司生产的AT90S8515作为控制核心
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module key5.c
	.area text(rom, con, rel)
	.dbfile D:\hujie\key5.c
	.dbfunc e key_scan _key_scan fc
;           temp -> R20
	.even
_key_scan::
	rcall push_gset2
	.dbline -1
	.dbline 17
; // key_5.c
; //
; 
; #include <io8515v.h>
; #include <macros.h>
; #include "1602LCD.h"
; #include "key5.h"	
; #include "init.h"
; #include "main.h"
; 
; 
; /////////////////////////////////////////////
; // key_san()
; // 四键扫描函数	
; //
; unsigned char key_scan(void)
; {
	.dbline 18
;     unsigned char temp=0;
	clr R20
	.dbline 19
; 	PORTD|=0X3B;    //高四位置高
	in R24,0x12
	ori R24,59
	out 0x12,R24
	.dbline 20
; 	DDRD&=0XC4;     //高四位输入
	in R24,0x11
	andi R24,196
	out 0x11,R24
	.dbline 21
;     temp=PIND&0X3B;
	in R20,0x10
	andi R20,59
	.dbline 22
; 	if(temp!=0x3B)
	cpi R20,59
	breq L2
	.dbline 23
; 	{
	.dbline 24
; 	    delay_nms(15);
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
	.dbline 25
; 		temp=PIND&0X3B;
	in R20,0x10
	andi R20,59
	.dbline 26
; 		if(temp!=0x3B)
	cpi R20,59
	breq L4
	.dbline 27
; 		    switch(temp)
	mov R22,R20
	clr R23
	cpi R22,43
	ldi R30,0
	cpc R23,R30
	breq L12
	ldi R24,43
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brlt L15
L14:
	cpi R22,27
	ldi R30,0
	cpc R23,R30
	breq L13
	rjmp L6
L15:
	cpi R22,51
	ldi R30,0
	cpc R23,R30
	breq L11
	cpi R22,51
	ldi R30,0
	cpc R23,R30
	brlt L6
L16:
	cpi R22,57
	ldi R30,0
	cpc R23,R30
	breq L10
	cpi R22,58
	ldi R30,0
	cpc R23,R30
	breq L9
	rjmp L6
X0:
	.dbline 28
; 			{
L9:
	.dbline 29
; 			case 0x3A:temp=1;break;
	ldi R20,1
	.dbline 29
	rjmp L7
L10:
	.dbline 30
; 			case 0x39:temp=2;break;
	ldi R20,2
	.dbline 30
	rjmp L7
L11:
	.dbline 31
; 			case 0x33:temp=3;break;
	ldi R20,3
	.dbline 31
	rjmp L7
L12:
	.dbline 32
; 			case 0x2B:temp=4;break;
	ldi R20,4
	.dbline 32
	rjmp L7
L13:
	.dbline 33
; 			case 0x1B:temp=5;break;
	ldi R20,5
	.dbline 33
L6:
L7:
L4:
	.dbline 35
; 			}
; 	}
L2:
	.dbline 36
;     return (temp);
	mov R16,R20
	.dbline -2
L1:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbend
	.dbfunc e keypad _keypad fc
;          temp1 -> R20
;          temp2 -> R22
	.even
_keypad::
	rcall push_gset2
	.dbline -1
	.dbline 44
; }
; 
; /////////////////////////////////////////////
; // key_san()
; // 四键扫描函数(按键释放检查)
; //
; unsigned char keypad(void)
; {
	.dbline 46
;     unsigned char temp1,temp2;
; 	temp1=key_scan();
	rcall _key_scan
	mov R20,R16
	.dbline 47
; 	if (temp1==0x3B)
	cpi R16,59
	brne L18
	.dbline 48
; 	    return 0x3B;
	ldi R16,59
	rjmp L17
L18:
L20:
	.dbline 50
; 	do
; 	    temp2=key_scan();
	rcall _key_scan
	mov R22,R16
L21:
	.dbline 51
; 	while(temp1==temp2);
	cp R20,R22
	breq L20
	.dbline 52
; 	return temp1;
	mov R16,R20
	.dbline -2
L17:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp1 20 c
	.dbsym r temp2 22 c
	.dbend
	.dbfunc e key_service _key_service fV
;           temp -> R22
;          value -> R20,R21
;    data_length -> y+20
;              y -> R22
;              x -> R10
	.even
_key_service::
	rcall push_gset3
	mov R22,R18
	mov R10,R16
	sbiw R28,14
	ldd R20,y+22
	ldd R21,y+23
	.dbline -1
	.dbline 70
; }
; 
; ///////////////////////////////////////////////////
; // key_service
; // 按键服务函数:     
; // x ——数据显示列
; // y ——数据显示行
; // data_lentgh —— 数据长度
; // *value ——	    数据指针
; //       MODE:   1          2
; // KEY: 1                  确定   
; //       2      step+        +
; //       3      step-        -
; //       4                  移动光标
; //       5         模式选择
; //
; void key_service(unsigned char x,unsigned char y,unsigned char data_length,unsigned int *value)
; {
	.dbline 73
; 	 unsigned char temp;
; 	 
; 	 temp=keypad();
	rcall _keypad
	mov R22,R16
	.dbline 74
; 	 value_temp=*value;
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	ldd R3,z+1
	sts _value_temp+1,R3
	sts _value_temp,R2
	.dbline 75
; 	 if(mode==1)
	lds R24,_mode
	cpi R24,1
	breq X3
	rjmp L24
X3:
	.dbline 76
; 	 {
	.dbline 77
; 	 	 switch (temp)
	mov R10,R22
	clr R11
	mov R24,R10
	mov R25,R11
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L29
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	breq L31
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brne X4
	rjmp L38
X4:
	rjmp L25
X1:
	.dbline 78
; 	 	 {
L29:
	.dbline 80
; 		 case KEY_FN:
; 		 	  mode=2;
	ldi R24,2
	sts _mode,R24
	.dbline 81
; 			  LCD_write_string(0,1,"  ^    seting...");
	ldi R24,<L30
	ldi R25,>L30
	std y+1,R25
	std y+0,R24
	ldi R18,1
	clr R16
	rcall _LCD_write_string
	.dbline 82
; 			  j=0;
	clr R2
	sts _j,R2
	.dbline 83
; 			  LCD_display(2,0,4,*value);
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	ldd R3,z+1
	clr R4
	clr R5
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	ldi R24,4
	std y+0,R24
	clr R18
	ldi R16,2
	rcall _LCD_display
	.dbline 84
; 			  data_init(*value);   // 送缓冲
	mov R30,R20
	mov R31,R21
	ldd R16,z+0
	ldd R17,z+1
	rcall _data_init
	.dbline 85
; 		 	  break;
	rjmp L25
L31:
	.dbline 87
; 		 case KEY_INC:
; 			  (*value)++;
	mov R30,R20
	mov R31,R21
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	std z+1,R25
	std z+0,R24
	.dbline 88
; 			  if(*value>2000) (*value)=2000;
	ldi R24,2000
	ldi R25,7
	ldd R2,z+0
	ldd R3,z+1
	cp R24,R2
	cpc R25,R3
	brsh L32
	.dbline 88
	std z+1,R25
	std z+0,R24
L32:
	.dbline 89
; 			  ADC_GD=(*value)*K1;
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	ldd R3,z+1
	ldi R16,<L36
	ldi R17,>L36
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	mov R16,R2
	mov R17,R3
	lsr R17
	ror R16
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall mpy32fs
	mov R16,R2
	mov R17,R3
	andi R16,1
	andi R17,0
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall add32fs
	lds R4,_K1+2
	lds R5,_K1+2+1
	lds R2,_K1
	lds R3,_K1+1
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	rcall mpy32f
	mov R30,R28
	mov R31,R29
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
	mov R30,R28
	mov R31,R29
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L37
	ldi R17,>L37
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall cmp32f
	brlt L34
	mov R30,R28
	mov R31,R29
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L37
	ldi R17,>L37
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall sub32f
	rcall fp2int
	mov R24,R16
	mov R25,R17
	subi R24,0  ; offset = 32768
	sbci R25,128
	mov R10,R24
	mov R11,R25
	rjmp L35
L34:
	mov R30,R28
	mov R31,R29
	ldd R16,z+6
	ldd R17,z+7
	ldd R18,z+8
	ldd R19,z+9
	rcall fp2int
	mov R10,R16
	mov R11,R17
L35:
	sts _ADC_GD+1,R11
	sts _ADC_GD,R10
	.dbline 90
; 			  LCD_display(2,0,4,*value);
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	ldd R3,z+1
	clr R4
	clr R5
	std y+2,R2
	std y+3,R3
	std y+4,R4
	std y+5,R5
	ldi R24,4
	std y+0,R24
	clr R18
	ldi R16,2
	rcall _LCD_display
	.dbline 91
; 		 	  break;
	rjmp L25
L38:
	.dbline 93
; 		 case KEY_DEC:
; 			  (*value)--;
	mov R30,R20
	mov R31,R21
	ldd R24,z+0
	ldd R25,z+1
	sbiw R24,1
	std z+1,R25
	std z+0,R24
	.dbline 94
; 			  if(*value>2000) (*value)=0;
	ldi R24,2000
	ldi R25,7
	ldd R2,z+0
	ldd R3,z+1
	cp R24,R2
	cpc R25,R3
	brsh L39
	.dbline 94
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
L39:
	.dbline 95
; 			  ADC_GD=(*value)*K1;
	mov R30,R20
	mov R31,R21
	ldd R2,z+0
	ldd R3,z+1
	ldi R16,<L36
	ldi R17,>L36
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	mov R16,R2
	mov R17,R3
	lsr R17
	ror R16
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17

⌨️ 快捷键说明

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