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

📄 key.s

📁 我自己编写的atmega16的4*4键盘程序
💻 S
字号:
	.module key.c
	.area data(ram, con, rel)
_num::
	.blkb 2
	.area idata
	.byte 48,49
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 50,51
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 52,53
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 54,55
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 56,57
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'A,'B
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'C,'D
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'E,'F
	.area data(ram, con, rel)
	.dbfile F:\自编程序\M16\4-4keyboard\key.c
	.dbsym e num _num A[16:16]c
	.area vector(rom, abs)
	.org 4
	jmp _INT0_TURNLOW_handler
	.area data(ram, con, rel)
	.dbfile F:\自编程序\M16\4-4keyboard\key.c
	.area text(rom, con, rel)
	.dbfile F:\自编程序\M16\4-4keyboard\key.c
	.dbfunc e INT0_TURNLOW_handler _INT0_TURNLOW_handler fV
;              i -> R20
;       ScanCode -> R22
;              j -> R10
	.even
_INT0_TURNLOW_handler::
	xcall push_lset
	xcall push_gset3
	.dbline -1
	.dbline 18
; #include <iom16v.h> 
; #include <macros.h> 
; 
; //键盘接口
; #define KEYDDR  DDRB  
; #define KEYPORT PORTB 
; #define KEYPIN PINB
; //键盘接口
; 
; unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
; 
; /**************INT0处理函数 start*******************/
; /**************
;          捕捉键盘输入中断进行处理
;                                 *******************/
; #pragma interrupt_handler	INT0_TURNLOW_handler:2
; void INT0_TURNLOW_handler(void)
;  {  
	.dbline 20
;    unsigned char i,j,ScanCode;
;    ScanCode=0x01;
	ldi R22,1
	.dbline 21
;    CLI();
	cli
	.dbline 22
;    for(i=0;i<4;i++)
	clr R20
	xjmp L5
L2:
	.dbline 23
;     {
	.dbline 24
	out 0x18,R22
	.dbline 24
	clr R10
	xjmp L9
L6:
	.dbline 24
L7:
	.dbline 24
	inc R10
L9:
	.dbline 24
;         KEYPORT=ScanCode;for(j=0;j<10;j++);
	mov R24,R10
	cpi R24,10
	brlo L6
	.dbline 25
;         if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
	in R24,0x16
	andi R24,240
	breq L10
	.dbline 25
	in R18,0x16
	clr R19
	andi R18,240
	andi R19,0
	mov R16,R22
	clr R17
	xcall _keycode
	xcall _USART_Transmit
L10:
	.dbline 26
	lsl R22
	.dbline 27
L3:
	.dbline 22
	inc R20
L5:
	.dbline 22
	cpi R20,4
	brlo L2
	.dbline 28
	clr R10
	xjmp L15
L12:
	.dbline 28
L13:
	.dbline 28
	inc R10
L15:
	.dbline 28
; 	    ScanCode<<=1;
;      }
;    for(j=0;j<200;j++);//消抖
	mov R24,R10
	cpi R24,200
	brlo L12
	.dbline 29
;    SEI();
	sei
	.dbline 30
;    KEYPORT=0X0F; 
	ldi R24,15
	out 0x18,R24
	.dbline -2
	.dbline 31
;   }
L1:
	xcall pop_gset3
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r i 20 c
	.dbsym r ScanCode 22 c
	.dbsym r j 10 c
	.dbend
	.dbfunc e keycode _keycode fi
;           temp -> R20
;           line -> R18
;            row -> R16
	.even
_keycode::
	xcall push_gset2
	.dbline -1
	.dbline 35
; /**************INT0处理函数 end*******************/
; /**************解码函数 start*******************/
; unsigned keycode(unsigned char row,unsigned char line)
; {
	.dbline 37
;   unsigned char temp;
;   switch(row) //行值处理
	mov R20,R16
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L20
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L21
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	breq L22
	cpi R20,8
	ldi R30,0
	cpc R21,R30
	breq L23
	xjmp L17
X0:
	.dbline 38
;    {
L20:
	.dbline 39
;      case 0x01:temp=0x00;break;
	clr R20
	.dbline 39
	xjmp L18
L21:
	.dbline 40
;   	 case 0x02:temp=0x04;break;
	ldi R20,4
	.dbline 40
	xjmp L18
L22:
	.dbline 41
;  	 case 0x04:temp=0x08;break;
	ldi R20,8
	.dbline 41
	xjmp L18
L23:
	.dbline 42
;      case 0x08:temp=0x0c;break;
	ldi R20,12
	.dbline 42
L17:
L18:
	.dbline 44
;    }
;    switch(line) //列值处理
	mov R22,R18
	clr R23
	cpi R22,32
	ldi R30,0
	cpc R23,R30
	breq L28
	ldi R24,32
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brlt L32
L31:
	cpi R22,16
	ldi R30,0
	cpc R23,R30
	breq L27
	xjmp L24
L32:
	cpi R22,64
	ldi R30,0
	cpc R23,R30
	breq L29
	cpi R22,64
	ldi R30,0
	cpc R23,R30
	brlt L24
L33:
	cpi R22,128
	ldi R30,0
	cpc R23,R30
	breq L30
	xjmp L24
X1:
	.dbline 45
;    {
L27:
	.dbline 46
;      case 0x10:temp+=0x00;break;
	.dbline 46
	xjmp L25
L28:
	.dbline 47
;   	 case 0x20:temp+=0x01;break;
	inc R20
	.dbline 47
	xjmp L25
L29:
	.dbline 48
;  	 case 0x40:temp+=0x02;break;
	subi R20,254    ; addi 2
	.dbline 48
	xjmp L25
L30:
	.dbline 49
;      case 0x80:temp+=0x03;break;
	subi R20,253    ; addi 3
	.dbline 49
L24:
L25:
	.dbline 51
;    }
;    return num[temp];
	ldi R24,<_num
	ldi R25,>_num
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	clr R17
	.dbline -2
L16:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r line 18 c
	.dbsym r row 16 c
	.dbend
	.dbfunc e KEY_INI _KEY_INI fV
	.even
_KEY_INI::
	.dbline -1
	.dbline 56
; }
; /**************解码函数 end*******************/
; /**************键盘初始化 stat*******************/
; void KEY_INI(void)//高四位输出并拉高
; {
	.dbline 57
;   KEYDDR = 0x0F;
	ldi R24,15
	out 0x17,R24
	.dbline 58
;   KEYPORT = 0x0F;
	out 0x18,R24
	.dbline 61
;   
;   /*************INT0初始化 start******************/
;   PORTD &= 0xFB;
	in R24,0x12
	andi R24,251
	out 0x12,R24
	.dbline 62
;   DDRD  &= 0xFB;
	in R24,0x11
	andi R24,251
	out 0x11,R24
	.dbline 63
;   MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
	ldi R24,3
	out 0x35,R24
	.dbline 64
;   GICR=(1<<INT0);
	ldi R24,64
	out 0x3b,R24
	.dbline -2
	.dbline 67
; /**************INT0初始化 end*******************/
; 
; } 
L34:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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