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

📄 key.lst

📁 我自己编写的atmega16的4*4键盘程序
💻 LST
字号:
__text_start:
__start:
    0032 E5CF      LDI	R28,0x5F
    0033 E0D4      LDI	R29,4
    0034 BFCD      OUT	0x3D,R28
    0035 BFDE      OUT	0x3E,R29
    0036 51C0      SUBI	R28,0x10
    0037 40D0      SBCI	R29,0
    0038 EA0A      LDI	R16,0xAA
    0039 8308      STD	Y+0,R16
    003A 2400      CLR	R0
    003B E7E0      LDI	R30,0x70
    003C E0F0      LDI	R31,0
    003D E010      LDI	R17,0
    003E 37E0      CPI	R30,0x70
    003F 07F1      CPC	R31,R17
    0040 F011      BEQ	0x0043
    0041 9201      ST	R0,Z+
    0042 CFFB      RJMP	0x003E
    0043 8300      STD	Z+0,R16
    0044 E5E4      LDI	R30,0x54
    0045 E0F0      LDI	R31,0
    0046 E6A0      LDI	R26,0x60
    0047 E0B0      LDI	R27,0
    0048 E010      LDI	R17,0
    0049 36E4      CPI	R30,0x64
    004A 07F1      CPC	R31,R17
    004B F021      BEQ	0x0050
    004C 95C8      LPM
    004D 9631      ADIW	R30,1
    004E 920D      ST	R0,X+
    004F CFF9      RJMP	0x0049
    0050 940E00ED  CALL	_main
_exit:
    0052 CFFF      RJMP	_exit
FILE: F:\自编程序\M16\4-4keyboard\UART.C
(0001) #include <iom16v.h> 
(0002) #pragma interrupt_handler	USART_Recive_Complete_handler:12
(0003) #pragma interrupt_handler	USART_Data_Register_Empty_handler:13
(0004) #pragma interrupt_handler	USART_Transmit_Complete_handler:14
(0005) void USART_Init(void)
(0006) {
(0007)  //{{WIZARD_MAP(UART)
(0008)     // crystal: 8M
(0009) 	// Baud Rate: 9600
(0010) 	// Character Size: 8-bit
(0011) 	// Mode: Asynchronous
(0012) 	// Parity: Disabled
(0013) 	// Stop Bit: 1-bit
(0014) 	UBRRL = 0x33;
_USART_Init:
    0053 E383      LDI	R24,0x33
    0054 B989      OUT	0x09,R24
(0015) 	UBRRH = 0x00;
    0055 2422      CLR	R2
    0056 BC20      OUT	0x20,R2
(0016) 	UCSRA = 0x00;
    0057 B82B      OUT	0x0B,R2
(0017) 	UCSRC = 0x86;
    0058 E886      LDI	R24,0x86
    0059 BD80      OUT	0x20,R24
(0018) 	UCSRB = 0x18;
    005A E188      LDI	R24,0x18
    005B B98A      OUT	0x0A,R24
(0019) 	//UCSRB|=0X80;//开接收结束中断
(0020) 	//UCSRB|=0X40;//开发送结束中断
(0021)     //UCSRB|=0X20;//开数据寄存器空中断
(0022) }
    005C 9508      RET
(0023) void USART_Transmit(unsigned char data)
(0024) {
(0025)    /* 等待发送缓冲器为空 */
(0026)    while ( !( UCSRA & (1<<UDRE)) );
_USART_Transmit:
  data                 --> R16
    005D 9B5D      SBIS	0x0B,5
    005E CFFE      RJMP	_USART_Transmit
(0027)   /* 将数据放入缓冲器,发送数据 */
(0028)   UDR = data;
    005F B90C      OUT	0x0C,R16
(0029) }
    0060 9508      RET
(0030) unsigned char USART_Recive(void)
(0031) {
(0032)  	/* 等待接收数据*/
(0033) 	while ( !(UCSRA & (1<<RXC)) );
_USART_Recive:
    0061 9B5F      SBIS	0x0B,7
    0062 CFFE      RJMP	_USART_Recive
(0034) 	/* 从缓冲器中获取并返回数据*/
(0035) 	return UDR;
    0063 B10C      IN	R16,0x0C
    0064 9508      RET
(0036) }
(0037) void USART_Recive_Complete_handler(void)
(0038) {
(0039) 
(0040) }
_USART_Recive_Complete_handler:
    0065 9518      RETI
(0041) void USART_Data_Register_Empty_handler(void)
(0042) {
(0043) 
(0044) }void USART_Transmit_Complete_handler(void)
_USART_Data_Register_Empty_handler:
    0066 9518      RETI
(0045) {
(0046) 
(0047) }
_USART_Transmit_Complete_handler:
    0067 9518      RETI
_INT0_TURNLOW_handler:
  i                    --> R20
  ScanCode             --> R22
  j                    --> R10
    0068 940E0121  CALL	push_lset
    006A 940E011D  CALL	push_gset3
FILE: F:\自编程序\M16\4-4keyboard\key.c
(0001) #include <iom16v.h> 
(0002) #include <macros.h> 
(0003) 
(0004) //键盘接口
(0005) #define KEYDDR  DDRB  
(0006) #define KEYPORT PORTB 
(0007) #define KEYPIN PINB
(0008) //键盘接口
(0009) 
(0010) unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
(0011) 
(0012) /**************INT0处理函数 start*******************/
(0013) /**************
(0014)          捕捉键盘输入中断进行处理
(0015)                                 *******************/
(0016) #pragma interrupt_handler	INT0_TURNLOW_handler:2
(0017) void INT0_TURNLOW_handler(void)
(0018)  {  
(0019)    unsigned char i,j,ScanCode;
(0020)    ScanCode=0x01;
    006C E061      LDI	R22,1
(0021)    CLI();
    006D 94F8      BCLR	7
(0022)    for(i=0;i<4;i++)
    006E 2744      CLR	R20
    006F C015      RJMP	0x0085
(0023)     {
(0024)         KEYPORT=ScanCode;for(j=0;j<10;j++);
    0070 BB68      OUT	0x18,R22
    0071 24AA      CLR	R10
    0072 C001      RJMP	0x0074
    0073 94A3      INC	R10
    0074 2D8A      MOV	R24,R10
    0075 308A      CPI	R24,0xA
    0076 F3E0      BCS	0x0073
(0025)         if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
    0077 B386      IN	R24,0x16
    0078 7F80      ANDI	R24,0xF0
    0079 F049      BEQ	0x0083
    007A B326      IN	R18,0x16
    007B 2733      CLR	R19
    007C 7F20      ANDI	R18,0xF0
    007D 7030      ANDI	R19,0
    007E 2F06      MOV	R16,R22
    007F 2711      CLR	R17
    0080 D014      RCALL	_keycode
    0081 940E005D  CALL	_USART_Transmit
(0026) 	    ScanCode<<=1;
    0083 0F66      LSL	R22
    0084 9543      INC	R20
    0085 3044      CPI	R20,4
    0086 F348      BCS	0x0070
(0027)      }
(0028)    for(j=0;j<200;j++);//消抖
    0087 24AA      CLR	R10
    0088 C001      RJMP	0x008A
    0089 94A3      INC	R10
    008A 2D8A      MOV	R24,R10
    008B 3C88      CPI	R24,0xC8
    008C F3E0      BCS	0x0089
(0029)    SEI();
    008D 9478      BSET	7
(0030)    KEYPORT=0X0F; 
    008E E08F      LDI	R24,0xF
    008F BB88      OUT	0x18,R24
(0031)   }
    0090 940E00FF  CALL	pop_gset3
    0092 940E0138  CALL	pop_lset
    0094 9518      RETI
_keycode:
  temp                 --> R20
  line                 --> R18
  row                  --> R16
    0095 940E0119  CALL	push_gset2
(0032) /**************INT0处理函数 end*******************/
(0033) /**************解码函数 start*******************/
(0034) unsigned keycode(unsigned char row,unsigned char line)
(0035) {
(0036)   unsigned char temp;
(0037)   switch(row) //行值处理
    0097 2F40      MOV	R20,R16
    0098 2755      CLR	R21
    0099 3041      CPI	R20,1
    009A E0E0      LDI	R30,0
    009B 075E      CPC	R21,R30
    009C F069      BEQ	0x00AA
    009D 3042      CPI	R20,2
    009E E0E0      LDI	R30,0
    009F 075E      CPC	R21,R30
    00A0 F059      BEQ	0x00AC
    00A1 3044      CPI	R20,4
    00A2 E0E0      LDI	R30,0
    00A3 075E      CPC	R21,R30
    00A4 F049      BEQ	0x00AE
    00A5 3048      CPI	R20,0x8
    00A6 E0E0      LDI	R30,0
    00A7 075E      CPC	R21,R30
    00A8 F039      BEQ	0x00B0
    00A9 C007      RJMP	0x00B1
(0038)    {
(0039)      case 0x01:temp=0x00;break;
    00AA 2744      CLR	R20
    00AB C005      RJMP	0x00B1
(0040)   	 case 0x02:temp=0x04;break;
    00AC E044      LDI	R20,4
    00AD C003      RJMP	0x00B1
(0041)  	 case 0x04:temp=0x08;break;
    00AE E048      LDI	R20,0x8
    00AF C001      RJMP	0x00B1
(0042)      case 0x08:temp=0x0c;break;
    00B0 E04C      LDI	R20,0xC
(0043)    }
(0044)    switch(line) //列值处理
    00B1 2F62      MOV	R22,R18
    00B2 2777      CLR	R23
    00B3 3260      CPI	R22,0x20
    00B4 E0E0      LDI	R30,0
    00B5 077E      CPC	R23,R30
    00B6 F0C1      BEQ	0x00CF
    00B7 E280      LDI	R24,0x20
    00B8 E090      LDI	R25,0
    00B9 1786      CP	R24,R22
    00BA 0797      CPC	R25,R23
    00BB F02C      BLT	0x00C1
    00BC 3160      CPI	R22,0x10
    00BD E0E0      LDI	R30,0
    00BE 077E      CPC	R23,R30
    00BF F071      BEQ	0x00CE
    00C0 C013      RJMP	0x00D4
    00C1 3460      CPI	R22,0x40
    00C2 E0E0      LDI	R30,0
    00C3 077E      CPC	R23,R30
    00C4 F061      BEQ	0x00D1
    00C5 3460      CPI	R22,0x40
    00C6 E0E0      LDI	R30,0
    00C7 077E      CPC	R23,R30
    00C8 F05C      BLT	0x00D4
    00C9 3860      CPI	R22,0x80
    00CA E0E0      LDI	R30,0
    00CB 077E      CPC	R23,R30
    00CC F031      BEQ	0x00D3
    00CD C006      RJMP	0x00D4
(0045)    {
(0046)      case 0x10:temp+=0x00;break;
    00CE C005      RJMP	0x00D4
(0047)   	 case 0x20:temp+=0x01;break;
    00CF 9543      INC	R20
    00D0 C003      RJMP	0x00D4
(0048)  	 case 0x40:temp+=0x02;break;
    00D1 5F4E      SUBI	R20,0xFE
    00D2 C001      RJMP	0x00D4
(0049)      case 0x80:temp+=0x03;break;
    00D3 5F4D      SUBI	R20,0xFD
(0050)    }
(0051)    return num[temp];
    00D4 E680      LDI	R24,0x60
    00D5 E090      LDI	R25,0
    00D6 2FE4      MOV	R30,R20
    00D7 27FF      CLR	R31
    00D8 0FE8      ADD	R30,R24
    00D9 1FF9      ADC	R31,R25
    00DA 8100      LDD	R16,Z+0
    00DB 2711      CLR	R17
    00DC 940E00FC  CALL	pop_gset2
    00DE 9508      RET
(0052) }
(0053) /**************解码函数 end*******************/
(0054) /**************键盘初始化 stat*******************/
(0055) void KEY_INI(void)//高四位输出并拉高
(0056) {
(0057)   KEYDDR = 0x0F;
_KEY_INI:
    00DF E08F      LDI	R24,0xF
    00E0 BB87      OUT	0x17,R24
(0058)   KEYPORT = 0x0F;
    00E1 BB88      OUT	0x18,R24
(0059)   
(0060)   /*************INT0初始化 start******************/
(0061)   PORTD &= 0xFB;
    00E2 B382      IN	R24,0x12
    00E3 7F8B      ANDI	R24,0xFB
    00E4 BB82      OUT	0x12,R24
(0062)   DDRD  &= 0xFB;
    00E5 B381      IN	R24,0x11
    00E6 7F8B      ANDI	R24,0xFB
    00E7 BB81      OUT	0x11,R24
(0063)   MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
    00E8 E083      LDI	R24,3
    00E9 BF85      OUT	0x35,R24
(0064)   GICR=(1<<INT0);
    00EA E480      LDI	R24,0x40
    00EB BF8B      OUT	0x3B,R24
(0065) /**************INT0初始化 end*******************/
(0066) 
(0067) } 
    00EC 9508      RET
FILE: F:\自编程序\M16\4-4keyboard\main.c
(0001) #include <iom16v.h> 
(0002) #include <macros.h> 
(0003) void main(void)
(0004) {
(0005)    unsigned char k;
(0006)    CLI(); 
_main:
  k                    --> Y+1
    00ED 94F8      BCLR	7
(0007)    PORTD = 0x00;
    00EE 2422      CLR	R2
    00EF BA22      OUT	0x12,R2
(0008)    DDRD  = 0x00;
    00F0 BA21      OUT	0x11,R2
(0009)    USART_Init();
    00F1 940E0053  CALL	_USART_Init
(0010)    KEY_INI();
    00F3 940E00DF  CALL	_KEY_INI
(0011)    SEI();
    00F5 9478      BSET	7
(0012)    USART_Transmit('t');
    00F6 E704      LDI	R16,0x74
    00F7 E010      LDI	R17,0
    00F8 940E005D  CALL	_USART_Transmit
(0013)    while(1)
    00FA CFFF      RJMP	0x00FA
(0014)    {
(0015)    }  
(0016) }
FILE: <library>
    00FB 9508      RET
pop_gset2:
    00FC E0E2      LDI	R30,2
    00FD 940C0106  JMP	pop
pop_gset3:
    00FF E0E4      LDI	R30,4
    0100 940C0106  JMP	pop
push_gset1:
    0102 935A      ST	R21,-Y
    0103 934A      ST	R20,-Y
    0104 9508      RET
pop_gset1:
    0105 E0E1      LDI	R30,1
pop:
    0106 9149      LD	R20,Y+
    0107 9159      LD	R21,Y+
    0108 FDE0      SBRC	R30,0
    0109 9508      RET
    010A 9169      LD	R22,Y+
    010B 9179      LD	R23,Y+
    010C FDE1      SBRC	R30,1
    010D 9508      RET
    010E 90A9      LD	R10,Y+
    010F 90B9      LD	R11,Y+
    0110 FDE2      SBRC	R30,2
    0111 9508      RET
    0112 90C9      LD	R12,Y+
    0113 90D9      LD	R13,Y+
    0114 FDE3      SBRC	R30,3
    0115 9508      RET
    0116 90E9      LD	R14,Y+
    0117 90F9      LD	R15,Y+
    0118 9508      RET
push_gset2:
    0119 937A      ST	R23,-Y
    011A 936A      ST	R22,-Y
    011B 940C0102  JMP	push_gset1
push_gset3:
    011D 92BA      ST	R11,-Y
    011E 92AA      ST	R10,-Y
    011F 940C0119  JMP	push_gset2
push_lset:
    0121 93FA      ST	R31,-Y
    0122 93EA      ST	R30,-Y
    0123 93BA      ST	R27,-Y
    0124 93AA      ST	R26,-Y
    0125 939A      ST	R25,-Y
    0126 938A      ST	R24,-Y
    0127 933A      ST	R19,-Y
    0128 932A      ST	R18,-Y
    0129 931A      ST	R17,-Y
    012A 930A      ST	R16,-Y
    012B 929A      ST	R9,-Y
    012C 928A      ST	R8,-Y
    012D 927A      ST	R7,-Y
    012E 926A      ST	R6,-Y
    012F 925A      ST	R5,-Y
    0130 924A      ST	R4,-Y
    0131 923A      ST	R3,-Y
    0132 922A      ST	R2,-Y
    0133 921A      ST	R1,-Y
    0134 920A      ST	R0,-Y
    0135 B60F      IN	R0,0x3F
    0136 920A      ST	R0,-Y
    0137 9508      RET
pop_lset:
    0138 9009      LD	R0,Y+
    0139 BE0F      OUT	0x3F,R0
    013A 9009      LD	R0,Y+
    013B 9019      LD	R1,Y+
    013C 9029      LD	R2,Y+
    013D 9039      LD	R3,Y+
    013E 9049      LD	R4,Y+
    013F 9059      LD	R5,Y+
    0140 9069      LD	R6,Y+
    0141 9079      LD	R7,Y+
    0142 9089      LD	R8,Y+
    0143 9099      LD	R9,Y+
    0144 9109      LD	R16,Y+
    0145 9119      LD	R17,Y+
    0146 9129      LD	R18,Y+
    0147 9139      LD	R19,Y+
    0148 9189      LD	R24,Y+
    0149 9199      LD	R25,Y+
    014A 91A9      LD	R26,Y+
    014B 91B9      LD	R27,Y+
    014C 91E9      LD	R30,Y+
    014D 91F9      LD	R31,Y+
    014E 9508      RET

⌨️ 快捷键说明

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