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

📄 3x3key.lst

📁 protues_atmeg8学习之:按键篇源代码
💻 LST
字号:
__start:
__text_start:
    0018 E5CF      LDI	R28,0x5F
    0019 E0D4      LDI	R29,4
    001A BFCD      OUT	0x3D,R28
    001B BFDE      OUT	0x3E,R29
    001C 51C0      SUBI	R28,0x10
    001D 40D0      SBCI	R29,0
    001E EA0A      LDI	R16,0xAA
    001F 8308      STD	Y+0,R16
    0020 2400      CLR	R0
    0021 E6E0      LDI	R30,0x60
    0022 E0F0      LDI	R31,0
    0023 E010      LDI	R17,0
    0024 36E0      CPI	R30,0x60
    0025 07F1      CPC	R31,R17
    0026 F011      BEQ	0x0029
    0027 9201      ST	R0,Z+
    0028 CFFB      RJMP	0x0024
    0029 8300      STD	Z+0,R16
    002A E3E0      LDI	R30,0x30
    002B E0F0      LDI	R31,0
    002C E6A0      LDI	R26,0x60
    002D E0B0      LDI	R27,0
    002E E010      LDI	R17,0
    002F 33E0      CPI	R30,0x30
    0030 07F1      CPC	R31,R17
    0031 F021      BEQ	0x0036
    0032 95C8      LPM
    0033 9631      ADIW	R30,1
    0034 920D      ST	R0,X+
    0035 CFF9      RJMP	0x002F
    0036 D0B7      RCALL	_main
_exit:
    0037 CFFF      RJMP	_exit
_delay_us:
  i                    --> R20
  n                    --> R16
    0038 D0EC      RCALL	push_gset1
FILE: F:\Learn\AVR\Pro_Mega8\KEY\3X3Key\Delay.h
(0001) 
(0002) void delay_us(unsigned int n)
(0003) {
(0004)     unsigned int i;
(0005)     for(i=n;i>0;i--);
    0039 01A8      MOVW	R20,R16
    003A C002      RJMP	0x003D
    003B 5041      SUBI	R20,1
    003C 4050      SBCI	R21,0
    003D 3040      CPI	R20,0
    003E 0745      CPC	R20,R21
    003F F7D9      BNE	0x003B
(0006) }
    0040 D0E7      RCALL	pop_gset1
    0041 9508      RET
(0007)   
(0008) //延时1MS
(0009) void delay_1ms(void)
(0010) { 
(0011)     unsigned int i;
(0012)     for(i=1;i<(unsigned int)(1144-2);i++)
_delay_1ms:
  i                    --> R16
    0042 E001      LDI	R16,1
    0043 E010      LDI	R17,0
    0044 C002      RJMP	0x0047
    0045 5F0F      SUBI	R16,0xFF
    0046 4F1F      SBCI	R17,0xFF
    0047 3706      CPI	R16,0x76
    0048 E0E4      LDI	R30,4
    0049 071E      CPC	R17,R30
    004A F3D0      BCS	0x0045
(0013)         ;
(0014) }
    004B 9508      RET
_delay_ms:
  i                    --> R20
  n                    --> R22
    004C D0EF      RCALL	push_gset2
    004D 01B8      MOVW	R22,R16
(0015) 
(0016) //延时nMS
(0017) void delay_ms(unsigned int n)
(0018) {
(0019)     unsigned int i=0;
    004E 2744      CLR	R20
    004F 2755      CLR	R21
    0050 C003      RJMP	0x0054
(0020)     while(i<n)
(0021)     {
(0022) 	    delay_1ms();
    0051 DFF0      RCALL	_delay_1ms
(0023)         i++;
    0052 5F4F      SUBI	R20,0xFF
    0053 4F5F      SBCI	R21,0xFF
    0054 1746      CP	R20,R22
    0055 0757      CPC	R21,R23
    0056 F3D0      BCS	0x0051
(0024)     }
(0025) } 
    0057 D0C9      RCALL	pop_gset2
    0058 9508      RET
_ScanKey:
  temp1                --> R22
  key                  --> R20
  temp                 --> R20
    0059 D0E5      RCALL	push_gset3
FILE: F:\Learn\AVR\Pro_Mega8\KEY\3X3Key\3X3Key.C
(0001) /******************************************/
(0002) //文件名:3X3Key.c
(0003) //功能: 键盘扫描的应用
(0004) //作者:  young
(0005) //时间: 2006.11.6
(0006) //目标MCU:ATmega8   
(0007) //晶振:  8MHZ
(0008) /******************************************/
(0009) #include <iom8v.h>
(0010) #include "Delay.h"
(0011) 
(0012) //按键扫描函数,返回按键的值
(0013) unsigned char ScanKey(void)
(0014) {
(0015)     unsigned char temp,temp1,key;
(0016)     temp=PINC;
    005A B343      IN	R20,0x13
(0017)     temp&=0x07;
    005B 7047      ANDI	R20,7
(0018)     switch(temp) //判断行中哪条线有低电平
    005C 2755      CLR	R21
    005D 3043      CPI	R20,3
    005E E0E0      LDI	R30,0
    005F 075E      CPC	R21,R30
    0060 F409      BNE	0x0062
    0061 C05F      RJMP	0x00C1
    0062 3045      CPI	R20,5
    0063 E0E0      LDI	R30,0
    0064 075E      CPC	R21,R30
    0065 F179      BEQ	0x0095
    0066 3046      CPI	R20,6
    0067 E0E0      LDI	R30,0
    0068 075E      CPC	R21,R30
    0069 F009      BEQ	0x006B
    006A C07F      RJMP	0x00EA
(0019)     {
(0020) 	case 0x06:  
(0021)         DDRC=0X07;
    006B E087      LDI	R24,7
    006C BB84      OUT	0x14,R24
(0022)         PORTC=0X38;
    006D E388      LDI	R24,0x38
    006E BB85      OUT	0x15,R24
(0023) 	    delay_us(1);
    006F E001      LDI	R16,1
    0070 E010      LDI	R17,0
    0071 DFC6      RCALL	_delay_us
(0024)         temp1=PINC;
    0072 B363      IN	R22,0x13
(0025) 		temp1&=0x38;
    0073 7368      ANDI	R22,0x38
(0026)         switch(temp1) //判断列中哪条线有低电平
    0074 2F46      MOV	R20,R22
    0075 2755      CLR	R21
    0076 3248      CPI	R20,0x28
    0077 E0E0      LDI	R30,0
    0078 075E      CPC	R21,R30
    0079 F089      BEQ	0x008B
    007A E288      LDI	R24,0x28
    007B E090      LDI	R25,0
    007C 1784      CP	R24,R20
    007D 0795      CPC	R25,R21
    007E F02C      BLT	0x0084
    007F 3148      CPI	R20,0x18
    0080 E0E0      LDI	R30,0
    0081 075E      CPC	R21,R30
    0082 F051      BEQ	0x008D
    0083 C00B      RJMP	0x008F
    0084 3340      CPI	R20,0x30
    0085 E0E0      LDI	R30,0
    0086 075E      CPC	R21,R30
    0087 F009      BEQ	0x0089
    0088 C006      RJMP	0x008F
(0027) 		{
(0028) 		    case 0x30: key=0x01;  //得到键值
    0089 E041      LDI	R20,1
(0029) 		        break;
    008A C005      RJMP	0x0090
(0030) 		    case 0x28: key=0x02; 
    008B E042      LDI	R20,2
(0031) 		        break;
    008C C003      RJMP	0x0090
(0032) 			case 0x18: key=0x03; 
    008D E043      LDI	R20,3
(0033) 		        break;							
    008E C001      RJMP	0x0090
(0034) 			default:   key=0;
    008F 2744      CLR	R20
(0035) 		        break;
(0036) 		}
(0037) 		DDRC=0X38;
    0090 E388      LDI	R24,0x38
    0091 BB84      OUT	0x14,R24
(0038) 		PORTC=0X07;
    0092 E087      LDI	R24,7
    0093 BB85      OUT	0x15,R24
(0039)         break;
    0094 C056      RJMP	0x00EB
(0040) 			   
(0041)     case 0x05:
(0042) 	    DDRC=0X07;
    0095 E087      LDI	R24,7
    0096 BB84      OUT	0x14,R24
(0043)         PORTC=0X38;
    0097 E388      LDI	R24,0x38
    0098 BB85      OUT	0x15,R24
(0044) 	    delay_us(1);
    0099 E001      LDI	R16,1
    009A E010      LDI	R17,0
    009B DF9C      RCALL	_delay_us
(0045)         temp1=PINC;
    009C B363      IN	R22,0x13
(0046) 		temp1&=0x38;
    009D 7368      ANDI	R22,0x38
(0047) 		switch(temp1)
    009E 2EA6      MOV	R10,R22
    009F 24BB      CLR	R11
    00A0 01C5      MOVW	R24,R10
    00A1 3288      CPI	R24,0x28
    00A2 E0E0      LDI	R30,0
    00A3 079E      CPC	R25,R30
    00A4 F091      BEQ	0x00B7
    00A5 E288      LDI	R24,0x28
    00A6 158A      CP	R24,R10
    00A7 059B      CPC	R25,R11
    00A8 F034      BLT	0x00AF
    00A9 01C5      MOVW	R24,R10
    00AA 3188      CPI	R24,0x18
    00AB E0E0      LDI	R30,0
    00AC 079E      CPC	R25,R30
    00AD F059      BEQ	0x00B9
    00AE C00C      RJMP	0x00BB
    00AF 01C5      MOVW	R24,R10
    00B0 3380      CPI	R24,0x30
    00B1 E0E0      LDI	R30,0
    00B2 079E      CPC	R25,R30
    00B3 F009      BEQ	0x00B5
    00B4 C006      RJMP	0x00BB
(0048) 		{
(0049) 	    case 0x30: key=0x04; 
    00B5 E044      LDI	R20,4
(0050) 		    break;
    00B6 C005      RJMP	0x00BC
(0051) 		case 0x28: key=0x05; 
    00B7 E045      LDI	R20,5
(0052) 		    break;
    00B8 C003      RJMP	0x00BC
(0053) 		case 0x18: key=0x06; 
    00B9 E046      LDI	R20,6
(0054) 		    break;
    00BA C001      RJMP	0x00BC
(0055) 		default:   key=0;
    00BB 2744      CLR	R20
(0056) 		    break;
(0057) 		}
(0058) 		DDRC=0X38;
    00BC E388      LDI	R24,0x38
    00BD BB84      OUT	0x14,R24
(0059) 		PORTC=0X07;
    00BE E087      LDI	R24,7
    00BF BB85      OUT	0x15,R24
(0060)         break;
    00C0 C02A      RJMP	0x00EB
(0061)     case 0x03:  
(0062) 	    DDRC=0X07;
    00C1 E087      LDI	R24,7
    00C2 BB84      OUT	0x14,R24
(0063)         PORTC=0X38;
    00C3 E388      LDI	R24,0x38
    00C4 BB85      OUT	0x15,R24
(0064) 		delay_us(1);
    00C5 E001      LDI	R16,1
    00C6 E010      LDI	R17,0
    00C7 DF70      RCALL	_delay_us
(0065)         temp1=PINC;
    00C8 B363      IN	R22,0x13
(0066) 		temp1&=0x38;
    00C9 7368      ANDI	R22,0x38
(0067)         switch(temp1)
    00CA 2777      CLR	R23
    00CB 3268      CPI	R22,0x28
    00CC E0E0      LDI	R30,0
    00CD 077E      CPC	R23,R30
    00CE F089      BEQ	0x00E0
    00CF E288      LDI	R24,0x28
    00D0 E090      LDI	R25,0
    00D1 1786      CP	R24,R22
    00D2 0797      CPC	R25,R23
    00D3 F02C      BLT	0x00D9
    00D4 3168      CPI	R22,0x18
    00D5 E0E0      LDI	R30,0
    00D6 077E      CPC	R23,R30
    00D7 F051      BEQ	0x00E2
    00D8 C00B      RJMP	0x00E4
    00D9 3360      CPI	R22,0x30
    00DA E0E0      LDI	R30,0
    00DB 077E      CPC	R23,R30
    00DC F009      BEQ	0x00DE
    00DD C006      RJMP	0x00E4
(0068) 		{
(0069) 		case 0x30: key=0x07; 
    00DE E047      LDI	R20,7
(0070)             break;
    00DF C005      RJMP	0x00E5
(0071) 	    case 0x28: key=0x08; 
    00E0 E048      LDI	R20,0x8
(0072) 		    break;
    00E1 C003      RJMP	0x00E5
(0073) 		case 0x18: key=0x09; 
    00E2 E049      LDI	R20,0x9
(0074) 		    break;
    00E3 C001      RJMP	0x00E5
(0075) 		default:   key=0;
    00E4 2744      CLR	R20
(0076) 		    break;
(0077) 	    }
(0078) 		DDRC=0X38;
    00E5 E388      LDI	R24,0x38
    00E6 BB84      OUT	0x14,R24
(0079) 		PORTC=0X07;
    00E7 E087      LDI	R24,7
    00E8 BB85      OUT	0x15,R24
(0080)         break;
    00E9 C001      RJMP	0x00EB
(0081)     default:
(0082)         key=0;
    00EA 2744      CLR	R20
(0083)         break;   
(0084)     }
(0085)     return (key);
    00EB 2F04      MOV	R16,R20
    00EC D036      RCALL	pop_gset3
    00ED 9508      RET
_main:
  num                  --> Y+0
  keynum               --> R20
  temp                 --> R22
    00EE 972A      SBIW	R28,0xA
(0086) }
(0087) 
(0088) //主函数,扫描按键显示数据
(0089) void main()
(0090) {
(0091)     unsigned char temp, keynum;
(0092) 	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
    00EF E286      LDI	R24,0x26
    00F0 E090      LDI	R25,0
    00F1 01FE      MOVW	R30,R28
    00F2 E00A      LDI	R16,0xA
    00F3 E010      LDI	R17,0
    00F4 93FA      ST	R31,-Y
    00F5 93EA      ST	R30,-Y
    00F6 939A      ST	R25,-Y
    00F7 938A      ST	R24,-Y
    00F8 D049      RCALL	asgncblk
(0093) 	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
(0094) 	//初始化端口
(0095) 	DDRB=0xFF;	  //设置B口为输出模式
    00F9 EF8F      LDI	R24,0xFF
    00FA BB87      OUT	0x17,R24
(0096) 	PORTB=0xFF;	  //置高电平	
    00FB BB88      OUT	0x18,R24
(0097)     DDRC=0X38;
    00FC E388      LDI	R24,0x38
    00FD BB84      OUT	0x14,R24
(0098)     PORTC=0X07; 
    00FE E087      LDI	R24,7
    00FF BB85      OUT	0x15,R24
    0100 C01D      RJMP	0x011E
(0099)  
(0100)     while(1)
(0101)     { 
(0102) 	   PORTB=0x40;
    0101 E480      LDI	R24,0x40
    0102 BB88      OUT	0x18,R24
(0103)        temp=PINC;
    0103 B363      IN	R22,0x13
(0104)        temp&=0x7;
    0104 7067      ANDI	R22,7
(0105)        if(temp==0x7)//检测是否有按键按下       
    0105 3067      CPI	R22,7
    0106 F409      BNE	0x0108
(0106) 	       continue;
    0107 C016      RJMP	0x011E
(0107) 	   delay_ms(10);
    0108 E00A      LDI	R16,0xA
    0109 E010      LDI	R17,0
    010A DF41      RCALL	_delay_ms
(0108) 	   temp=PINC;
    010B B363      IN	R22,0x13
(0109)        temp&=0x7;
    010C 7067      ANDI	R22,7
(0110)        if(temp==0x7)//检测是否有按键按下       
    010D 3067      CPI	R22,7
    010E F409      BNE	0x0110
(0111) 	       continue;
    010F C00E      RJMP	0x011E
(0112)        keynum=ScanKey();
    0110 DF48      RCALL	_ScanKey
    0111 2F40      MOV	R20,R16
(0113)        PORTB=num[keynum];
    0112 01CE      MOVW	R24,R28
    0113 2FE4      MOV	R30,R20
    0114 27FF      CLR	R31
    0115 0FE8      ADD	R30,R24
    0116 1FF9      ADC	R31,R25
    0117 8020      LDD	R2,Z+0
    0118 BA28      OUT	0x18,R2
    0119 C002      RJMP	0x011C
(0114) 	   while(temp!=0x7) 
(0115) 	   {
(0116) 	       temp=PINC;
    011A B363      IN	R22,0x13
(0117)            temp&=0x7;
    011B 7067      ANDI	R22,7
    011C 3067      CPI	R22,7
    011D F7E1      BNE	0x011A
    011E CFE2      RJMP	0x0101
(0118) 	   }
(0119)     }
(0120) }
FILE: <library>
    011F 962A      ADIW	R28,0xA
    0120 9508      RET
pop_gset2:
    0121 E0E2      LDI	R30,2
    0122 C006      RJMP	pop
pop_gset3:
    0123 E0E4      LDI	R30,4
    0124 C004      RJMP	pop
push_gset1:
    0125 935A      ST	R21,-Y
    0126 934A      ST	R20,-Y
    0127 9508      RET
pop_gset1:
    0128 E0E1      LDI	R30,1
pop:
    0129 9149      LD	R20,Y+
    012A 9159      LD	R21,Y+
    012B FDE0      SBRC	R30,0
    012C 9508      RET
    012D 9169      LD	R22,Y+
    012E 9179      LD	R23,Y+
    012F FDE1      SBRC	R30,1
    0130 9508      RET
    0131 90A9      LD	R10,Y+
    0132 90B9      LD	R11,Y+
    0133 FDE2      SBRC	R30,2
    0134 9508      RET
    0135 90C9      LD	R12,Y+
    0136 90D9      LD	R13,Y+
    0137 FDE3      SBRC	R30,3
    0138 9508      RET
    0139 90E9      LD	R14,Y+
    013A 90F9      LD	R15,Y+
    013B 9508      RET
push_gset2:
    013C 937A      ST	R23,-Y
    013D 936A      ST	R22,-Y
    013E CFE6      RJMP	push_gset1
push_gset3:
    013F 92BA      ST	R11,-Y
    0140 92AA      ST	R10,-Y
    0141 CFFA      RJMP	push_gset2
asgncblk:
    0142 93AA      ST	R26,-Y
    0143 93BA      ST	R27,-Y
    0144 93EA      ST	R30,-Y
    0145 93FA      ST	R31,-Y
    0146 920A      ST	R0,-Y
    0147 81AF      LDD	R26,Y+7
    0148 85B8      LDD	R27,Y+8
    0149 81ED      LDD	R30,Y+5
    014A 81FE      LDD	R31,Y+6
    014B 3000      CPI	R16,0
    014C 0701      CPC	R16,R17
    014D F031      BEQ	0x0154
    014E 95C8      LPM
    014F 920D      ST	R0,X+
    0150 9631      ADIW	R30,1
    0151 5001      SUBI	R16,1
    0152 4010      SBCI	R17,0
    0153 CFF7      RJMP	0x014B
    0154 9009      LD	R0,Y+
    0155 91F9      LD	R31,Y+
    0156 91E9      LD	R30,Y+
    0157 91B9      LD	R27,Y+
    0158 91A9      LD	R26,Y+
    0159 9624      ADIW	R28,4
    015A 9508      RET

⌨️ 快捷键说明

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