矩阵式按键.lst

来自「ICC mega8例子」· LST 代码 · 共 483 行

LST
483
字号
__text_start:
__start:
      1B E5CF      LDI	R28,0x5F
      1C E0D4      LDI	R29,4
      1D BFCD      OUT	0x3D,R28
      1E BFDE      OUT	0x3E,R29
      1F 51CE      SUBI	R28,0x1E
      20 40D0      SBCI	R29,0
      21 EA0A      LDI	R16,0xAA
      22 8308      STD	Y+0,R16
      23 2400      CLR	R0
      24 E6E0      LDI	R30,0x60
      25 E0F0      LDI	R31,0
      26 E010      LDI	R17,0
      27 36E0      CPI	R30,0x60
      28 07F1      CPC	R31,R17
      29 F011      BEQ	0x002C
      2A 9201      ST	R0,Z+
      2B CFFB      RJMP	0x0027
      2C 8300      STD	Z+0,R16
      2D E3E6      LDI	R30,0x36
      2E E0F0      LDI	R31,0
      2F E6A0      LDI	R26,0x60
      30 E0B0      LDI	R27,0
      31 E010      LDI	R17,0
      32 E000      LDI	R16,0
      33 BF0B      OUT	0x3B,R16
      34 33E6      CPI	R30,0x36
      35 07F1      CPC	R31,R17
      36 F021      BEQ	0x003B
      37 95C8      LPM
      38 9631      ADIW	R30,1
      39 920D      ST	R0,X+
      3A CFF9      RJMP	0x0034
      3B D0C2      RCALL	_main
_exit:
      3C CFFF      RJMP	_exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_矩阵式按键\矩阵式按键.c
(0001) //ICC-AVR application builder : 2009-3-12 17:58:29
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) 
(0008) void port_init(void)
(0009) {
(0010)  PORTB = 0x00;
_port_init:
      3D 2422      CLR	R2
      3E BA28      OUT	0x18,R2
(0011)  DDRB  = 0x00;
      3F BA27      OUT	0x17,R2
(0012)  PORTC = 0x00; //m103 output only
      40 BA25      OUT	0x15,R2
(0013)  DDRC  = 0x00;
      41 BA24      OUT	0x14,R2
(0014)  PORTD = 0x00;
      42 BA22      OUT	0x12,R2
(0015)  DDRD  = 0x00;
      43 BA21      OUT	0x11,R2
      44 9508      RET
(0016) }
(0017) 
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021)  //stop errant interrupts until set up
(0022)  CLI(); //disable all interrupts
_init_devices:
      45 94F8      BCLR	7
(0023)  port_init();
      46 DFF6      RCALL	_port_init
(0024) 
(0025)  MCUCR = 0x00;
      47 2422      CLR	R2
      48 BE25      OUT	0x35,R2
(0026)  GICR  = 0x00;
      49 BE2B      OUT	0x3B,R2
(0027)  TIMSK = 0x00; //timer interrupt sources
      4A BE29      OUT	0x39,R2
(0028)  SEI(); //re-enable interrupts
      4B 9478      BSET	7
      4C 9508      RET
(0029)  //all peripherals are now initialized
(0030) }
(0031) 
(0032) /************************************
(0033) 用    途:微秒级延时程序
(0034) Taget   :mega8
(0035) crystal :8M
(0036) 介    绍:在8M的晶振上进行us级的延时
(0037) 入口参数:
(0038) *************************************/
(0039) void delay_us(int time)
(0040) {
(0041)     do
(0042)     {
(0043)         time--;
_delay_us:
  time                 --> R16
      4D 5001      SUBI	R16,1
      4E 4010      SBCI	R17,0
(0044)     } 
(0045)     while (time > 1);
      4F E081      LDI	R24,1
      50 E090      LDI	R25,0
      51 1780      CP	R24,R16
      52 0791      CPC	R25,R17
      53 F3CC      BLT	0x004D
      54 9508      RET
_show_2_digit:
  i                    --> Y,+1
  digi                 --> R10
      55 92AA      ST	R10,-Y
      56 2EA0      MOV	R10,R16
(0046) }
(0047) 
(0048) 
(0049) /************************************
(0050) 用    途:两位数码管显示一个数
(0051) Taget   :mega8
(0052) crystal :8M
(0053) 介    绍:共阳数码管
(0054) 	  	 1-PC1(片选)
(0055) 		 2-PC0
(0056) 		 -----
(0057) 		 a-PB0(数据)
(0058) 		 b-PB1
(0059) 		 ...
(0060) 		 h-PB6
(0061) 		 DP-PB7
(0062) 入口参数:要显示的数,十进制表示
(0063) *************************************/
(0064) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0065) 	   			0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0066) void show_2_digit(unsigned char digi)
(0067) {
(0068)  unsigned char i;
(0069)  DDRC=0xff;
      57 EF8F      LDI	R24,0xFF
      58 BB84      OUT	0x14,R24
(0070)  DDRB=0xff;
      59 BB87      OUT	0x17,R24
(0071)  PORTC=0;//关片选
      5A 2422      CLR	R2
      5B BA25      OUT	0x15,R2
(0072)  PORTB=~num[(unsigned char )(digi/10)];//显示十位
      5C E02A      LDI	R18,0xA
      5D E030      LDI	R19,0
      5E 2D0A      MOV	R16,R10
      5F 2711      CLR	R17
      60 D0AE      RCALL	div16s
      61 2FE0      MOV	R30,R16
      62 27FF      CLR	R31
      63 E286      LDI	R24,0x26
      64 E090      LDI	R25,0
      65 0FE8      ADD	R30,R24
      66 1FF9      ADC	R31,R25
      67 9024      LPM	R2,0(Z)
      68 9420      COM	R2
      69 BA28      OUT	0x18,R2
(0073)  PORTC=(0x1<<1);//开十位的显示
      6A E082      LDI	R24,2
      6B BB85      OUT	0x15,R24
(0074)  delay_us(200);
      6C EC08      LDI	R16,0xC8
      6D E010      LDI	R17,0
      6E DFDE      RCALL	_delay_us
(0075)  PORTC=0;//关显示
      6F 2422      CLR	R2
      70 BA25      OUT	0x15,R2
(0076)  PORTB=~num[(unsigned char )(digi%10)];//显示个位
      71 E02A      LDI	R18,0xA
      72 E030      LDI	R19,0
      73 2D0A      MOV	R16,R10
      74 2711      CLR	R17
      75 D095      RCALL	mod16s
      76 2FE0      MOV	R30,R16
      77 27FF      CLR	R31
      78 E286      LDI	R24,0x26
      79 E090      LDI	R25,0
      7A 0FE8      ADD	R30,R24
      7B 1FF9      ADC	R31,R25
      7C 9024      LPM	R2,0(Z)
      7D 9420      COM	R2
      7E BA28      OUT	0x18,R2
(0077)  PORTC=(0x1<<0);//开个位的显示
      7F E081      LDI	R24,1
      80 BB85      OUT	0x15,R24
(0078)  delay_us(200);
      81 EC08      LDI	R16,0xC8
      82 E010      LDI	R17,0
      83 DFC9      RCALL	_delay_us
(0079)  PORTC=0x0;//关显示
      84 2422      CLR	R2
      85 BA25      OUT	0x15,R2
      86 90A9      LD	R10,Y+
      87 9508      RET
_key_vetrix:
  k                    --> R20
  key0                 --> R10
      88 D0BB      RCALL	push_xgsetF00C
(0080) }
(0081) 
(0082) /************************************
(0083) 用    途:矩阵键盘扫描子程序
(0084) Taget   :mega8
(0085) crystal :8M
(0086) 介    绍:用的是D口
(0087) 入口参数:
(0088) 出口参数:没有是-1不然是0-15
(0089) *************************************/
(0090) char key_vetrix()
(0091) {
(0092)  char k=-1;
      89 EF4F      LDI	R20,0xFF
(0093)  unsigned char key0;
(0094)  DDRD=0xf0;
      8A EF80      LDI	R24,0xF0
      8B BB81      OUT	0x11,R24
(0095)  PORTD=0x0f;//扫描低位
      8C E08F      LDI	R24,0xF
      8D BB82      OUT	0x12,R24
(0096)  delay_us(1);
      8E E001      LDI	R16,1
      8F E010      LDI	R17,0
      90 DFBC      RCALL	_delay_us
(0097)  key0=PIND;
      91 B2A0      IN	R10,0x10
(0098)  key0=~(key0^0xf0);
      92 EF80      LDI	R24,0xF0
      93 E090      LDI	R25,0
      94 2C2A      MOV	R2,R10
      95 2433      CLR	R3
      96 2628      EOR	R2,R24
      97 2639      EOR	R3,R25
      98 9420      COM	R2
      99 9430      COM	R3
      9A 2CA2      MOV	R10,R2
(0099)  if (key0==0) return -1;
      9B 2022      TST	R2
      9C F411      BNE	0x009F
      9D EF0F      LDI	R16,0xFF
      9E C05E      RJMP	0x00FD
(0100)  //----------------------扫行
(0101)  delay_us(500);//延时消抖
      9F EF04      LDI	R16,0xF4
      A0 E011      LDI	R17,1
      A1 DFAB      RCALL	_delay_us
(0102)  key0=PIND;
      A2 B2A0      IN	R10,0x10
(0103)  key0=~(key0^0xf0);
      A3 EF80      LDI	R24,0xF0
      A4 E090      LDI	R25,0
      A5 2C2A      MOV	R2,R10
      A6 2433      CLR	R3
      A7 2628      EOR	R2,R24
      A8 2639      EOR	R3,R25
      A9 9420      COM	R2
      AA 9430      COM	R3
      AB 2CA2      MOV	R10,R2
(0104)  if (key0==0) return -1;
      AC 2022      TST	R2
      AD F411      BNE	0x00B0
      AE EF0F      LDI	R16,0xFF
      AF C04D      RJMP	0x00FD
(0105)  switch ((key0))
      B0 2D6A      MOV	R22,R10
      B1 2777      CLR	R23
      B2 3061      CPI	R22,1
      B3 E0E0      LDI	R30,0
      B4 077E      CPC	R23,R30
      B5 F069      BEQ	0x00C3
      B6 3062      CPI	R22,2
      B7 E0E0      LDI	R30,0
      B8 077E      CPC	R23,R30
      B9 F059      BEQ	0x00C5
      BA 3064      CPI	R22,4
      BB E0E0      LDI	R30,0
      BC 077E      CPC	R23,R30
      BD F049      BEQ	0x00C7
      BE 3068      CPI	R22,0x8
      BF E0E0      LDI	R30,0
      C0 077E      CPC	R23,R30
      C1 F039      BEQ	0x00C9
      C2 C007      RJMP	0x00CA
(0106)  {
(0107)   case (0x01):k=0;break;
      C3 2744      CLR	R20
      C4 C005      RJMP	0x00CA
(0108)   case (0x02):k=4;break;
      C5 E044      LDI	R20,4
      C6 C003      RJMP	0x00CA
(0109)   case (0x04):k=8;break;
      C7 E048      LDI	R20,0x8
      C8 C001      RJMP	0x00CA
(0110)   case (0x08):k=12;break;
      C9 E04C      LDI	R20,0xC
(0111)  }
(0112)  //---------------------扫列
(0113)  DDRD=0x0f;
      CA E08F      LDI	R24,0xF
      CB BB81      OUT	0x11,R24
(0114)  PORTD=0xf0;
      CC EF80      LDI	R24,0xF0
      CD BB82      OUT	0x12,R24
(0115)  delay_us(1);
      CE E001      LDI	R16,1
      CF E010      LDI	R17,0
      D0 DF7C      RCALL	_delay_us
(0116)  key0=PIND;
      D1 B2A0      IN	R10,0x10
(0117)  key0=~(key0^0x0f);
      D2 E08F      LDI	R24,0xF
      D3 2C2A      MOV	R2,R10
      D4 2628      EOR	R2,R24
      D5 9420      COM	R2
      D6 2CA2      MOV	R10,R2
(0118)  if (0==key0) return -1;
      D7 2022      TST	R2
      D8 F411      BNE	0x00DB
      D9 EF0F      LDI	R16,0xFF
      DA C022      RJMP	0x00FD
(0119)  switch ((key0>>4))
      DB 2D6A      MOV	R22,R10
      DC 2777      CLR	R23
      DD 9575      ASR	R23
      DE 9567      ROR	R22
      DF 9575      ASR	R23
      E0 9567      ROR	R22
      E1 9575      ASR	R23
      E2 9567      ROR	R22
      E3 9575      ASR	R23
      E4 9567      ROR	R22
      E5 3061      CPI	R22,1
      E6 E0E0      LDI	R30,0
      E7 077E      CPC	R23,R30
      E8 F069      BEQ	0x00F6
      E9 3062      CPI	R22,2
      EA E0E0      LDI	R30,0
      EB 077E      CPC	R23,R30
      EC F051      BEQ	0x00F7
      ED 3064      CPI	R22,4
      EE E0E0      LDI	R30,0
      EF 077E      CPC	R23,R30
      F0 F041      BEQ	0x00F9
      F1 3068      CPI	R22,0x8
      F2 E0E0      LDI	R30,0
      F3 077E      CPC	R23,R30
      F4 F031      BEQ	0x00FB
      F5 C006      RJMP	0x00FC
(0120)  {
(0121)   case 1:k+=0;break;
      F6 C005      RJMP	0x00FC
(0122)   case 2:k+=1;break;
      F7 9543      INC	R20
      F8 C003      RJMP	0x00FC
(0123)   case 4:k+=2;break;
      F9 5F4E      SUBI	R20,0xFE
      FA C001      RJMP	0x00FC
(0124)   case 8:k+=3;break;
      FB 5F4D      SUBI	R20,0xFD
(0125)  }
(0126)  /*while(0!=key0)//等待按起
(0127)  {
(0128)   key0=pinKEY;
(0129)   key0=~(key0^0x0f);
(0130)  }*/
(0131)  return k;
      FC 2F04      MOV	R16,R20
      FD C04D      RJMP	pop_xgsetF00C
(0132) }
(0133) //********************************
(0134) 
(0135) void main()
(0136) {
(0137)  char i,j=0;
_main:
  i                    --> R12
  j                    --> R10
      FE 24AA      CLR	R10
(0138)  port_init();
      FF DF3D      RCALL	_port_init
(0139)  init_devices();
     100 DF44      RCALL	_init_devices
     101 C007      RJMP	0x0109
(0140)  
(0141)  while(1)
(0142)  {
(0143)  
(0144)   if((i=key_vetrix())!=-1)
     102 DF85      RCALL	_key_vetrix
     103 2EC0      MOV	R12,R16
     104 3F0F      CPI	R16,0xFF
     105 F009      BEQ	0x0107
(0145)    j=i;
     106 2CAC      MOV	R10,R12
(0146)   show_2_digit(j);
FILE: <library>
     107 2D0A      MOV	R16,R10
     108 DF4C      RCALL	_show_2_digit
     109 CFF8      RJMP	0x0102
     10A 9508      RET
mod16s:
     10B 9468      BSET	6
     10C 92DA      ST	R13,-Y
     10D 2ED1      MOV	R13,R17
     10E C004      RJMP	0x0113
div16s:
     10F 94E8      BCLR	6
     110 92DA      ST	R13,-Y
     111 2ED1      MOV	R13,R17
     112 26D3      EOR	R13,R19
     113 FF17      SBRS	R17,7
     114 C004      RJMP	0x0119
     115 9510      COM	R17
     116 9500      COM	R16
     117 5F0F      SUBI	R16,0xFF
     118 4F1F      SBCI	R17,0xFF
     119 FF37      SBRS	R19,7
     11A C004      RJMP	0x011F
     11B 9530      COM	R19
     11C 9520      COM	R18
     11D 5F2F      SUBI	R18,0xFF
     11E 4F3F      SBCI	R19,0xFF
     11F D00B      RCALL	xdiv16u
     120 FED7      SBRS	R13,7
     121 C004      RJMP	0x0126
     122 9510      COM	R17
     123 9500      COM	R16
     124 5F0F      SUBI	R16,0xFF
     125 4F1F      SBCI	R17,0xFF
     126 90D9      LD	R13,Y+
     127 9508      RET
mod16u:
     128 9468      BSET	6
     129 C001      RJMP	xdiv16u
div16u:
     12A 94E8      BCLR	6
xdiv16u:
     12B 92EA      ST	R14,-Y
     12C 92FA      ST	R15,-Y
     12D 938A      ST	R24,-Y
     12E 24EE      CLR	R14
     12F 24FF      CLR	R15
     130 E180      LDI	R24,0x10
     131 0F00      LSL	R16
     132 1F11      ROL	R17
     133 1CEE      ROL	R14
     134 1CFF      ROL	R15
     135 16E2      CP	R14,R18
     136 06F3      CPC	R15,R19
     137 F018      BCS	0x013B
     138 1AE2      SUB	R14,R18
     139 0AF3      SBC	R15,R19
     13A 9503      INC	R16
     13B 958A      DEC	R24
     13C F7A1      BNE	0x0131
     13D F416      BRTC	0x0140
     13E 2D0E      MOV	R16,R14
     13F 2D1F      MOV	R17,R15
     140 9189      LD	R24,Y+
     141 90F9      LD	R15,Y+
     142 90E9      LD	R14,Y+
     143 9508      RET
push_xgsetF00C:
     144 937A      ST	R23,-Y
     145 936A      ST	R22,-Y
     146 935A      ST	R21,-Y
     147 934A      ST	R20,-Y
     148 92BA      ST	R11,-Y
     149 92AA      ST	R10,-Y
     14A 9508      RET
pop_xgsetF00C:
     14B 90A9      LD	R10,Y+
     14C 90B9      LD	R11,Y+
     14D 9149      LD	R20,Y+
     14E 9159      LD	R21,Y+
     14F 9169      LD	R22,Y+
     150 9179      LD	R23,Y+
     151 9508      RET

⌨️ 快捷键说明

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