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

📄 keyscan.s

📁 3510 TFT彩屏的测试程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module keyscan.c
	.area lit(rom, con, rel)
_Convert::
	.byte 0,1
	.byte 4,7
	.byte 10,2
	.byte 5,8
	.byte 11,3
	.byte 6,9
	.byte 12
	.dbfile D:\StudyRoom\学习AVR\3510测试ICC版\keyscan.c
	.dbsym e Convert _Convert A[13:13]kc
	.area text(rom, con, rel)
	.dbfile D:\StudyRoom\学习AVR\3510测试ICC版\keyscan.c
	.dbfunc e Get_Key_Value _Get_Key_Value fc
;         keynum -> y+0
;       keyvalue -> R14
;              i -> R12
	.even
_Get_Key_Value::
	xcall push_gset5x
	sbiw R28,1
	.dbline -1
	.dbline 35
; /*--------------------------------------------------------------------------------
; **工程名称:3*4键盘扫描测试程序
; **编译器:ICCAVR6.31A pro
; **日期:2005.10.10
; **作者:coole
; 
; **芯片类型:M16
; **时钟频率:内部8M
; 
; ---------------------------------------------------------------------------------*/
; #include "keyscan.h"
; #include "3510i.h"
; #include "buzzpr.h"
; 
; extern 	uchar fBuzzring;
; extern	uchar BuzzringCnt;
; extern	uchar BuzzringTime;
; extern 	LCD_BGColor;
; 
; //**************************************************************
; const		uchar	Convert[]={0,1,4,7,10,2,5,8,11,3,6,9,12};
; uchar 	flag1;
; #define 	fkeyreq   		0	//按键请求
; #define 	fkeyeff   		1	//按键有效
; #define 	fkeyhid   		2	//按键屏蔽
; #define 	fkeysucc  		3	//连键判断
; #define	finputeff		4	//按键输入有效
; 
; uchar 	MenuLevel;
; uchar	MenuItemMax;
; uchar 	MenuSelect[3];
; 
; uchar 	KeyNow,KeyOld,KeyCode,KeyCnt;
; uchar Get_Key_Value(void)
; {
	.dbline 37
; 	uchar  i,keyvalue,keynum;
; 	keynum=0xff;
	ldi R24,255
	std y+0,R24
	.dbline 38
;     	DDRD  = 0xf0;//低四位为输入,高四位为输出
	ldi R24,240
	out 0x11,R24
	.dbline 39
;     	for(i=0;i<3;i++)
	clr R12
	xjmp L5
L2:
	.dbline 40
;     	{
	.dbline 41
;     		PORTD = 0xff;
	ldi R24,255
	out 0x12,R24
	.dbline 42
;     		clr_bit(PORTD,4+i);//将第i列输出低电平
	mov R17,R12
	subi R17,252    ; addi 4
	ldi R16,1
	xcall lsl8
	mov R2,R16
	com R2
	in R3,0x12
	and R3,R2
	out 0x12,R3
	.dbline 43
;     		delay_nus(20);
	ldi R16,20
	ldi R17,0
	xcall _delay_nus
	.dbline 44
;     		keyvalue=PIND&0x0f;
	in R24,0x10
	andi R24,15
	mov R14,R24
	.dbline 45
;     		if(keyvalue!=0x0f)
	cpi R24,15
	breq L6
	.dbline 46
;     		{
	.dbline 47
;     			switch(keyvalue)
	mov R10,R24
	clr R11
	movw R24,R10
	cpi R24,7
	ldi R30,0
	cpc R25,R30
	breq L14
	cpi R24,11
	ldi R30,0
	cpc R25,R30
	breq L13
	cpi R24,13
	ldi R30,0
	cpc R25,R30
	breq L12
	cpi R24,14
	ldi R30,0
	cpc R25,R30
	breq L11
	xjmp L9
X0:
	.dbline 48
;     			{
L11:
	.dbline 49
;     				case 	0x0e:keynum=13-(3-i)*4;break;
	ldi R17,3
	sub R17,R12
	ldi R16,4
	muls R16,R17
	ldi R24,13
	sub R24,R0
	std y+0,R24
	.dbline 49
	xjmp L9
L12:
	.dbline 50
;     				case	0x0d:keynum=14-(3-i)*4;break;
	ldi R17,3
	sub R17,R12
	ldi R16,4
	muls R16,R17
	ldi R24,14
	sub R24,R0
	std y+0,R24
	.dbline 50
	xjmp L9
L13:
	.dbline 51
;     				case	0x0b:keynum=15-(3-i)*4;break;
	ldi R17,3
	sub R17,R12
	ldi R16,4
	muls R16,R17
	ldi R24,15
	sub R24,R0
	std y+0,R24
	.dbline 51
	xjmp L9
L14:
	.dbline 52
;     				case	0x07:keynum=16-(3-i)*4;break;
	ldi R17,3
	sub R17,R12
	ldi R16,4
	muls R16,R17
	ldi R24,16
	sub R24,R0
	std y+0,R24
	.dbline 52
	.dbline 53
;     				default:break;
L9:
	.dbline 56
;     			}
; 
;     		}
L6:
	.dbline 57
L3:
	.dbline 39
	inc R12
L5:
	.dbline 39
	mov R24,R12
	cpi R24,3
	brsh X1
	xjmp L2
X1:
	.dbline 58
;     	}
;     	DDRD  = 0xff;
	ldi R24,255
	out 0x11,R24
	.dbline 59
;     	PORTD = 0xff;
	out 0x12,R24
	.dbline 60
;     	return  keynum;//return  0xff;
	ldd R16,y+0
	.dbline -2
L1:
	adiw R28,1
	xcall pop_gset5x
	.dbline 0 ; func end
	ret
	.dbsym l keynum 0 c
	.dbsym r keyvalue 14 c
	.dbsym r i 12 c
	.dbend
	.dbfunc e Key_Scan _Key_Scan fV
;           temp -> R10
	.even
_Key_Scan::
	xcall push_gset3x
	.dbline -1
	.dbline 73
; }
; 
; //**************************************//
; //	函数名称:void Key_Scan()
; //	输--入:无
; //	输--出:无
; //	功--能:按键扫描
; //	影响标志:
; //	创--建:
; //	修--改:
; //**************************************//
; void Key_Scan(void)
; {
	.dbline 75
; 	uchar temp;
; 	temp=Get_Key_Value();
	xcall _Get_Key_Value
	mov R10,R16
	.dbline 76
; 	if(temp!=0xff)
	cpi R16,255
	breq L16
	.dbline 77
; 	{
	.dbline 78
; 		KeyNow=Convert[temp];
	ldi R24,<_Convert
	ldi R25,>_Convert
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	lpm R30,Z
	sts _KeyNow,R30
	.dbline 80
; 		//LCD_WriteEnglishChar((KeyNow+48),10 , 50);
; 	}
	xjmp L17
L16:
	.dbline 82
; 	else
; 	{
	.dbline 83
; 		KeyNow=0;
	clr R2
	sts _KeyNow,R2
	.dbline 84
; 		KeyCode=0;
	sts _KeyCode,R2
	.dbline 85
; 		KeyOld=0;
	sts _KeyOld,R2
	.dbline 86
; 	}
L17:
	.dbline 87
; 	if(KeyNow)
	lds R2,_KeyNow
	tst R2
	breq L18
	.dbline 88
; 	{
	.dbline 89
; 		if(KeyNow!=KeyCode)
	lds R2,_KeyCode
	lds R3,_KeyNow
	cp R3,R2
	breq L20
	.dbline 90
; 		{
	.dbline 91
; 			KeyCode=KeyNow;
	mov R2,R3
	sts _KeyCode,R2
	.dbline 92
; 			KeyCnt=0;
	clr R2
	sts _KeyCnt,R2
	.dbline 93
; 		}
	xjmp L21
L20:
	.dbline 95
; 		else
; 		{	//起滤波作用,修改这里的数字可以调整按键的灵敏度
	.dbline 96
; 			KeyCnt++;
	lds R24,_KeyCnt
	subi R24,255    ; addi 1
	sts _KeyCnt,R24
	.dbline 97
; 			if(KeyCnt>5)
	ldi R24,5
	lds R2,_KeyCnt
	cp R24,R2
	brsh L22
	.dbline 98
; 			{
	.dbline 99
; 				KeyCnt=0;
	clr R2
	sts _KeyCnt,R2
	.dbline 100
; 				set_bit(flag1,fkeyreq);
	lds R24,_flag1
	ori R24,1
	sts _flag1,R24
	.dbline 101
; 			}
L22:
	.dbline 102
; 		}
L21:
	.dbline 103
; 	}
L18:
	.dbline 104
; 	if(get_bit(flag1,fkeyreq))
	lds R2,_flag1
	sbrs R2,0
	rjmp L24
	.dbline 105
; 	{
	.dbline 106
; 		clr_bit(flag1,fkeyreq);
	mov R24,R2
	andi R24,254
	sts _flag1,R24
	.dbline 107
; 		if(KeyCode!=KeyOld)
	lds R2,_KeyOld
	lds R3,_KeyCode
	cp R3,R2
	breq L26
	.dbline 108
; 		{
	.dbline 110
; 			//无连键
; 			if(!(get_bit(flag1,fkeyhid)))
	sbrc R24,2
	rjmp L27
	.dbline 111
; 			{
	.dbline 112
; 				set_bit(flag1,fkeyhid); //有按键时,设置按键屏蔽,屏蔽掉其它按键
	ori R24,4
	sts _flag1,R24
	.dbline 113
; 				KeyOld=KeyCode;
	mov R2,R3
	sts _KeyOld,R2
	.dbline 114
; 				set_bit(flag1,fkeyeff);
	ori R24,2
	sts _flag1,R24
	.dbline 115
; 			}
	.dbline 117
; 			//keyccnt=40;
; 		}
	xjmp L27
L26:
	.dbline 119
; 		else
; 		{
	.dbline 121
; 			//有连键现象
; 			set_bit(flag1,fkeyhid);
	lds R24,_flag1
	ori R24,4
	sts _flag1,R24
	.dbline 132
; 			/*if((KeyCode==3)||(KeyCode==4))		//这里的数字对应有连键现象的键值
; 			{
; 				keyccnt--;
; 				if(keyccnt==0)
; 				{
; 					keyccnt=6;
; 					set_bit(flag1,fkeyeff);
; 					set_bit(flag1,fkeysucc);
; 				}
; 			}*/
; 		}
L27:
	.dbline 133
; 	}
L24:
	.dbline 134
	lds R2,_KeyNow
	tst R2
	brne L30
	.dbline 135
	lds R24,_flag1
	andi R24,251
	sts _flag1,R24
L30:
	.dbline -2
L15:
	xcall pop_gset3x
	.dbline 0 ; func end
	ret
	.dbsym r temp 10 c
	.dbend
	.dbfunc e Key_Pr _Key_Pr fV
	.even
_Key_Pr::
	xcall push_gset3x
	sbiw R28,3
	.dbline -1
	.dbline 147
; 	if(!KeyNow) 	//没有任何按键时,清除按键屏蔽
; 		clr_bit(flag1,fkeyhid);            	                     
; }
; //**************************************//
; //	函数名称:void Key_Pr()
; //	输--入:KeyCode
; //	输--出:data_buffer[0]
; //	功--能:按键处理
; //	影响标志:
; //	创--建:
; //	修--改:
; //**************************************//
; void Key_Pr(void)
; {
	.dbline 148
; 	if(get_bit(flag1,fkeyeff))
	lds R2,_flag1
	sbrs R2,1
	rjmp L33
	.dbline 149
; 	{
	.dbline 150
; 		fBuzzring|=(1<<fbuzzeff)|(1<<fbuzzring);
	lds R24,_fBuzzring
	ori R24,3
	sts _fBuzzring,R24
	.dbline 151
; 		BuzzringCnt=2;
	ldi R24,2
	sts _BuzzringCnt,R24
	.dbline 152
; 		clr_bit(flag1,fkeyeff);
	mov R24,R2
	andi R24,253
	sts _flag1,R24
	.dbline 153
; 		set_bit(flag1,finputeff);
	ori R24,16
	sts _flag1,R24
	.dbline 154
; 		if(KeyOld==10)
	lds R24,_KeyOld
	cpi R24,10
	brne L35
	.dbline 155
; 			KeyOld=0;
	clr R2
	sts _KeyOld,R2
L35:
	.dbline 159
; 		//******************
; 		//**各按键功能处理
; 		//******************
; 		switch(KeyOld)
	lds R10,_KeyOld
	clr R11
	tst R10
	brne X2
	tst R11
	brne X6
	xjmp L38
X6:
X2:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X7
	xjmp L40
X7:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X8
	xjmp L44
X8:
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	brne X9
	xjmp L46
X9:
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brne X10
	xjmp L50
X10:
	cpi R24,5
	ldi R30,0
	cpc R25,R30
	brne X11
	xjmp L52
X11:
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	brne X12
	xjmp L53
X12:
	cpi R24,7
	ldi R30,0
	cpc R25,R30
	brne X13
	xjmp L38
X13:
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	brne X14
	xjmp L56
X14:
	cpi R24,9
	ldi R30,0
	cpc R25,R30
	brne X15
	xjmp L38
X15:
	cpi R24,11
	ldi R30,0
	cpc R25,R30
	brne X16
	xjmp L60
X16:
	cpi R24,12
	ldi R30,0
	cpc R25,R30
	brne X17
	xjmp L62
X17:
	xjmp L38
X3:
	.dbline 160
; 		{
L40:
	.dbline 162
; 			case 1: //confirm键
; 			{	
	.dbline 163

⌨️ 快捷键说明

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