📄 16按键.s
字号:
.module _16按键.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.dbfunc e DelayUS _DelayUS fV
; time -> R16,R17
.even
_DelayUS::
.dbline -1
.dbline 9
; //内部晶振 8M
; //包含所需头文件
; #include <ioM16v.h>
; #include <macros.h>
; #include"delay.h"
;
;
;
; /*------宏定义------*/
xjmp L3
L2:
.dbline 11
subi R16,1
sbci R17,0
L3:
.dbline 10
; #define uchar unsigned char
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e DelayMS _DelayMS fV
; i -> R20,R21
; time -> R16,R17
.even
_DelayMS::
xcall push_gset1
.dbline -1
.dbline 20
; #define uint unsigned int
;
; uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
; 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管段位
; uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选
; uchar key_board[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,
; 0xb7,0xbb,0xbd,0xbe,0x77,0x7b,0x7d,0x7e}; //按键键值
; uchar anjianzhi;
; //端口初始化
; void port_init(void)
xjmp L7
L6:
.dbline 23
; {
; PORTA = 0x00;//A口数据置0
; DDRA = 0xFF;//A口方向设为输出
.dbline 24
; PORTB = 0x00;//B口数据置0
ldi R20,1
ldi R21,0
xjmp L12
L9:
.dbline 25
L10:
.dbline 24
subi R20,255 ; offset = 1
sbci R21,255
L12:
.dbline 24
cpi R20,118
ldi R30,4
cpc R21,R30
brlo L9
.dbline 26
L7:
.dbline 22
movw R2,R16
subi R16,1
sbci R17,0
tst R2
brne L6
tst R3
brne L6
X0:
.dbline -2
L5:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r time 16 i
.dbend
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
_led_date::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 136,131
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 198,161
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.blkb 2
.area idata
.byte 134,142
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键/delay.h
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.dbsym e led_date _led_date A[16:16]c
_led_seg::
.blkb 2
.area idata
.byte 254,253
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 251,247
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 239,223
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 191,127
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.dbsym e led_seg _led_seg A[8:8]c
_key_board::
.blkb 2
.area idata
.byte 231,235
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 237,238
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 215,219
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 221,222
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 183,187
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 189,190
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 'w,123
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.blkb 2
.area idata
.byte 125,126
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.dbsym e key_board _key_board A[16:16]c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 21
.dbline 22
clr R2
out 0x1b,R2
.dbline 23
ldi R24,255
out 0x1a,R24
.dbline 24
out 0x18,R2
.dbline 25
; DDRB = 0xFF;//B口方向设为输出
out 0x17,R24
.dbline 26
; PORTC = 0xFF;
out 0x15,R24
.dbline 27
; DDRC = 0xFF;
out 0x14,R24
.dbline 28
; PORTD = 0xFF;
out 0x12,R24
.dbline 29
; DDRD = 0xFF;
out 0x11,R24
.dbline -2
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 34
; }
;
;
; void init_devices(void)
; {
.dbline 35
; CLI(); //禁止所有中断
cli
.dbline 36
; MCUCR = 0x00;//外部中断触发方式
clr R2
out 0x35,R2
.dbline 37
; MCUCSR = 0x80;//禁止JTAG
ldi R24,128
out 0x34,R24
.dbline 38
; GICR = 0x00;//外部中断使能
out 0x3b,R2
.dbline 39
; port_init();
xcall _port_init
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e keyboard _keyboard fc
; i -> R20
; key -> R20
; b -> R22
; a -> R10
.even
_keyboard::
xcall push_gset3
.dbline -1
.dbline 43
; //SEI();//开全局中断
; }
; uchar keyboard(void) //读取键盘
; {
.dbline 44
; uchar i=0;
clr R20
.dbline 45
; uchar a=0;
clr R10
.dbline 46
; uchar b=0;
clr R22
.dbline 47
; uchar key=0;
.dbline 48
; DDRC=0x0f;//D口前四位输入,后四位输出
ldi R24,15
out 0x14,R24
.dbline 50
; //DelayUS(10);
; PORTC=0xf0;//D口前四位置1,后四位置0
ldi R24,240
out 0x15,R24
.dbline 51
; DelayUS(10);
ldi R16,10
ldi R17,0
xcall _DelayUS
.dbline 52
; a=PINC&0xf0; //读取D口前四位数值
in R24,0x13
andi R24,240
mov R10,R24
.dbline 53
; DDRC=0xf0;//D口前四位输出,后四位输入
ldi R24,240
out 0x14,R24
.dbline 55
; //DelayUS(10);
; PORTC=0x0f;//D口后四位置1,前四位置0
ldi R24,15
out 0x15,R24
.dbline 56
; DelayUS(10);
ldi R16,10
ldi R17,0
xcall _DelayUS
.dbline 57
; b=PINC&0x0f; //读取D口后四位数值
in R22,0x13
andi R22,15
.dbline 58
; key=a+b;//D口八位数据赋予key
mov R20,R10
add R20,R22
.dbline 59
; return key;
mov R16,R20
.dbline -2
L15:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r key 20 c
.dbsym r b 22 c
.dbsym r a 10 c
.dbend
.dbfunc e jianzhi _jianzhi fV
; m2 -> R10
; m1 -> R20
; i -> R22
.even
_jianzhi::
xcall push_gset3
.dbline -1
.dbline 62
; }
; void jianzhi(void)//取得键值
; {
.dbline 63
; uchar m1,m2,i=0;
clr R22
.dbline 64
; if (keyboard()!=0xff)
xcall _keyboard
cpi R16,255
breq L17
.dbline 65
; {
.dbline 66
; m1=keyboard();//调用读取键盘程序
xcall _keyboard
mov R20,R16
.dbline 67
; DelayMS(10);
ldi R16,10
ldi R17,0
xcall _DelayMS
.dbline 68
; m2=keyboard();//调用两次
xcall _keyboard
mov R10,R16
.dbline 69
; if (m1==m2)
cp R20,R16
brne L19
.dbline 70
; {
.dbline 71
; for (i=0;i<16;i++)
xjmp L24
L21:
.dbline 72
; {
.dbline 73
; if (m1==key_board[i])//循环判断读取数值与按键键值是否相同
ldi R24,<_key_board
ldi R25,>_key_board
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
cp R20,R2
brne L25
.dbline 74
; {
.dbline 75
; anjianzhi=i;//数值赋予变量
sts _anjianzhi,R22
.dbline 76
; }
L25:
.dbline 77
L22:
.dbline 71
inc R22
L24:
.dbline 71
cpi R22,16
brlo L21
.dbline 78
; }
; }
L19:
.dbline 79
L17:
.dbline -2
L16:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r m2 10 c
.dbsym r m1 20 c
.dbsym r i 22 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 83
; }
; }
; //主函数
; void main(void)
; {
.dbline 84
; init_devices();
xcall _init_devices
xjmp L29
L28:
.dbline 87
.dbline 89
xcall _jianzhi
.dbline 90
ldi R24,<_led_date
ldi R25,>_led_date
lds R30,_anjianzhi
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 91
ldi R24,254
out 0x18,R24
.dbline 92
ldi R16,100
ldi R17,0
xcall _DelayMS
.dbline 94
L29:
.dbline 86
xjmp L28
X1:
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
_anjianzhi::
.blkb 1
.dbsym e anjianzhi _anjianzhi c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -