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

📄 4x4key_main.s

📁 4*4按键扫描程序
💻 S
字号:
	.module _4x4key_main.c
	.area text(rom, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\4x4key_main.c
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\ch595.h
	.dbfunc e s_ms _s_ms fV
;              t -> R16,R17
	.even
_s_ms::
	.dbline -1
	.dbline 8
; //4x4键盘试验程序
; //使用板载的4x4键盘
; //数码管显示按键值
; 
; #define uchar unsigned char 
; #define uint unsigned int 
; #include<iom128v.h>
; #include"ch595.h"
	.dbline 9
; #include"encoder.h"
	xjmp L5
L2:
	.dbline 10
; #include"key_value.h"
	.dbline 11
; #include"disp.h"
L3:
	.dbline 9
	subi R16,1
	sbci R17,0
L5:
	.dbline 9
	ldi R24,1
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlo L2
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r t 16 i
	.dbend
	.dbfunc e sendbyte _sendbyte fV
;            tem -> R10
;              i -> R22
;           byte -> R20
	.even
_sendbyte::
	xcall push_xgsetF00C
	mov R20,R16
	.dbline -1
	.dbline 15
; 
; uchar a1,a2,a3;
; 
; //键值转换
	.dbline 17
; turn(uchar key)
; {
	mov R16,R20
	clr R17
	xcall _encoder
	mov R20,R16
	.dbline 18
; switch(key)
	clr R22
	xjmp L10
L7:
	.dbline 19
; {
	.dbline 20
;   case 0x11:        
	cbi 0x1b,1
	.dbline 21
;   key=0x01;break; 
	mov R24,R20
	andi R24,128
	mov R10,R24
	.dbline 22
;   case 0x21:        
	tst R24
	brne L11
X1:
	.dbline 23
;   key=0x02;break;
	.dbline 24
;   case 0x41:
	cbi 0x1b,3
	.dbline 25
;   key=0x03;break;
	xjmp L12
L11:
	.dbline 27
;   case 0x81:
;   key=0x04;break;
	.dbline 28
;   case 0x12:
	sbi 0x1b,3
	.dbline 29
;   key=0x05;break;
L12:
	.dbline 30
;   case 0x22:
	lsl R20
	.dbline 31
;   key=0x06;break;
	sbi 0x1b,1
	.dbline 32
;   case 0x42:
L8:
	.dbline 18
	inc R22
L10:
	.dbline 18
	cpi R22,8
	brlo L7
X2:
	.dbline 33
;   key=0x07;break;
	cbi 0x1b,2
	.dbline 34
;   case 0x82:
	ldi R16,100
	ldi R17,0
	xcall _s_ms
	.dbline 35
;   key=0x08;break;
	sbi 0x1b,2
	.dbline -2
L6:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r tem 10 c
	.dbsym r i 22 c
	.dbsym r byte 20 c
	.dbend
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\encoder.h
	.dbfunc e encoder _encoder fc
;           code -> R20
;            num -> R16
	.even
_encoder::
	xcall push_xgsetF000
	.dbline -1
	.dbline 3
; //数码管译码函数
; uchar encoder(uchar num)
; {
	.dbline 5
; uchar code;
; switch(num)
	mov R22,R16
	clr R23
	cpi R22,0
	cpc R22,R23
	breq L17
X3:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L18
X4:
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L19
X5:
	cpi R22,3
	ldi R30,0
	cpc R23,R30
	breq L20
X6:
	cpi R22,4
	ldi R30,0
	cpc R23,R30
	breq L21
X7:
	cpi R22,5
	ldi R30,0
	cpc R23,R30
	breq L22
X8:
	cpi R22,6
	ldi R30,0
	cpc R23,R30
	breq L23
X9:
	cpi R22,7
	ldi R30,0
	cpc R23,R30
	breq L24
X10:
	cpi R22,8
	ldi R30,0
	cpc R23,R30
	breq L25
X11:
	cpi R22,9
	ldi R30,0
	cpc R23,R30
	breq L26
X12:
	xjmp L14
L17:
	.dbline 8
; {
;   case 0x00:
;   code=0xc0;break;
	ldi R20,192
	.dbline 8
	xjmp L15
L18:
	.dbline 10
;   case 0x01:
;   code=0xf9;break;
	ldi R20,249
	.dbline 10
	xjmp L15
L19:
	.dbline 12
;   case 0x02:
;   code=0xa4;break;
	ldi R20,164
	.dbline 12
	xjmp L15
L20:
	.dbline 14
;   case 0x03:
;   code=0xb0;break;
	ldi R20,176
	.dbline 14
	xjmp L15
L21:
	.dbline 16
;   case 0x04:
;   code=0x99;break;
	ldi R20,153
	.dbline 16
	xjmp L15
L22:
	.dbline 18
;   case 0x05:
;   code=0x92;break;
	ldi R20,146
	.dbline 18
	xjmp L15
L23:
	.dbline 20
;   case 0x06:
;   code=0x82;break;
	ldi R20,130
	.dbline 20
	xjmp L15
L24:
	.dbline 22
;   case 0x07:
;   code=0xf8;break;
	ldi R20,248
	.dbline 22
	xjmp L15
L25:
	.dbline 24
;   case 0x08:
;   code=0x80;break;
	ldi R20,128
	.dbline 24
	xjmp L15
L26:
	.dbline 26
;   case 0x09:
;   code=0x90;break;
	ldi R20,144
	.dbline 26
L14:
L15:
	.dbline 28
;   }
;   return(code);
	mov R16,R20
	.dbline -2
L13:
	.dbline 0 ; func end
	xjmp pop_xgsetF000
	.dbsym r code 20 c
	.dbsym r num 16 c
	.dbend
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\key_value.h
	.dbfunc e key_value _key_value fc
;              i -> <dead>
;           tem2 -> R10
;            rem -> R20
;           tem1 -> R22
	.even
_key_value::
	xcall push_xgsetF00C
	.dbline -1
	.dbline 3
; //读键盘值 键盘在端口B
; uchar key_value()
; {
	.dbline 5
; uchar tem1,tem2,rem,i;
; rem=0;                      //不清零会返回一个不可预知的值
	clr R20
	.dbline 6
; DDRB=0xf0;                  //B口高四位输出 低四位输入
	ldi R24,240
	out 0x17,R24
	.dbline 7
; PORTB=0x0f;                 //输入有上拉电阻 输出低电平
	ldi R24,15
	out 0x18,R24
	.dbline 8
; s_ms(1);
	ldi R16,1
	ldi R17,0
	xcall _s_ms
	.dbline 9
; tem1=PINB;                  //读取端口B
	in R22,0x16
	.dbline 10
; tem1=tem1&0x0f;
	andi R22,15
	.dbline 11
; if(tem1!=0x0f)              //判断是否有键被按下
	cpi R22,15
	breq L28
X13:
	.dbline 12
;   {
	.dbline 13
;   s_ms(200);                  //延时
	ldi R16,200
	ldi R17,0
	xcall _s_ms
	.dbline 14
;   tem2=PINB;                //读取端口B
	in R10,0x16
	.dbline 15
;   tem2=tem2&0x0f;
	mov R24,R10
	andi R24,15
	mov R10,R24
	.dbline 16
;   if(tem1==tem2)            //判断是否为干扰
	cp R22,R24
	brne L30
X14:
	.dbline 17
;     {
	.dbline 18
; 	DDRB=0x0f;              //B口高四位输入 低四位输出
	ldi R24,15
	out 0x17,R24
	.dbline 19
; 	PORTB=0xf0;             //反相输出
	ldi R24,240
	out 0x18,R24
	.dbline 20
; 	s_ms(50);                  //换向后要延时
	ldi R16,50
	ldi R17,0
	xcall _s_ms
	.dbline 21
; 	rem=PINB;               //读取端口B
	in R20,0x16
	.dbline 22
; 	rem=rem&0xf0;           //取高四位 
	andi R20,240
	.dbline 23
; 	rem=rem+tem1;           //合并
	add R20,R22
	.dbline 24
; 	rem=~rem;               //反向输出
	com R20
	.dbline 31
; 	//do                    //判断按键是否被释放
; 	//{
;     // PORTB=0xf0;
; 	//s_ms(200);
; 	//}
;     //while(PINB!=0xf0);
; 	}
L30:
	.dbline 32
;   }
L28:
	.dbline 33
; return(rem);
	mov R16,R20
	.dbline -2
L27:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym l i 1 c
	.dbsym r tem2 10 c
	.dbsym r rem 20 c
	.dbsym r tem1 22 c
	.dbend
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\disp.h
	.dbfunc e disa _disa fV
;           data -> R10
	.even
_disa::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 9
; //数码管显示子程序
; 
; #define ls138a 7
; #define ls138b 6
; #define ls138c 5
; #define ls138en 4
; uchar a1,a2,a3;
; void disa(uchar data)
; {
	.dbline 10
; a3=data/100;
	ldi R17,100
	mov R16,R10
	xcall div8u
	sts _a3,R16
	.dbline 11
; a2=(data-a3*100)/10;
	mov R2,R16
	ldi R24,100
	mul R24,R2
	mov R16,R10
	sub R16,R0
	ldi R17,10
	xcall div8u
	sts _a2,R16
	.dbline 12
; a1=(data-a3*100-a2*10);
	lds R2,_a3
	ldi R24,100
	mul R24,R2
	mov R2,R10
	sub R2,R0
	mov R3,R16
	ldi R24,10
	mul R24,R3
	sub R2,R0
	sts _a1,R2
	.dbline -2
L32:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r data 10 c
	.dbend
	.dbfunc e disp _disp fV
;             bb -> R12,R13
;             aa -> R10
	.even
_disp::
	xcall push_xgset003C
	mov R10,R16
	.dbline -1
	.dbline 16
; }
; 
; void disp(uchar aa)
; {
	.dbline 17
; uint bb=0;
	clr R12
	clr R13
	.dbline 18
; DDRA=0xff;      //初始化端口A
	ldi R24,255
	out 0x1a,R24
	.dbline 19
; PORTA=0xff;
	out 0x1b,R24
	.dbline 20
; 	  disa(aa);//提取aa的各位
	mov R16,R10
	xcall _disa
	.dbline 21
;       sendbyte(a1);//数码管1
	lds R16,_a1
	xcall _sendbyte
	.dbline 22
; 	  PORTA&=~(1<<ls138a);
	cbi 0x1b,7
	.dbline 23
; 	  PORTA&=~(1<<ls138b);
	cbi 0x1b,6
	.dbline 24
; 	  PORTA&=~(1<<ls138c);
	cbi 0x1b,5
	.dbline 25
; 	  s_ms(600);             
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 26
; 	  sendbyte(a2);//数码管2
	lds R16,_a2
	xcall _sendbyte
	.dbline 27
; 	  PORTA|=(1<<ls138a);
	sbi 0x1b,7
	.dbline 28
; 	  PORTA&=~(1<<ls138b);
	cbi 0x1b,6
	.dbline 29
; 	  PORTA&=~(1<<ls138c);
	cbi 0x1b,5
	.dbline 30
; 	  s_ms(600);       
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 31
; 	  sendbyte(a3);//数码管3
	lds R16,_a3
	xcall _sendbyte
	.dbline 32
; 	  PORTA&=~(1<<ls138a);
	cbi 0x1b,7
	.dbline 33
; 	  PORTA|=(1<<ls138b);
	sbi 0x1b,6
	.dbline 34
; 	  PORTA&=~(1<<ls138c);
	cbi 0x1b,5
	.dbline 35
; 	  s_ms(600); 
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 36
; 	  sendbyte(0);//数码管4
	clr R16
	xcall _sendbyte
	.dbline 37
; 	  PORTA|=(1<<ls138a);
	sbi 0x1b,7
	.dbline 38
; 	  PORTA|=(1<<ls138b);
	sbi 0x1b,6
	.dbline 39
; 	  PORTA&=~(1<<ls138c);
	cbi 0x1b,5
	.dbline 40
; 	  s_ms(600); 
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 41
; 	  sendbyte(0);//数码管5
	clr R16
	xcall _sendbyte
	.dbline 42
; 	  PORTA&=~(1<<ls138a);
	cbi 0x1b,7
	.dbline 43
; 	  PORTA&=~(1<<ls138b);
	cbi 0x1b,6
	.dbline 44
; 	  PORTA|=(1<<ls138c);
	sbi 0x1b,5
	.dbline 45
; 	  s_ms(600); 
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 46
; 	  sendbyte(0);//数码管6
	clr R16
	xcall _sendbyte
	.dbline 47
; 	  PORTA|=(1<<ls138a);
	sbi 0x1b,7
	.dbline 48
; 	  PORTA&=~(1<<ls138b);
	cbi 0x1b,6
	.dbline 49
; 	  PORTA|=(1<<ls138c);
	sbi 0x1b,5
	.dbline 50
; 	  s_ms(600); 
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 51
; 	  sendbyte(0);//数码管7
	clr R16
	xcall _sendbyte
	.dbline 52
; 	  PORTA&=~(1<<ls138a);
	cbi 0x1b,7
	.dbline 53
; 	  PORTA|=(1<<ls138b);
	sbi 0x1b,6
	.dbline 54
; 	  PORTA|=(1<<ls138c);
	sbi 0x1b,5
	.dbline 55
; 	  s_ms(600); 
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline 56
; 	  sendbyte(0);//数码管8
	clr R16
	xcall _sendbyte
	.dbline 57
; 	  PORTA|=(1<<ls138a);
	sbi 0x1b,7
	.dbline 58
; 	  PORTA|=(1<<ls138b);
	sbi 0x1b,6
	.dbline 59
; 	  PORTA|=(1<<ls138c);
	sbi 0x1b,5
	.dbline 60
; 	  s_ms(600);
	ldi R16,600
	ldi R17,2
	xcall _s_ms
	.dbline -2
L33:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r bb 12 i
	.dbsym r aa 10 c
	.dbend
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\4x4key_main.c
	.dbfunc e turn _turn fI
;            key -> R16
	.even
_turn::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 17
	.dbline 18
	mov R20,R16
	clr R21
	cpi R20,33
	ldi R30,0
	cpc R21,R30
	brne X33
	xjmp L39
X33:
X15:
	cpi R20,34
	ldi R30,0
	cpc R21,R30
	brne X34
	xjmp L43
X34:
X16:
	cpi R20,36
	ldi R30,0
	cpc R21,R30
	brne X35
	xjmp L47
X35:
X17:
	cpi R20,40
	ldi R30,0
	cpc R21,R30
	brne X36
	xjmp L51
X36:
X18:
	ldi R24,40
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L55
X19:
L54:
	cpi R20,17
	ldi R30,0
	cpc R21,R30
	brne X37
	xjmp L38
X37:
X20:
	cpi R20,18
	ldi R30,0
	cpc R21,R30
	brne X38
	xjmp L42
X38:
X21:
	cpi R20,20
	ldi R30,0
	cpc R21,R30
	brne X39
	xjmp L46
X39:
X22:
	cpi R20,24
	ldi R30,0
	cpc R21,R30
	brne X40
	xjmp L50
X40:
X23:
	xjmp L35
L55:
	cpi R20,65
	ldi R30,0
	cpc R21,R30
	breq L40
X24:
	cpi R20,66
	ldi R30,0
	cpc R21,R30
	breq L44
X25:
	cpi R20,68
	ldi R30,0
	cpc R21,R30
	breq L48
X26:
	cpi R20,72
	ldi R30,0
	cpc R21,R30
	brne X41
	xjmp L52
X41:
X27:
	cpi R20,65
	ldi R30,0
	cpc R21,R30
	brge X42
	xjmp L35
X42:
X28:
L56:
	cpi R20,129
	ldi R30,0
	cpc R21,R30
	breq L41
X29:
	cpi R20,130
	ldi R30,0
	cpc R21,R30
	breq L45
X30:
	cpi R20,132
	ldi R30,0
	cpc R21,R30
	breq L49
X31:
	cpi R20,136
	ldi R30,0
	cpc R21,R30
	breq L53
X32:
	xjmp L35
L38:
	.dbline 21
	ldi R16,1
	.dbline 21
	xjmp L36
L39:
	.dbline 23
	ldi R16,2
	.dbline 23
	xjmp L36
L40:
	.dbline 25
	ldi R16,3
	.dbline 25
	xjmp L36
L41:
	.dbline 27
	ldi R16,4
	.dbline 27
	xjmp L36
L42:
	.dbline 29
	ldi R16,5
	.dbline 29
	xjmp L36
L43:
	.dbline 31
	ldi R16,6
	.dbline 31
	xjmp L36
L44:
	.dbline 33
	ldi R16,7
	.dbline 33
	xjmp L36
L45:
	.dbline 35
	ldi R16,8
	.dbline 35
	xjmp L36
L46:
	.dbline 37
;   case 0x14:
;   key=0x09;break;
	ldi R16,9
	.dbline 37
	xjmp L36
L47:
	.dbline 39
;   case 0x24:
;   key=0x0a;break;
	ldi R16,10
	.dbline 39
	xjmp L36
L48:
	.dbline 41
;   case 0x44:
;   key=0x0b;break;
	ldi R16,11
	.dbline 41
	xjmp L36
L49:
	.dbline 43
;   case 0x84:
;   key=0x0c;break;
	ldi R16,12
	.dbline 43
	xjmp L36
L50:
	.dbline 45
;   case 0x18:
;   key=0x0d;break;
	ldi R16,13
	.dbline 45
	xjmp L36
L51:
	.dbline 47
;   case 0x28:
;   key=0x0e;break;
	ldi R16,14
	.dbline 47
	xjmp L36
L52:
	.dbline 49
;   case 0x48:
;   key=0xa0f;break;
	ldi R16,15
	.dbline 49
	xjmp L36
L53:
	.dbline 51
;   case 0x88:
;   key=0x10;break;
	ldi R16,16
	.dbline 51
L35:
L36:
	.dbline 53
;   }
;   return(key);
	clr R17
	.dbline -2
L34:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r key 16 c
	.dbend
	.dbfunc e main _main fI
;            tem -> R10
;            key -> R12
	.even
_main::
	.dbline -1
	.dbline 58
; }
; 
; //主函数
; main()
; {
	.dbline 61
; uchar key,tem;
; //端口初始化
; DDRA=0xff;
	ldi R24,255
	out 0x1a,R24
	.dbline 62
; PORTA=0xff;
	out 0x1b,R24
	.dbline 63
; DDRC=0xff;
	out 0x14,R24
	.dbline 64
; PORTC=0xff;
	out 0x15,R24
	.dbline 65
; DDRE=0x00;
	clr R2
	out 0x2,R2
	.dbline 66
; PORTE=0xff;
	out 0x3,R24
	.dbline 67
; DDRF=0xfc;
	ldi R24,252
	sts 97,R24
	xjmp L59
L58:
	.dbline 69
; while(1)
;      {
	.dbline 70
; 	 key=key_value();    //读取键值
	xcall _key_value
	mov R12,R16
	.dbline 71
; 	 if(key!=0)
	tst R16
	breq L61
X43:
	.dbline 72
; 	   {
	.dbline 73
; 	    tem=turn(key);   //转换译码
	xcall _turn
	mov R10,R16
	.dbline 74
; 	   }
L61:
	.dbline 75
; 	 disp(tem);         //显示键值
	mov R16,R10
	xcall _disp
	.dbline 76
; 	 }
L59:
	.dbline 68
	xjmp L58
X44:
	.dbline -2
L57:
	.dbline 0 ; func end
	ret
	.dbsym r tem 10 c
	.dbsym r key 12 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\产品\开发板\光盘\16实验程序\4x4键盘\4x4key_main.c
_a3::
	.blkb 1
	.dbsym e a3 _a3 c
_a2::
	.blkb 1
	.dbsym e a2 _a2 c
_a1::
	.blkb 1
	.dbsym e a1 _a1 c
; }

⌨️ 快捷键说明

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