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

📄 intkey.lst

📁 protues_atmeg8学习之:中断篇源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0068) 	    delay_us(1);
    00BE E001      LDI	R16,1
    00BF E010      LDI	R17,0
    00C0 DF77      RCALL	_delay_us
(0069)         temp1=PINC;
    00C1 B363      IN	R22,0x13
(0070) 		temp1&=0x07;
    00C2 7067      ANDI	R22,7
(0071)         switch(temp1)
    00C3 2777      CLR	R23
    00C4 3063      CPI	R22,3
    00C5 E0E0      LDI	R30,0
    00C6 077E      CPC	R23,R30
    00C7 F069      BEQ	0x00D5
    00C8 3065      CPI	R22,5
    00C9 E0E0      LDI	R30,0
    00CA 077E      CPC	R23,R30
    00CB F039      BEQ	0x00D3
    00CC 3066      CPI	R22,6
    00CD E0E0      LDI	R30,0
    00CE 077E      CPC	R23,R30
    00CF F009      BEQ	0x00D1
    00D0 C006      RJMP	0x00D7
(0072) 		{
(0073) 		case 0x06: key=0x03; 
    00D1 E043      LDI	R20,3
(0074)             break;
    00D2 C005      RJMP	0x00D8
(0075) 	    case 0x05: key=0x06; 
    00D3 E046      LDI	R20,6
(0076) 		    break;
    00D4 C003      RJMP	0x00D8
(0077) 		case 0x03: key=0x09; 
    00D5 E049      LDI	R20,0x9
(0078) 		    break;
    00D6 C001      RJMP	0x00D8
(0079) 		default:   key=0;
    00D7 2744      CLR	R20
(0080) 		    break;
(0081) 	    }
(0082) 		DDRC=0X07;
    00D8 E087      LDI	R24,7
    00D9 BB84      OUT	0x14,R24
(0083) 		PORTC=0X38;
    00DA E388      LDI	R24,0x38
    00DB BB85      OUT	0x15,R24
(0084)         break;
    00DC C001      RJMP	0x00DE
(0085)     default:
(0086)         key=0;
    00DD 2744      CLR	R20
(0087)         break;   
(0088)     }
(0089)     return (key);
    00DE 2F04      MOV	R16,R20
    00DF D060      RCALL	pop_gset3
    00E0 9508      RET
_int_fun:
    00E1 938A      ST	R24,-Y
    00E2 B78F      IN	R24,0x3F
    00E3 938A      ST	R24,-Y
(0090) }
(0091) 
(0092) #pragma interrupt_handler int_fun:2
(0093) void int_fun(void)
(0094) {
(0095)     KeyDown=1;		//在中断中仅设置一个标志
    00E4 E081      LDI	R24,1
    00E5 93800060  STS	_KeyDown,R24
(0096) }
    00E7 9189      LD	R24,Y+
    00E8 BF8F      OUT	0x3F,R24
    00E9 9189      LD	R24,Y+
    00EA 9518      RETI
_main:
  num                  --> Y+0
  keynum               --> R20
  temp                 --> R22
    00EB 972A      SBIW	R28,0xA
(0097) 
(0098) //主函数,扫描按键显示数据
(0099) void main()
(0100) {
(0101)     unsigned char temp, keynum;
(0102) 	unsigned char num[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
    00EC E286      LDI	R24,0x26
    00ED E090      LDI	R25,0
    00EE 01FE      MOVW	R30,R28
    00EF E00A      LDI	R16,0xA
    00F0 E010      LDI	R17,0
    00F1 93FA      ST	R31,-Y
    00F2 93EA      ST	R30,-Y
    00F3 939A      ST	R25,-Y
    00F4 938A      ST	R24,-Y
    00F5 D069      RCALL	asgncblk
(0103) 	                       0x6D, 0x7D, 0x07, 0x7F, 0x6F};
(0104) 	//初始化端口
(0105) 	DDRB=0xFF;	  //设置B口为输出模式
    00F6 EF8F      LDI	R24,0xFF
    00F7 BB87      OUT	0x17,R24
(0106) 	PORTB=0xFF;	  //置高电平	
    00F8 BB88      OUT	0x18,R24
(0107)     DDRC=0X07;
    00F9 E087      LDI	R24,7
    00FA BB84      OUT	0x14,R24
(0108)     PORTC=0X38; 
    00FB E388      LDI	R24,0x38
    00FC BB85      OUT	0x15,R24
(0109)     DDRD&=0x0F;
    00FD B381      IN	R24,0x11
    00FE 708F      ANDI	R24,0xF
    00FF BB81      OUT	0x11,R24
(0110) 	PORTD|=0xFC;
    0100 B382      IN	R24,0x12
    0101 6F8C      ORI	R24,0xFC
    0102 BB82      OUT	0x12,R24
(0111) 	
(0112)     MCUCR=0x03;   //INT0上升沿触发,INT1低电平有效
    0103 E083      LDI	R24,3
    0104 BF85      OUT	0x35,R24
(0113) 	GICR|=0x40;   //打开INT0中断
    0105 B78B      IN	R24,0x3B
    0106 6480      ORI	R24,0x40
    0107 BF8B      OUT	0x3B,R24
(0114)     GIFR=0xC0;    //清除INT0、INT1中断标志位
    0108 EC80      LDI	R24,0xC0
    0109 BF8A      OUT	0x3A,R24
(0115) 	
(0116) 	KeyDown=0;    //初始化全局变量
    010A 2422      CLR	R2
    010B 92200060  STS	_KeyDown,R2
(0117) 	SEI();        //打开全局中断	
    010D 9478      BSET	7
    010E C02C      RJMP	0x013B
(0118)     while(1)
(0119)     { 
(0120) 	   PORTB=0x40;
    010F E480      LDI	R24,0x40
    0110 BB88      OUT	0x18,R24
(0121)        if(KeyDown==1)        //检测是否有按键按下 
    0111 91800060  LDS	R24,_KeyDown
    0113 3081      CPI	R24,1
    0114 F531      BNE	0x013B
(0122) 	   {
(0123) 	       GIFR&=0xCF;       //关闭INT0中断
    0115 B78A      IN	R24,0x3A
    0116 7C8F      ANDI	R24,0xCF
    0117 BF8A      OUT	0x3A,R24
(0124) 	       KeyDown=0;
    0118 2422      CLR	R2
    0119 92200060  STS	_KeyDown,R2
(0125) 	       delay_ms(5);		 
    011B E005      LDI	R16,5
    011C E010      LDI	R17,0
    011D DF2E      RCALL	_delay_ms
(0126) 	       temp=PINC;
    011E B363      IN	R22,0x13
(0127)            temp&=0x38;
    011F 7368      ANDI	R22,0x38
(0128)            if(temp==0x38)     //确认是否有按键按下
    0120 3368      CPI	R22,0x38
    0121 F421      BNE	0x0126
(0129) 		   {
(0130) 		       GICR|=0x40;   //打开INT0中断
    0122 B78B      IN	R24,0x3B
    0123 6480      ORI	R24,0x40
    0124 BF8B      OUT	0x3B,R24
(0131) 	           continue;
    0125 C015      RJMP	0x013B
(0132) 		   }
(0133)            keynum=ScanKey();
    0126 DF32      RCALL	_ScanKey
    0127 2F40      MOV	R20,R16
(0134)            PORTB=num[keynum];
    0128 01CE      MOVW	R24,R28
    0129 2FE4      MOV	R30,R20
    012A 27FF      CLR	R31
    012B 0FE8      ADD	R30,R24
    012C 1FF9      ADC	R31,R25
    012D 8020      LDD	R2,Z+0
    012E BA28      OUT	0x18,R2
    012F C002      RJMP	0x0132
(0135) 	       while(temp!=0x38) 
(0136) 	       {
(0137) 	          temp=PINC;
    0130 B363      IN	R22,0x13
(0138)               temp&=0x38;
    0131 7368      ANDI	R22,0x38
    0132 3368      CPI	R22,0x38
    0133 F7E1      BNE	0x0130
(0139) 	       }		   	
(0140) 		   GICR|=0x40;       //打开INT0中断
    0134 B78B      IN	R24,0x3B
    0135 6480      ORI	R24,0x40
    0136 BF8B      OUT	0x3B,R24
(0141) 		   DDRC=0X07;
    0137 E087      LDI	R24,7
    0138 BB84      OUT	0x14,R24
(0142)            PORTC=0X38; 
    0139 E388      LDI	R24,0x38
    013A BB85      OUT	0x15,R24
    013B CFD3      RJMP	0x010F
(0143) 	   }
(0144)     }
(0145) }
FILE: <library>
    013C 962A      ADIW	R28,0xA
    013D 9508      RET
pop_gset2:
    013E E0E2      LDI	R30,2
    013F C006      RJMP	pop
pop_gset3:
    0140 E0E4      LDI	R30,4
    0141 C004      RJMP	pop
push_gset1:
    0142 935A      ST	R21,-Y
    0143 934A      ST	R20,-Y
    0144 9508      RET
pop_gset1:
    0145 E0E1      LDI	R30,1
pop:
    0146 9149      LD	R20,Y+
    0147 9159      LD	R21,Y+
    0148 FDE0      SBRC	R30,0
    0149 9508      RET
    014A 9169      LD	R22,Y+
    014B 9179      LD	R23,Y+
    014C FDE1      SBRC	R30,1
    014D 9508      RET
    014E 90A9      LD	R10,Y+
    014F 90B9      LD	R11,Y+
    0150 FDE2      SBRC	R30,2
    0151 9508      RET
    0152 90C9      LD	R12,Y+
    0153 90D9      LD	R13,Y+
    0154 FDE3      SBRC	R30,3
    0155 9508      RET
    0156 90E9      LD	R14,Y+
    0157 90F9      LD	R15,Y+
    0158 9508      RET
push_gset2:
    0159 937A      ST	R23,-Y
    015A 936A      ST	R22,-Y
    015B CFE6      RJMP	push_gset1
push_gset3:
    015C 92BA      ST	R11,-Y
    015D 92AA      ST	R10,-Y
    015E CFFA      RJMP	push_gset2
asgncblk:
    015F 93AA      ST	R26,-Y
    0160 93BA      ST	R27,-Y
    0161 93EA      ST	R30,-Y
    0162 93FA      ST	R31,-Y
    0163 920A      ST	R0,-Y
    0164 81AF      LDD	R26,Y+7
    0165 85B8      LDD	R27,Y+8
    0166 81ED      LDD	R30,Y+5
    0167 81FE      LDD	R31,Y+6
    0168 3000      CPI	R16,0
    0169 0701      CPC	R16,R17
    016A F031      BEQ	0x0171
    016B 95C8      LPM
    016C 920D      ST	R0,X+
    016D 9631      ADIW	R30,1
    016E 5001      SUBI	R16,1
    016F 4010      SBCI	R17,0
    0170 CFF7      RJMP	0x0168
    0171 9009      LD	R0,Y+
    0172 91F9      LD	R31,Y+
    0173 91E9      LD	R30,Y+
    0174 91B9      LD	R27,Y+
    0175 91A9      LD	R26,Y+
    0176 9624      ADIW	R28,4
    0177 9508      RET

⌨️ 快捷键说明

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