📄 4x4key_main.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 + -