📄 16按键.lst
字号:
__start:
__text_start:
003E E5CF LDI R28,0x5F
003F E0D4 LDI R29,4
0040 BFCD OUT 0x3D,R28
0041 BFDE OUT 0x3E,R29
0042 51C0 SUBI R28,0x10
0043 40D0 SBCI R29,0
0044 EA0A LDI R16,0xAA
0045 8308 STD Y+0,R16
0046 2400 CLR R0
0047 E8E8 LDI R30,0x88
0048 E0F0 LDI R31,0
0049 E010 LDI R17,0
004A 38E9 CPI R30,0x89
004B 07F1 CPC R31,R17
004C F011 BEQ 0x004F
004D 9201 ST R0,Z+
004E CFFB RJMP 0x004A
004F 8300 STD Z+0,R16
0050 E5E4 LDI R30,0x54
0051 E0F0 LDI R31,0
0052 E6A0 LDI R26,0x60
0053 E0B0 LDI R27,0
0054 E010 LDI R17,0
0055 37EC CPI R30,0x7C
0056 07F1 CPC R31,R17
0057 F021 BEQ 0x005C
0058 95C8 LPM
0059 9631 ADIW R30,1
005A 920D ST R0,X+
005B CFF9 RJMP 0x0055
005C 940E00D0 CALL _main
_exit:
005E CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
005F C002 RJMP 0x0062
(0010) while(time>1)
(0011) time--;
0060 5001 SUBI R16,1
0061 4010 SBCI R17,0
0062 E081 LDI R24,1
0063 E090 LDI R25,0
0064 1780 CP R24,R16
0065 0791 CPC R25,R17
0066 F3C8 BCS 0x0060
0067 9508 RET
_DelayMS:
i --> R20
time --> R16
0068 940E00EE CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
006A C009 RJMP 0x0074
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
006B E041 LDI R20,1
006C E050 LDI R21,0
006D C002 RJMP 0x0070
006E 5F4F SUBI R20,0xFF
006F 4F5F SBCI R21,0xFF
0070 3746 CPI R20,0x76
0071 E0E4 LDI R30,4
0072 075E CPC R21,R30
0073 F3D0 BCS 0x006E
0074 0118 MOVW R2,R16
0075 5001 SUBI R16,1
0076 4010 SBCI R17,0
0077 2022 TST R2
0078 F791 BNE 0x006B
0079 2033 TST R3
007A F781 BNE 0x006B
007B 940E00F1 CALL pop_gset1
007D 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\16按键\16按键.c
(0001) //内部晶振 8M
(0002) //包含所需头文件
(0003) #include <ioM16v.h>
(0004) #include <macros.h>
(0005) #include"delay.h"
(0006)
(0007)
(0008)
(0009) /*------宏定义------*/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
(0014) 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管段位
(0015) uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数码管片选
(0016) uchar key_board[]={0xe7,0xeb,0xed,0xee,0xd7,0xdb,0xdd,0xde,
(0017) 0xb7,0xbb,0xbd,0xbe,0x77,0x7b,0x7d,0x7e}; //按键键值
(0018) uchar anjianzhi;
(0019) //端口初始化
(0020) void port_init(void)
(0021) {
(0022) PORTA = 0x00;//A口数据置0
_port_init:
007E 2422 CLR R2
007F BA2B OUT 0x1B,R2
(0023) DDRA = 0xFF;//A口方向设为输出
0080 EF8F LDI R24,0xFF
0081 BB8A OUT 0x1A,R24
(0024) PORTB = 0x00;//B口数据置0
0082 BA28 OUT 0x18,R2
(0025) DDRB = 0xFF;//B口方向设为输出
0083 BB87 OUT 0x17,R24
(0026) PORTC = 0xFF;
0084 BB85 OUT 0x15,R24
(0027) DDRC = 0xFF;
0085 BB84 OUT 0x14,R24
(0028) PORTD = 0xFF;
0086 BB82 OUT 0x12,R24
(0029) DDRD = 0xFF;
0087 BB81 OUT 0x11,R24
0088 9508 RET
(0030) }
(0031)
(0032)
(0033) void init_devices(void)
(0034) {
(0035) CLI(); //禁止所有中断
_init_devices:
0089 94F8 BCLR 7
(0036) MCUCR = 0x00;//外部中断触发方式
008A 2422 CLR R2
008B BE25 OUT 0x35,R2
(0037) MCUCSR = 0x80;//禁止JTAG
008C E880 LDI R24,0x80
008D BF84 OUT 0x34,R24
(0038) GICR = 0x00;//外部中断使能
008E BE2B OUT 0x3B,R2
(0039) port_init();
008F DFEE RCALL _port_init
0090 9508 RET
_keyboard:
i --> R20
key --> R20
b --> R22
a --> R10
0091 940E00EA CALL push_gset3
(0040) //SEI();//开全局中断
(0041) }
(0042) uchar keyboard(void) //读取键盘
(0043) {
(0044) uchar i=0;
0093 2744 CLR R20
(0045) uchar a=0;
0094 24AA CLR R10
(0046) uchar b=0;
0095 2766 CLR R22
(0047) uchar key=0;
(0048) DDRC=0x0f;//D口前四位输入,后四位输出
0096 E08F LDI R24,0xF
0097 BB84 OUT 0x14,R24
(0049) //DelayUS(10);
(0050) PORTC=0xf0;//D口前四位置1,后四位置0
0098 EF80 LDI R24,0xF0
0099 BB85 OUT 0x15,R24
(0051) DelayUS(10);
009A E00A LDI R16,0xA
009B E010 LDI R17,0
009C DFC2 RCALL _DelayUS
(0052) a=PINC&0xf0; //读取D口前四位数值
009D B383 IN R24,0x13
009E 7F80 ANDI R24,0xF0
009F 2EA8 MOV R10,R24
(0053) DDRC=0xf0;//D口前四位输出,后四位输入
00A0 EF80 LDI R24,0xF0
00A1 BB84 OUT 0x14,R24
(0054) //DelayUS(10);
(0055) PORTC=0x0f;//D口后四位置1,前四位置0
00A2 E08F LDI R24,0xF
00A3 BB85 OUT 0x15,R24
(0056) DelayUS(10);
00A4 E00A LDI R16,0xA
00A5 E010 LDI R17,0
00A6 DFB8 RCALL _DelayUS
(0057) b=PINC&0x0f; //读取D口后四位数值
00A7 B363 IN R22,0x13
00A8 706F ANDI R22,0xF
(0058) key=a+b;//D口八位数据赋予key
00A9 2D4A MOV R20,R10
00AA 0F46 ADD R20,R22
(0059) return key;
00AB 2F04 MOV R16,R20
00AC 940E00E3 CALL pop_gset3
00AE 9508 RET
_jianzhi:
m2 --> R10
m1 --> R20
i --> R22
00AF 940E00EA CALL push_gset3
(0060) }
(0061) void jianzhi(void)//取得键值
(0062) {
(0063) uchar m1,m2,i=0;
00B1 2766 CLR R22
(0064) if (keyboard()!=0xff)
00B2 DFDE RCALL _keyboard
00B3 3F0F CPI R16,0xFF
00B4 F0C1 BEQ 0x00CD
(0065) {
(0066) m1=keyboard();//调用读取键盘程序
00B5 DFDB RCALL _keyboard
00B6 2F40 MOV R20,R16
(0067) DelayMS(10);
00B7 E00A LDI R16,0xA
00B8 E010 LDI R17,0
00B9 DFAE RCALL _DelayMS
(0068) m2=keyboard();//调用两次
00BA DFD6 RCALL _keyboard
00BB 2EA0 MOV R10,R16
(0069) if (m1==m2)
00BC 1740 CP R20,R16
00BD F479 BNE 0x00CD
(0070) {
(0071) for (i=0;i<16;i++)
00BE C00C RJMP 0x00CB
(0072) {
(0073) if (m1==key_board[i])//循环判断读取数值与按键键值是否相同
00BF E788 LDI R24,0x78
00C0 E090 LDI R25,0
00C1 2FE6 MOV R30,R22
00C2 27FF CLR R31
00C3 0FE8 ADD R30,R24
00C4 1FF9 ADC R31,R25
00C5 8020 LDD R2,Z+0
00C6 1542 CP R20,R2
00C7 F411 BNE 0x00CA
(0074) {
(0075) anjianzhi=i;//数值赋予变量
00C8 93600088 STS anjianzhi,R22
00CA 9563 INC R22
00CB 3160 CPI R22,0x10
00CC F390 BCS 0x00BF
(0076) }
(0077) }
(0078) }
(0079) }
00CD 940E00E3 CALL pop_gset3
00CF 9508 RET
(0080) }
(0081) //主函数
(0082) void main(void)
(0083) {
(0084) init_devices();
_main:
00D0 DFB8 RCALL _init_devices
00D1 C00F RJMP 0x00E1
(0085)
(0086) while(1)
(0087) {
(0088)
(0089) jianzhi();//调用取得键值函数
00D2 DFDC RCALL _jianzhi
(0090) PORTA=led_date[anjianzhi];//数码管显示按键键值
00D3 E680 LDI R24,0x60
00D4 E090 LDI R25,0
00D5 91E00088 LDS R30,anjianzhi
00D7 27FF CLR R31
00D8 0FE8 ADD R30,R24
00D9 1FF9 ADC R31,R25
00DA 8020 LDD R2,Z+0
00DB BA2B OUT 0x1B,R2
(0091) PORTB=0xfe;//片选数码管
00DC EF8E LDI R24,0xFE
00DD BB88 OUT 0x18,R24
(0092) DelayMS(100);
FILE: <library>
00DE E604 LDI R16,0x64
00DF E010 LDI R17,0
00E0 DF87 RCALL _DelayMS
00E1 CFF0 RJMP 0x00D2
00E2 9508 RET
pop_gset3:
00E3 E0E4 LDI R30,4
00E4 940C00F2 JMP pop
push_gset5:
00E6 92FA ST R15,-Y
00E7 92EA ST R14,-Y
push_gset4:
00E8 92DA ST R13,-Y
00E9 92CA ST R12,-Y
push_gset3:
00EA 92BA ST R11,-Y
00EB 92AA ST R10,-Y
push_gset2:
00EC 937A ST R23,-Y
00ED 936A ST R22,-Y
push_gset1:
00EE 935A ST R21,-Y
00EF 934A ST R20,-Y
00F0 9508 RET
pop_gset1:
00F1 E0E1 LDI R30,1
pop:
00F2 9149 LD R20,Y+
00F3 9159 LD R21,Y+
00F4 FDE0 SBRC R30,0
00F5 9508 RET
00F6 9169 LD R22,Y+
00F7 9179 LD R23,Y+
00F8 FDE1 SBRC R30,1
00F9 9508 RET
00FA 90A9 LD R10,Y+
00FB 90B9 LD R11,Y+
00FC FDE2 SBRC R30,2
00FD 9508 RET
00FE 90C9 LD R12,Y+
00FF 90D9 LD R13,Y+
0100 FDE3 SBRC R30,3
0101 9508 RET
0102 90E9 LD R14,Y+
0103 90F9 LD R15,Y+
0104 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -