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

📄 lesson5.s

📁 用单片机对键盘按键进行扫描检测。可以扫描出具体按下的哪个键子
💻 S
字号:
	.module lesson5.c
	.area code(ram, con, rel)
	.area lit(rom, con, rel)
_table::
	.word 63
	.word 6
	.word 91
	.word 79
	.word 102
	.word 109
	.word 125
	.word 7
	.word 127
	.word 111
	.word 119
	.word 124
	.word 57
	.word 94
	.word 121
	.word 113
	.word 0
	.dbfile I:\AVR视频教程\视频教程\lesson5\chengxu\lesson5\lesson5.c
	.dbsym e table _table A[34:17]I
	.area text(rom, con, rel)
	.dbfile I:\AVR视频教程\视频教程\lesson5\chengxu\lesson5\lesson5.c
	.dbfunc e delay _delay fV
;              i -> R20,R21
;              j -> R22,R23
;             ms -> R16,R17
	.even
_delay::
	rcall push_gset2
	.dbline -1
	.dbline 9
; #include <iom16v.h>
; #include <macros.h>
; #define  uchar unsigned char
; #define  uint  unsigned int
; #pragma data:code 
; const  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
; 		           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
; void delay(uint ms)
; {
	.dbline 11
;         uint i,j;
; 	for(i=0;i<ms;i++)
	clr R20
	clr R21
	rjmp L5
L2:
	.dbline 12
; 	   {
	.dbline 13
	clr R22
	clr R23
	rjmp L9
L6:
	.dbline 13
L7:
	.dbline 13
	subi R22,255  ; offset = 1
	sbci R23,255
L9:
	.dbline 13
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L6
	.dbline 14
L3:
	.dbline 11
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 11
	cp R20,R16
	cpc R21,R17
	brlo L2
	.dbline -2
	.dbline 15
; 	   for(j=0;j<1141;j++);
;        }
; }
L1:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r ms 16 i
	.dbend
	.dbfunc e show _show fV
;              k -> R20
;              j -> R22
	.even
_show::
	rcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 17
; void show(uchar j,uchar k)
; {
	.dbline 18
;         PORTA|=BIT(3);
	sbi 0x1b,3
	.dbline 19
; 	PORTB=table[j];
	ldi R24,<_table
	ldi R25,>_table
	mov R16,R22
	clr R17
	lsl R16
	rol R17
	add R16,R24
	adc R17,R25
	rcall lpm16
	out 0x18,R16
	.dbline 20
; 	PORTA&=~BIT(3);
	cbi 0x1b,3
	.dbline 22
; 	
; 	PORTB=0XFF;
	ldi R24,255
	out 0x18,R24
	.dbline 23
; 	PORTB&=~BIT(k);
	ldi R16,1
	mov R17,R20
	rcall lsl8
	mov R2,R16
	com R2
	in R3,0x18
	and R3,R2
	out 0x18,R3
	.dbline 24
; 	PORTA|=BIT(4);
	sbi 0x1b,4
	.dbline 25
; 	PORTA&=~BIT(4);
	cbi 0x1b,4
	.dbline 26
; 	delay(1);
	ldi R16,1
	ldi R17,0
	rcall _delay
	.dbline -2
	.dbline 27
; }
L10:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r k 20 c
	.dbsym r j 22 c
	.dbend
	.dbfunc e key_press _key_press fc
;              j -> R16
	.even
_key_press::
	.dbline -1
	.dbline 30
; 
; uchar key_press()
; {
	.dbline 32
;     uchar j;
;     DDRD|=0X0F;
	in R24,0x11
	ori R24,15
	out 0x11,R24
	.dbline 33
; 	PORTD|=0X0F;
	in R24,0x12
	ori R24,15
	out 0x12,R24
	.dbline 35
; 	
; 	DDRD&=0XF0;
	in R24,0x11
	andi R24,240
	out 0x11,R24
	.dbline 37
; 	
; 	j=PIND;
	in R16,0x10
	.dbline 38
; 	j=j&0X0F;//00001111
	andi R16,15
	.dbline 39
; 	if(j==0X0F)
	cpi R16,15
	brne L12
	.dbline 40
; 	{
	.dbline 41
; 	  return 0;
	clr R16
	rjmp L11
L12:
	.dbline 44
; 	}
; 	else
; 	{
	.dbline 45
; 	 return 1;
	ldi R16,1
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbsym r j 16 c
	.dbend
	.dbfunc e key_scan _key_scan fc
;            key -> R20
	.even
_key_scan::
	rcall push_gset2
	.dbline -1
	.dbline 51
; 	}
; 	
; }
; 
; uchar key_scan()
; {
	.dbline 53
;     uchar key;
;     delay(10);
	ldi R16,10
	ldi R17,0
	rcall _delay
	.dbline 54
; 	if(key_press())
	rcall _key_press
	tst R16
	breq L15
	.dbline 55
; 	{
	.dbline 56
; 	key=PIND;
	in R20,0x10
	.dbline 57
; 	key&=0X0F;
	andi R20,15
	.dbline 58
; 	switch(key)
	mov R22,R20
	clr R23
	cpi R22,7
	ldi R30,0
	cpc R23,R30
	breq L23
	cpi R22,11
	ldi R30,0
	cpc R23,R30
	breq L22
	cpi R22,13
	ldi R30,0
	cpc R23,R30
	breq L21
	cpi R22,14
	ldi R30,0
	cpc R23,R30
	breq L20
	rjmp L17
X0:
	.dbline 59
; 	{
L20:
	.dbline 61
; 	   case 0X0E: 
; 	       key=1;
	ldi R20,1
	.dbline 62
; 		   break;
	rjmp L25
L21:
	.dbline 64
; 	   case 0X0D:
; 	       key=2;
	ldi R20,2
	.dbline 65
; 		   break;
	rjmp L25
L22:
	.dbline 67
; 	   	 case 0X0B: 
; 	       key=3;
	ldi R20,3
	.dbline 68
; 		   break;
	rjmp L25
L23:
	.dbline 70
; 	   case 0X07:
; 	       key=4;
	ldi R20,4
	.dbline 71
; 		   break; 
	rjmp L25
L17:
	.dbline 73
; 	   default:	
; 	       key=16;     	   
	ldi R20,16
	.dbline 74
; 	}
L24:
	.dbline 75
L25:
	.dbline 75
; 	  while(key_press());
	rcall _key_press
	tst R16
	brne L24
	.dbline 76
; 	}
	rjmp L16
L15:
	.dbline 78
; 	else
; 	{
	.dbline 79
; 	  key=16;
	ldi R20,16
	.dbline 80
; 	}
L16:
	.dbline 81
; 	return key;
	mov R16,R20
	.dbline -2
L14:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r key 20 c
	.dbend
	.dbfunc e main _main fV
;              l -> R20
;              i -> R22
	.even
_main::
	.dbline -1
	.dbline 84
; }
; void main()
; {
	.dbline 86
;     uchar i,l;
;     DDRA|=0X18;//0001 1000
	in R24,0x1a
	ori R24,24
	out 0x1a,R24
	.dbline 87
; 	DDRB=0XFF;
	ldi R24,255
	out 0x17,R24
	rjmp L29
L28:
	.dbline 89
; 	while(1)
; 	{
	.dbline 90
; 	  i=key_press();
	rcall _key_press
	mov R22,R16
	.dbline 91
; 	  if(i)
	tst R16
	breq L31
	.dbline 92
; 	  {
	.dbline 93
; 	     l=key_scan();
	rcall _key_scan
	mov R20,R16
	.dbline 94
; 		 show(l,0);
	clr R18
	rcall _show
	.dbline 95
; 	  }
L31:
	.dbline 96
L29:
	.dbline 88
	rjmp L28
X1:
	.dbline -2
	.dbline 97
; 	}
; }
L27:
	.dbline 0 ; func end
	ret
	.dbsym r l 20 c
	.dbsym r i 22 c
	.dbend

⌨️ 快捷键说明

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