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

📄 int_key.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0033 E5CF      LDI	R28,0x5F
    0034 E0D4      LDI	R29,4
    0035 BFCD      OUT	0x3D,R28
    0036 BFDE      OUT	0x3E,R29
    0037 51C0      SUBI	R28,0x10
    0038 40D0      SBCI	R29,0
    0039 EA0A      LDI	R16,0xAA
    003A 8308      STD	Y+0,R16
    003B 2400      CLR	R0
    003C E6E0      LDI	R30,0x60
    003D E0F0      LDI	R31,0
    003E E010      LDI	R17,0
    003F 36E4      CPI	R30,0x64
    0040 07F1      CPC	R31,R17
    0041 F011      BEQ	0x0044
    0042 9201      ST	R0,Z+
    0043 CFFB      RJMP	0x003F
    0044 8300      STD	Z+0,R16
    0045 E6E5      LDI	R30,0x65
    0046 E0F0      LDI	R31,0
    0047 E6A0      LDI	R26,0x60
    0048 E0B0      LDI	R27,0
    0049 E010      LDI	R17,0
    004A 36E5      CPI	R30,0x65
    004B 07F1      CPC	R31,R17
    004C F021      BEQ	0x0051
    004D 95C8      LPM
    004E 9631      ADIW	R30,1
    004F 920D      ST	R0,X+
    0050 CFF9      RJMP	0x004A
    0051 940E0132  CALL	_main
_exit:
    0053 CFFF      RJMP	_exit
_delay100us:
  i                    --> R20
  n                    --> R16
    0054 940E0156  CALL	push_gset1
FILE: E:\avr\2.10.5\main.c
(0001) //ICC-AVR application builder : 2007-5-23 0:45:25
(0002) // Target : M16
(0003) // Crystal: 1.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) typedef unsigned char uint8;//可移植的8位无符号变量
(0008) typedef unsigned int uint16;//可移植的16位无符号变量
(0009) #pragma data:code
(0010) const uint8 seg7_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0~F and "shut"
(0011) #pragma data:data
(0012) volatile uint8 seg7_led_buff[4];//禁止编译器优化,保护数组内容
(0013) 
(0014) #define seg7_bitselect_port PORTD
(0015) #define seg7_bitselect_ddr DDRD
(0016) #define seg7_bit0 4
(0017) #define seg7_bit1 5
(0018) #define seg7_bit2 6
(0019) #define seg7_bit3 7
(0020) #define seg7_bit0_en() {seg7_bitselect_ddr|=(1<<seg7_bit0);seg7_bitselect_port|=(1<<seg7_bit0);}
(0021) #define seg7_bit0_dis() {seg7_bitselect_ddr|=(1<<seg7_bit0);seg7_bitselect_port&=~(1<<seg7_bit0);}
(0022) #define seg7_bit1_en() {seg7_bitselect_ddr|=(1<<seg7_bit1);seg7_bitselect_port|=(1<<seg7_bit1);}
(0023) #define seg7_bit1_dis() {seg7_bitselect_ddr|=(1<<seg7_bit1);seg7_bitselect_port&=~(1<<seg7_bit1);}
(0024) #define seg7_bit2_en() {seg7_bitselect_ddr|=(1<<seg7_bit2);seg7_bitselect_port|=(1<<seg7_bit2);}
(0025) #define seg7_bit2_dis() {seg7_bitselect_ddr|=(1<<seg7_bit2);seg7_bitselect_port&=~(1<<seg7_bit2);}
(0026) #define seg7_bit3_en() {seg7_bitselect_ddr|=(1<<seg7_bit3);seg7_bitselect_port|=(1<<seg7_bit3);}
(0027) #define seg7_bit3_dis() {seg7_bitselect_ddr|=(1<<seg7_bit3);seg7_bitselect_port&=~(1<<seg7_bit3);}
(0028) #define seg7_data_port PORTA
(0029) #define seg7_data_ddr DDRA
(0030) 
(0031) void delay100us(uint8 n)
(0032) {
(0033) uint8 i;
(0034) for(i=100*n;i!=0;i--)
    0056 E684      LDI	R24,0x64
    0057 9F80      MUL	R24,R16
    0058 2D40      MOV	R20,R0
    0059 C002      RJMP	0x005C
(0035) NOP();
    005A 0000      NOP
    005B 954A      DEC	R20
    005C 2344      TST	R20
    005D F7E1      BNE	0x005A
    005E 940E0159  CALL	pop_gset1
    0060 9508      RET
(0036) }
(0037) 
(0038) void seg7_led_update(void)//数码管扫描
(0039) {
(0040) seg7_data_port=seg7_data[seg7_led_buff[0]];
_seg7_led_update:
    0061 E584      LDI	R24,0x54
    0062 E090      LDI	R25,0
    0063 91E00060  LDS	R30,seg7_led_buff
    0065 27FF      CLR	R31
    0066 0FE8      ADD	R30,R24
    0067 1FF9      ADC	R31,R25
    0068 91E4      LPM	R30,0(Z)
    0069 BBEB      OUT	0x1B,R30
(0041) seg7_bit0_en();
    006A 9A8C      SBI	0x11,4
    006B 9A94      SBI	0x12,4
(0042) delay100us(1);
    006C E001      LDI	R16,1
    006D DFE6      RCALL	_delay100us
(0043) seg7_bit0_dis();
    006E 9A8C      SBI	0x11,4
    006F 9894      CBI	0x12,4
(0044) seg7_data_port=seg7_data[seg7_led_buff[1]];
    0070 E584      LDI	R24,0x54
    0071 E090      LDI	R25,0
    0072 91E00061  LDS	R30,seg7_led_buff+1
    0074 27FF      CLR	R31
    0075 0FE8      ADD	R30,R24
    0076 1FF9      ADC	R31,R25
    0077 91E4      LPM	R30,0(Z)
    0078 BBEB      OUT	0x1B,R30
(0045) seg7_bit1_en();
    0079 9A8D      SBI	0x11,5
    007A 9A95      SBI	0x12,5
(0046) delay100us(1);
    007B E001      LDI	R16,1
    007C DFD7      RCALL	_delay100us
(0047) seg7_bit1_dis();
    007D 9A8D      SBI	0x11,5
    007E 9895      CBI	0x12,5
(0048) seg7_data_port=seg7_data[seg7_led_buff[2]];
    007F E584      LDI	R24,0x54
    0080 E090      LDI	R25,0
    0081 91E00062  LDS	R30,seg7_led_buff+2
    0083 27FF      CLR	R31
    0084 0FE8      ADD	R30,R24
    0085 1FF9      ADC	R31,R25
    0086 91E4      LPM	R30,0(Z)
    0087 BBEB      OUT	0x1B,R30
(0049) seg7_bit2_en();
    0088 9A8E      SBI	0x11,6
    0089 9A96      SBI	0x12,6
(0050) delay100us(1);
    008A E001      LDI	R16,1
    008B DFC8      RCALL	_delay100us
(0051) seg7_bit2_dis();
    008C 9A8E      SBI	0x11,6
    008D 9896      CBI	0x12,6
(0052) seg7_data_port=seg7_data[seg7_led_buff[3]];
    008E E584      LDI	R24,0x54
    008F E090      LDI	R25,0
    0090 91E00063  LDS	R30,seg7_led_buff+3
    0092 27FF      CLR	R31
    0093 0FE8      ADD	R30,R24
    0094 1FF9      ADC	R31,R25
    0095 91E4      LPM	R30,0(Z)
    0096 BBEB      OUT	0x1B,R30
(0053) seg7_bit3_en();
    0097 9A8F      SBI	0x11,7
    0098 9A97      SBI	0x12,7
(0054) delay100us(1);
    0099 E001      LDI	R16,1
    009A DFB9      RCALL	_delay100us
(0055) seg7_bit3_dis();
    009B 9A8F      SBI	0x11,7
    009C 9897      CBI	0x12,7
    009D 9508      RET
(0056) }
(0057) 
(0058) void seg7_led_init(void)//7段数码管显示初始化
(0059) {
(0060) seg7_data_ddr=0xff;
_seg7_led_init:
    009E EF8F      LDI	R24,0xFF
    009F BB8A      OUT	0x1A,R24
(0061) seg7_data_port=0x00;
    00A0 2422      CLR	R2
    00A1 BA2B      OUT	0x1B,R2
(0062) seg7_bitselect_ddr|=0xf0;
    00A2 B381      IN	R24,0x11
    00A3 6F80      ORI	R24,0xF0
    00A4 BB81      OUT	0x11,R24
(0063) seg7_bitselect_port|=0xf0;
    00A5 B382      IN	R24,0x12
    00A6 6F80      ORI	R24,0xF0
    00A7 BB82      OUT	0x12,R24
    00A8 9508      RET
_int0_isr:
  tmpi                 --> R22
  key_buf              --> R20
  i                    --> R10
    00A9 940E016D  CALL	push_lset
    00AB 940E0152  CALL	push_gset3
(0064) }
(0065) #pragma interrupt_handler int0_isr:iv_INT0
(0066) 
(0067) void int0_isr(void)
(0068) {
(0069) uint8 key_buf=0,i=0,tmpi=0;
    00AD 2744      CLR	R20
    00AE 24AA      CLR	R10
    00AF 2766      CLR	R22
(0070) GICR=0x00;//关闭中断使能
    00B0 2422      CLR	R2
    00B1 BE2B      OUT	0x3B,R2
(0071) DDRB=0x0f;
    00B2 E08F      LDI	R24,0xF
    00B3 BB87      OUT	0x17,R24
(0072) PORTB&=0xf0;
    00B4 B388      IN	R24,0x18
    00B5 7F80      ANDI	R24,0xF0
    00B6 BB88      OUT	0x18,R24
(0073) _NOP();
    00B7 0000      NOP
(0074) if((PINB&0x0F)!=0x0F)
    00B8 B386      IN	R24,0x16
    00B9 708F      ANDI	R24,0xF
    00BA 308F      CPI	R24,0xF
    00BB F409      BNE	0x00BD
    00BC C06E      RJMP	0x012B
(0075) {  //#1
(0076)  delay100us(10);
    00BD E00A      LDI	R16,0xA
    00BE DF95      RCALL	_delay100us
(0077) if((PINB&0x0F)!=0x0F)
    00BF B386      IN	R24,0x16
    00C0 708F      ANDI	R24,0xF
    00C1 308F      CPI	R24,0xF
    00C2 F409      BNE	0x00C4
    00C3 C067      RJMP	0x012B
(0078) { //#2
(0079)  if((~PINB)&0x10)
    00C4 B226      IN	R2,0x16
    00C5 2433      CLR	R3
    00C6 9420      COM	R2
    00C7 9430      COM	R3
    00C8 FE24      SBRS	R2,4
    00C9 C001      RJMP	0x00CB
(0080)  key_buf=0;
    00CA C016      RJMP	0x00E1
(0081)  else if((~PINB)&0x20)
    00CB B226      IN	R2,0x16
    00CC 2433      CLR	R3
    00CD 9420      COM	R2
    00CE 9430      COM	R3
    00CF FE25      SBRS	R2,5
    00D0 C002      RJMP	0x00D3
(0082)     key_buf=1;
    00D1 E041      LDI	R20,1
    00D2 C00E      RJMP	0x00E1
(0083)     else if((~PINB)&0x40)
    00D3 B226      IN	R2,0x16
    00D4 2433      CLR	R3
    00D5 9420      COM	R2
    00D6 9430      COM	R3
    00D7 FE26      SBRS	R2,6
    00D8 C002      RJMP	0x00DB
(0084)       key_buf=2;

⌨️ 快捷键说明

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