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

📄 pc_8535.lst

📁 单片机pc8535开发程序 (利用iccavr等开发工具开发)
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    00A2 E5CF      LDI	R28,0x5F
    00A3 E0D2      LDI	R29,2
    00A4 BFCD      OUT	P3D,R28
    00A5 BFDE      OUT	P3E,R29
    00A6 51C0      SUBI	R28,0x10
    00A7 40D0      SBCI	R29,0
    00A8 EA0A      LDI	R16,0xAA
    00A9 8308      STD	R16,0+Y
    00AA 2400      CLR	R0
    00AB E7E1      LDI	R30,0x71
    00AC E0F0      LDI	R31,0
    00AD E010      LDI	R17,0
    00AE 3BE8      CPI	R30,0xB8
    00AF 07F1      CPC	R31,R17
    00B0 F011      BEQ	0x00B3
    00B1 9201      ST	R0,Z+
    00B2 CFFB      RJMP	0x00AE
    00B3 8300      STD	R16,0+Z
    00B4 E3E2      LDI	R30,0x32
    00B5 E0F1      LDI	R31,1
    00B6 E6A0      LDI	R26,0x60
    00B7 E0B0      LDI	R27,0
    00B8 E011      LDI	R17,1
    00B9 34E3      CPI	R30,0x43
    00BA 07F1      CPC	R31,R17
    00BB F021      BEQ	0x00C0
    00BC 95C8      LPM
    00BD 9631      ADIW	R30,1
    00BE 920D      ST	R0,X+
    00BF CFF9      RJMP	0x00B9
    00C0 D0F6      RCALL	_main
_exit:
    00C1 CFFF      RJMP	_exit
FILE: D:\ICC-AVR\examples.sl\pc_8535\kbc.c
(0001) #include <io8535.h>
(0002) #include <macros.h>
(0003) #include "pindefs.h"
(0004) #include "scancodes.h"
(0005) #define BUFF_SIZE 64
(0006) //const ascii[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
(0007) //                 0x39,0x41,0x42,0x43,0x44,0x45,0x46};
(0008) unsigned char bitcount;//PC键盘数据长度计数 
(0009) unsigned char kb_buffer[BUFF_SIZE];//键盘缓冲区
(0010) unsigned char input=0;//缓冲区读指针
(0011) unsigned char output=0;//缓冲区写指针
(0012) //送键盘按键ASCII码到键盘缓冲区
(0013) void put_kbbuff(unsigned char c)
(0014)  {
(0015)   kb_buffer[input]=c;
_put_kbbuff:
  c                    --> R16
    00C2 E785      LDI	R24,0x75
    00C3 E090      LDI	R25,0
    00C4 91E00060  LDS	R30,0x60
    00C6 27FF      CLR	R31
    00C7 0FE8      ADD	R30,R24
    00C8 1FF9      ADC	R31,R25
    00C9 8300      STD	R16,0+Z
(0016)   if (input<(BUFF_SIZE-1))
    00CA 91800060  LDS	R24,0x60
    00CC 338F      CPI	R24,0x3F
    00CD F420      BCC	0x00D2
(0017)      input++; 
    00CE 5F8F      SUBI	R24,0xFF
    00CF 93800060  STS	R24,0x60
    00D1 C003      RJMP	0x00D5
(0018)   else
(0019)      input=0;	 
    00D2 2422      CLR	R2
    00D3 92200060  STS	R2,0x60
(0020)  }
    00D5 9508      RET
(0021) //从键盘缓冲区读取按键的ASCII码 
(0022) unsigned char get_char(void)
(0023)   {
(0024)    unsigned char temp;
(0025)    if(output==input)
_get_char:
  temp                 --> R16
    00D6 90200060  LDS	R2,0x60
    00D8 90300061  LDS	R3,0x61
    00DA 1432      CP	R3,R2
    00DB F411      BNE	0x00DE
(0026)        return 0;
    00DC 2700      CLR	R16
    00DD C013      RJMP	0x00F1
(0027)    else
(0028)       {
(0029) 	   temp=kb_buffer[output];
    00DE E785      LDI	R24,0x75
    00DF E090      LDI	R25,0
    00E0 91E00061  LDS	R30,0x61
    00E2 27FF      CLR	R31
    00E3 0FE8      ADD	R30,R24
    00E4 1FF9      ADC	R31,R25
    00E5 8100      LDD	R16,0+Z
(0030) 	   if(output<(BUFF_SIZE-1))
    00E6 91800061  LDS	R24,0x61
    00E8 338F      CPI	R24,0x3F
    00E9 F420      BCC	0x00EE
(0031) 	     {
(0032) 		  output++;
    00EA 5F8F      SUBI	R24,0xFF
    00EB 93800061  STS	R24,0x61
(0033) 		 }
    00ED C003      RJMP	0x00F1
(0034) 	   else
(0035) 	     output=0;
    00EE 2422      CLR	R2
    00EF 92200061  STS	R2,0x61
(0036) 	   return temp;	  
    00F1 9508      RET
(0037) 	  }	     
(0038)   }
(0039) //为运行读取PC键盘程序进行初始化  
(0040) void init_kb(void)
(0041)     {
(0042) 	 MCUCR=0x02;//设置8515的INT0为下降沿触发中断 
_init_kb:
    00F2 E082      LDI	R24,2
    00F3 BF85      OUT	P35,R24
(0043)      GIMSK|=(1<<INT0);//使能INT0中断
    00F4 B78B      IN	R24,P3B
    00F5 6480      ORI	R24,0x40
    00F6 BF8B      OUT	P3B,R24
(0044)      SEI(); //开中断
    00F7 9478      BSET	7
(0045)      bitcount = 11;
    00F8 E08B      LDI	R24,0xB
    00F9 938000B5  STS	R24,_bitcount
(0046)     }
    00FB 9508      RET
_decode:
  i                    --> R20
  sc                   --> R22
    00FC D11A      RCALL	push_gset3
    00FD 2F60      MOV	R22,R16
(0047) //对PC键盘的扫描码进行解码	
(0048) void decode(unsigned char sc)
(0049)     {
(0050)       static unsigned char shift,up,shiftup;
(0051) 	  unsigned char i;
(0052) 	  if (sc==0xf0)//按键释放
    00FE 3F60      CPI	R22,0xF0
    00FF F421      BNE	0x0104
(0053) 	      {
(0054) 		   up=1;
    0100 E081      LDI	R24,1
    0101 93800072  STS	R24,0x72
(0055) 		   return;
    0103 C06C      RJMP	0x0170
(0056) 		  }
(0057) 	  if (up==1)//SHIF键开关
    0104 91800072  LDS	R24,0x72
    0106 3081      CPI	R24,1
    0107 F501      BNE	0x0128
(0058) 	  	  {
(0059) 		   up=0;
    0108 2422      CLR	R2
    0109 92200072  STS	R2,0x72
(0060) 		   if ((sc==0x12)|(sc==0x59)) shift=0;
    010B 3162      CPI	R22,0x12
    010C F429      BNE	0x0112
    010D E081      LDI	R24,1
    010E E090      LDI	R25,0
    010F 2EA8      MOV	R10,R24
    0110 2EB9      MOV	R11,R25
    0111 C002      RJMP	0x0114
    0112 24AA      CLR	R10
    0113 24BB      CLR	R11
    0114 3569      CPI	R22,0x59
    0115 F419      BNE	0x0119
    0116 E041      LDI	R20,1
    0117 E050      LDI	R21,0
    0118 C002      RJMP	0x011B
    0119 2744      CLR	R20
    011A 2755      CLR	R21
    011B 2C2A      MOV	R2,R10
    011C 2C3B      MOV	R3,R11
    011D 2A24      OR	R2,R20
    011E 2A35      OR	R3,R21
    011F 2022      TST	R2
    0120 F419      BNE	0x0124
    0121 2033      TST	R3
    0122 F409      BNE	0x0124
    0123 C04C      RJMP	0x0170
    0124 2422      CLR	R2
    0125 92200071  STS	R2,0x71
(0061) 		   return;
    0127 C048      RJMP	0x0170
(0062) 		  }	  	   
(0063) 	  switch (sc)
    0128 2F46      MOV	R20,R22
    0129 2755      CLR	R21
    012A 3142      CPI	R20,0x12
    012B E0E0      LDI	R30,0
    012C 075E      CPC	R21,R30
    012D F049      BEQ	0x0137
    012E 3142      CPI	R20,0x12
    012F E0E0      LDI	R30,0
    0130 075E      CPC	R21,R30
    0131 F03C      BLT	0x0139
    0132 3549      CPI	R20,0x59
    0133 E0E0      LDI	R30,0
    0134 075E      CPC	R21,R30
    0135 F011      BEQ	0x0138
    0136 C002      RJMP	0x0139
(0064) 	    {
(0065) 		 case 0x12:{//检测左SHIF键
(0066) 					shift=1;		
    0137 D11F      RCALL	0x0257
    0138 D11E      RCALL	0x0257
(0067) 					shiftup=1;
(0068) 		           }		           
(0069) 		 case 0x59:{//检测右SHIF键
(0070) 				    shift=1;	
(0071) 					shiftup=1;
(0072) 		           }		           
(0073) 		 default:{
(0074) 		          if (shift==0)
    0139 90200071  LDS	R2,0x71
    013B 2022      TST	R2
    013C F009      BEQ	0x013E
    013D C01A      RJMP	0x0158
(0075) 					 {
(0076) 					 for(i = 0;unshifted[i][0]!=sc && unshifted[i][0]; i++);
    013E 2744      CLR	R20
    013F C001      RJMP	0x0141
    0140 9543      INC	R20
    0141 E282      LDI	R24,0x22
    0142 D103      RCALL	<created procedures>
    0143 2C20      MOV	R2,R0
    0144 2433      CLR	R3
    0145 2E46      MOV	R4,R22
    0146 2455      CLR	R5
    0147 1424      CP	R2,R4
    0148 0435      CPC	R3,R5
    0149 F021      BEQ	0x014E
    014A 2022      TST	R2
    014B F7A1      BNE	0x0140
    014C 2033      TST	R3
    014D F791      BNE	0x0140
(0077)                      if (unshifted[i][0] == sc)
    014E E282      LDI	R24,0x22
    014F D0F6      RCALL	<created procedures>
    0150 1606      CP	R0,R22
    0151 F009      BEQ	0x0153
    0152 C01D      RJMP	0x0170
(0078) 						  put_kbbuff(unshifted[i][1]);	 
    0153 E283      LDI	R24,0x23
    0154 D0F1      RCALL	<created procedures>
    0155 2D00      MOV	R16,R0
    0156 DF6B      RCALL	_put_kbbuff
(0079) 					 }
    0157 C018      RJMP	0x0170
(0080) 				  else
(0081) 				     {
(0082) 					 for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
    0158 2744      CLR	R20
    0159 C001      RJMP	0x015B
    015A 9543      INC	R20
    015B EA8A      LDI	R24,0xAA
    015C D0E9      RCALL	<created procedures>
    015D 2C20      MOV	R2,R0
    015E 2433      CLR	R3
    015F 2E46      MOV	R4,R22
    0160 2455      CLR	R5
    0161 1424      CP	R2,R4
    0162 0435      CPC	R3,R5
    0163 F021      BEQ	0x0168
    0164 2022      TST	R2
    0165 F7A1      BNE	0x015A
    0166 2033      TST	R3
    0167 F791      BNE	0x015A
(0083)                      if (shifted[i][0] == sc)
    0168 EA8A      LDI	R24,0xAA
    0169 D0DC      RCALL	<created procedures>
    016A 1606      CP	R0,R22
    016B F421      BNE	0x0170
(0084)                          {
(0085) 						  put_kbbuff(shifted[i][1]);						  
    016C EA8B      LDI	R24,0xAB
    016D D0D8      RCALL	<created procedures>
    016E 2D00      MOV	R16,R0
    016F DF52      RCALL	_put_kbbuff
(0086) 						 }	 	 						 
(0087) 					 } 
(0088) 		         }		         
(0089) 		} 	
(0090)     }
    0170 D0A9      RCALL	pop_gset3
    0171 9508      RET
_int0_isr:
    0172 D05C      RCALL	push_lset
    0173 D089      RCALL	push_gset1
(0091) //键盘数据读取程序	
(0092) #pragma interrupt_handler int0_isr:2
(0093) void int0_isr(void)
(0094)    {
(0095)     static unsigned char data;   	
(0096)     switch (bitcount)
    0174 914000B5  LDS	R20,_bitcount
    0176 2755      CLR	R21
    0177 3041      CPI	R20,1
    0178 E0E0      LDI	R30,0
    0179 075E      CPC	R21,R30
    017A F0A1      BEQ	0x018F
    017B 3042      CPI	R20,2
    017C E0E0      LDI	R30,0
    017D 075E      CPC	R21,R30
    017E F071      BEQ	0x018D

⌨️ 快捷键说明

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