📄 keyscan.s
字号:
.module KeyScan.c
.area text(rom, con, rel)
.dbfile F:\job\M16学习板\按键实验(实验二)\KeyScan.c
.dbfile F:\job\M16学习板\按键实验(实验二)\..\ICC_H\SOFTWARE.h
.dbfunc e ChangeIntToHex _ChangeIntToHex fV
; dec -> R20,R21
.even
_ChangeIntToHex::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 136
; /*******************************************************************
; 实验二
; 实验名称: 键盘扫描实验
; 实验目的: 进一步了解AVR单片机端口的操作,加深对AVR单片机端口寄存器的
; 理解
; 实验现象: 按键按下对应的LED发亮
; 环 境: ICCAVR6.31A
; 设 计 者: shinea8868
; 说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
; 作商业用途请保留本段文字
; 完成日期: 2007年4月9日
; *******************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include "..\ICC_H\SOFTWARE.h"
;
; /*-----------------------------------------------------------------
; 延时程序计算方法
; 计数个数j = 延时时间/6*晶振频率 - 1
; 函数名称: void DelayMs(uchar i)
; 函数功能: 毫秒延时
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void DelayMs(uchar i)
; {
; uchar j;
; while(i--)
; {
; j = 167;//1mhz 1ms延时
; while(j--);
; }
; }
;
; /*-----------------------------------------------------------------
; 函数名称: void KeyScan(void)
; 函数功能: 键盘扫描程序
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void KeyScan(void)
; {
; uchar KeyNum = 0; //用来存放按键信息
; DDRA = 0xff; //置端口A为输出
; PORTA = 0xff; //全部输出为高电平
; DelayMs(1); //延时一段时间
; DDRA = 0x00; //置端口A为输入
; if( PINA != 0xff) //是否有按键按下
; DelayMs(1); //延时去抖动
;
; DDRA = 0xff; //置端口A为输出
; PORTA = 0xff; //全部输出为高电平
; DelayMs(1); //延时一段时间
; DDRA = 0x00; //置端口A为输入
; if( PINA != 0xff) //是否有按键按下
; { //确实有按键按下
; switch (PINA & 0xff)//判断是哪个按键按下
; {
; case 0b11111110: KeyNum = 1;break;
; case 0b11111101: KeyNum = 2;break;
; case 0b11111011: KeyNum = 3;break;
; case 0b11110111: KeyNum = 4;break;
; case 0b11101111: KeyNum = 5;break;
; case 0b11011111: KeyNum = 6;break;
; case 0b10111111: KeyNum = 7;break;
; case 0b01111111: KeyNum = 8;break;
; default: break;
; }
;
; while(PINA != 0xff)
; {
; DDRB = 0xff;
; PORTB&= ~(1<<(KeyNum-1));//显示对应的发光二极管
; DDRA = 0xff; //置端口A为输出
; PORTA = 0xff; //全部输出为高电平
; DelayMs(1); //延时一段时间
; DDRA = 0x00;
; }
; DDRB = 0xff; //设为输出
; PORTB = 0xff; //灭所有的二极管
; }
;
; }
; /*-----------------------------------------------------------------
; 函数名称: void main(void)
; 函数功能:
; 参 数:
; 返 回 值: 无
; -----------------------------------------------------------------*/
; void main(void)
; {
; DDRB = 0xff;
; PORTB = 0xff;
; while(1)
; {
; DelayMs(200);
; KeyScan();
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
.dbline 137
; }
movw R30,R20
ldd R2,z+0
clr R3
ldi R17,10
mov R16,R2
xcall mod8u
mov R4,R16
ldi R17,10
mov R16,R2
xcall div8u
mov R24,R16
andi R24,#0x0F
swap R24
or R24,R4
movw R30,R20
std z+0,R24
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r dec 20 pc
.dbend
.dbfunc e ChangeHexToInt _ChangeHexToInt fV
; hex -> R16,R17
.even
_ChangeHexToInt::
.dbline -1
.dbline 166
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
.dbline 167
; }
movw R30,R16
ldd R2,z+0
clr R3
mov R24,R2
swap R24
andi R24,#0x0F
ldi R25,10
mul R25,R24
mov R24,R2
andi R24,15
mov R2,R0
add R2,R24
std z+0,R2
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r hex 16 pc
.dbend
.dbfunc e Delay _Delay fV
; i -> R16
.even
_Delay::
.dbline -1
.dbline 180
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
.dbline 182
; }
; }
ldi R16,200
L4:
.dbline 183
L5:
.dbline 183
; }
mov R2,R16
clr R3
subi R16,1
tst R2
brne L4
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfile F:\job\M16学习板\按键实验(实验二)\KeyScan.c
.dbfunc e DelayMs _DelayMs fV
; j -> R20
; i -> R16
.even
_DelayMs::
xcall push_gset1
.dbline -1
.dbline 26
xjmp L9
L8:
.dbline 29
.dbline 30
ldi R20,167
L11:
.dbline 31
L12:
.dbline 31
mov R2,R20
clr R3
subi R20,1
tst R2
brne L11
.dbline 32
L9:
.dbline 28
mov R2,R16
clr R3
subi R16,1
tst R2
brne L8
.dbline -2
L7:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r i 16 c
.dbend
.dbfunc e KeyScan _KeyScan fV
; KeyNum -> R20
.even
_KeyScan::
xcall push_gset2
.dbline -1
.dbline 42
.dbline 43
clr R20
.dbline 44
ldi R24,255
out 0x1a,R24
.dbline 45
out 0x1b,R24
.dbline 46
ldi R16,1
xcall _DelayMs
.dbline 47
clr R2
out 0x1a,R2
.dbline 48
in R24,0x19
cpi R24,255
breq L15
.dbline 49
ldi R16,1
xcall _DelayMs
L15:
.dbline 51
ldi R24,255
out 0x1a,R24
.dbline 52
out 0x1b,R24
.dbline 53
ldi R16,1
xcall _DelayMs
.dbline 54
clr R2
out 0x1a,R2
.dbline 55
in R24,0x19
cpi R24,255
brne X1
xjmp L17
X1:
.dbline 56
.dbline 57
in R22,0x19
clr R23
andi R23,0
cpi R22,223
ldi R30,0
cpc R23,R30
brne X2
xjmp L27
X2:
ldi R24,223
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L31
L30:
cpi R22,127
ldi R30,0
cpc R23,R30
breq L29
cpi R22,127
ldi R30,0
cpc R23,R30
brge X3
xjmp L35
X3:
L32:
cpi R22,191
ldi R30,0
cpc R23,R30
breq L28
xjmp L35
L31:
cpi R22,239
ldi R30,0
cpc R23,R30
breq L26
cpi R22,239
ldi R30,0
cpc R23,R30
brlt L35
L33:
cpi R22,247
ldi R30,0
cpc R23,R30
breq L25
cpi R22,251
ldi R30,0
cpc R23,R30
breq L24
cpi R22,253
ldi R30,0
cpc R23,R30
breq L23
cpi R22,254
ldi R30,0
cpc R23,R30
breq L22
xjmp L35
X0:
.dbline 58
L22:
.dbline 59
ldi R20,1
.dbline 59
xjmp L35
L23:
.dbline 60
ldi R20,2
.dbline 60
xjmp L35
L24:
.dbline 61
ldi R20,3
.dbline 61
xjmp L35
L25:
.dbline 62
ldi R20,4
.dbline 62
xjmp L35
L26:
.dbline 63
ldi R20,5
.dbline 63
xjmp L35
L27:
.dbline 64
ldi R20,6
.dbline 64
xjmp L35
L28:
.dbline 65
ldi R20,7
.dbline 65
xjmp L35
L29:
.dbline 66
ldi R20,8
.dbline 66
.dbline 67
xjmp L35
L34:
.dbline 71
.dbline 72
ldi R24,255
out 0x17,R24
.dbline 73
mov R17,R20
subi R17,1
ldi R16,1
xcall lsl8
mov R2,R16
com R2
in R3,0x18
and R3,R2
out 0x18,R3
.dbline 74
ldi R24,255
out 0x1a,R24
.dbline 75
out 0x1b,R24
.dbline 76
ldi R16,1
xcall _DelayMs
.dbline 77
clr R2
out 0x1a,R2
.dbline 78
L35:
.dbline 70
in R24,0x19
cpi R24,255
brne L34
.dbline 79
ldi R24,255
out 0x17,R24
.dbline 80
out 0x18,R24
.dbline 81
L17:
.dbline -2
L14:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r KeyNum 20 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 91
.dbline 92
ldi R24,255
out 0x17,R24
.dbline 93
out 0x18,R24
xjmp L39
L38:
.dbline 95
.dbline 96
ldi R16,200
xcall _DelayMs
.dbline 97
xcall _KeyScan
.dbline 98
L39:
.dbline 94
xjmp L38
X4:
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -