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

📄 irr.lst

📁 16个单片机c语言实验程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
     12E 9ADF      SBI	0x1B,7
(0158) 		s_ms(50);
     12F E302      LDI	R16,0x32
     130 E010      LDI	R17,0
     131 DF20      RCALL	_s_ms
(0159) 		PORTA&=~(1<<EN);				
     132 98DF      CBI	0x1B,7
(0160) 		pBuffer++;
     133 5F4F      SUBI	R20,0xFF
     134 4F5F      SBCI	R21,0xFF
     135 9563      INC	R22
     136 3160      CPI	R22,0x10
     137 F398      BCS	0x012B
(0161) 	}
(0162) 	writecom(0xC0);
     138 EC00      LDI	R16,0xC0
     139 DF4C      RCALL	_writecom
(0163) 
(0164) 	PORTA|=(1<<RS);
     13A 9ADD      SBI	0x1B,5
(0165) 	PORTA&=~(1<<RW);
     13B 98DE      CBI	0x1B,6
(0166) 	s_ms(50);	
     13C E302      LDI	R16,0x32
     13D E010      LDI	R17,0
     13E DF13      RCALL	_s_ms
(0167) 	for(i=0;i<16;i++)
     13F 2766      CLR	R22
     140 C00B      RJMP	0x014C
(0168) 	{
(0169) 		t = *pBuffer;
     141 01FA      MOVW	R30,R20
     142 80A0      LDD	R10,Z+0
(0170) 		PORTD = t;
     143 BAA2      OUT	0x12,R10
(0171) 		PORTA|=(1<<EN);
     144 9ADF      SBI	0x1B,7
(0172) 		s_ms(50);
     145 E302      LDI	R16,0x32
     146 E010      LDI	R17,0
     147 DF0A      RCALL	_s_ms
(0173) 		PORTA&=~(1<<EN);				
     148 98DF      CBI	0x1B,7
(0174) 		pBuffer++;
     149 5F4F      SUBI	R20,0xFF
     14A 4F5F      SBCI	R21,0xFF
     14B 9563      INC	R22
     14C 3160      CPI	R22,0x10
     14D F398      BCS	0x0141
     14E 940C 03FB JMP	pop_xgsetF00C
_WriteNum:
  num                  --> R20
  col                  --> R10
  row                  --> R22
     150 940E 03F4 CALL	push_xgsetF00C
     152 0159      MOVW	R10,R18
     153 01B8      MOVW	R22,R16
     154 814E      LDD	R20,Y+6
     155 815F      LDD	R21,Y+7
(0175) 	}
(0176) }
(0177) //====================================================
(0178) // 描述:在任意位置写数字函数
(0179) // 入口:’row‘表示要写数字所在的行地址,只能为1或2
(0180) //       ’col‘表示要写数字所在的列地址,只能为0--15
(0181) //		 ‘num’表示要写的数字,只能为0--9
(0182) // 出口:无
(0183) //===================================================
(0184) void	WriteNum(uint	row,uint	col,uint	 num)
(0185) {
(0186) 	if (row == 1)	row = 0x80 + col;
     156 3061      CPI	R22,1
     157 E0E0      LDI	R30,0
     158 077E      CPC	R23,R30
     159 F421      BNE	0x015E
     15A 01B5      MOVW	R22,R10
     15B 5860      SUBI	R22,0x80
     15C 4F7F      SBCI	R23,0xFF
     15D C003      RJMP	0x0161
(0187) 	else	row = 0xC0 + col;
     15E 01B5      MOVW	R22,R10
     15F 5460      SUBI	R22,0x40
     160 4F7F      SBCI	R23,0xFF
(0188) 	writecom(row);
     161 2F06      MOV	R16,R22
     162 DF23      RCALL	_writecom
(0189) 	if (num<=0 | num>9)	num =0x30;
     163 3040      CPI	R20,0
     164 0745      CPC	R20,R21
     165 F421      BNE	0x016A
     166 E081      LDI	R24,1
     167 E090      LDI	R25,0
     168 015C      MOVW	R10,R24
     169 C002      RJMP	0x016C
     16A 24AA      CLR	R10
     16B 24BB      CLR	R11
     16C E089      LDI	R24,0x9
     16D E090      LDI	R25,0
     16E 1784      CP	R24,R20
     16F 0795      CPC	R25,R21
     170 F418      BCC	0x0174
     171 E061      LDI	R22,1
     172 E070      LDI	R23,0
     173 C002      RJMP	0x0176
     174 2766      CLR	R22
     175 2777      CLR	R23
     176 0115      MOVW	R2,R10
     177 2A26      OR	R2,R22
     178 2A37      OR	R3,R23
     179 2022      TST	R2
     17A F411      BNE	0x017D
     17B 2033      TST	R3
     17C F019      BEQ	0x0180
     17D E340      LDI	R20,0x30
     17E E050      LDI	R21,0
     17F C002      RJMP	0x0182
(0190) 	else	num = 0x30 + num;
     180 5D40      SUBI	R20,0xD0
     181 4F5F      SBCI	R21,0xFF
(0191) 
(0192) 	PORTA|=(1<<RS);
     182 9ADD      SBI	0x1B,5
(0193) 	s_ms(200);
     183 EC08      LDI	R16,0xC8
     184 E010      LDI	R17,0
     185 DECC      RCALL	_s_ms
(0194) 	PORTA&=~(1<<RW);
     186 98DE      CBI	0x1B,6
(0195) 	s_ms(200);
     187 EC08      LDI	R16,0xC8
     188 E010      LDI	R17,0
     189 DEC8      RCALL	_s_ms
(0196) 	PORTD = num;
     18A BB42      OUT	0x12,R20
(0197) 	s_ms(200);
     18B EC08      LDI	R16,0xC8
     18C E010      LDI	R17,0
     18D DEC4      RCALL	_s_ms
(0198) 	PORTA|=(1<<EN);
     18E 9ADF      SBI	0x1B,7
(0199) 	s_ms(200);
     18F EC08      LDI	R16,0xC8
     190 E010      LDI	R17,0
     191 DEC0      RCALL	_s_ms
(0200) 	PORTA&=~(1<<EN);	
     192 98DF      CBI	0x1B,7
(0201) 	s_ms(200);			
     193 EC08      LDI	R16,0xC8
     194 E010      LDI	R17,0
     195 DEBC      RCALL	_s_ms
     196 940C 03FB JMP	pop_xgsetF00C
_WriteChar:
  t                    --> R12
  i                    --> R10
  pBuffer              --> R20
  num                  --> Y,+8
  col                  --> R10
  row                  --> R22
     198 940E 0402 CALL	push_xgsetF03C
     19A 2EA2      MOV	R10,R18
     19B 2F60      MOV	R22,R16
     19C 854A      LDD	R20,Y+10
     19D 855B      LDD	R21,Y+11
(0202) }
(0203) //================================================================
(0204) // 描述:在任意位置写任意多个字符
(0205) // 入口:’row‘要写的字符所在的行,只能为1或2;
(0206) //       ‘col’要写的字符所在的列,只能为0---15
(0207) //       ‘num’要写字符的个数
(0208) //       ‘pbuffer’要写字符的首地址
(0209) //================================================================== 
(0210) void	WriteChar(uchar row,uchar col,uint num,uchar *pBuffer)
(0211) {
(0212) 	uchar i,t;
(0213) 	if (row == 1)	row = 0x80 + col;
     19E 3061      CPI	R22,1
     19F F419      BNE	0x01A3
     1A0 2D6A      MOV	R22,R10
     1A1 5860      SUBI	R22,0x80
     1A2 C002      RJMP	0x01A5
(0214) 	else	row = 0xC0 + col;
     1A3 2D6A      MOV	R22,R10
     1A4 5460      SUBI	R22,0x40
(0215) 	writecom(row);
     1A5 2F06      MOV	R16,R22
     1A6 DEDF      RCALL	_writecom
(0216) 	//if (num<=0 | num>9)	num =0x30;
(0217) 	//else	num = 0x30 + num;
(0218) 
(0219) 	PORTA|=(1<<RS);
     1A7 9ADD      SBI	0x1B,5
(0220) 	s_ms(200);
     1A8 EC08      LDI	R16,0xC8
     1A9 E010      LDI	R17,0
     1AA DEA7      RCALL	_s_ms
(0221) 	PORTA&=~(1<<RW);
     1AB 98DE      CBI	0x1B,6
(0222) 	s_ms(200);
     1AC EC08      LDI	R16,0xC8
     1AD E010      LDI	R17,0
     1AE DEA3      RCALL	_s_ms
(0223) 	for(i=num;i!=0;i--)
     1AF 84A8      LDD	R10,Y+8
     1B0 84B9      LDD	R11,Y+9
     1B1 C014      RJMP	0x01C6
(0224) 	{
(0225) 		t = *pBuffer;
     1B2 01FA      MOVW	R30,R20
     1B3 80C0      LDD	R12,Z+0
(0226) 		s_ms(200);
     1B4 EC08      LDI	R16,0xC8
     1B5 E010      LDI	R17,0
     1B6 DE9B      RCALL	_s_ms
(0227) 		PORTD = t;
     1B7 BAC2      OUT	0x12,R12
(0228) 		s_ms(200);
     1B8 EC08      LDI	R16,0xC8
     1B9 E010      LDI	R17,0
     1BA DE97      RCALL	_s_ms
(0229) 		PORTA|=(1<<EN);
     1BB 9ADF      SBI	0x1B,7
(0230) 		s_ms(200);
     1BC EC08      LDI	R16,0xC8
     1BD E010      LDI	R17,0
     1BE DE93      RCALL	_s_ms
(0231) 		PORTA&=~(1<<EN);		
     1BF 98DF      CBI	0x1B,7
(0232) 		s_ms(200);		
     1C0 EC08      LDI	R16,0xC8
     1C1 E010      LDI	R17,0
     1C2 DE8F      RCALL	_s_ms
(0233) 		pBuffer++;
     1C3 5F4F      SUBI	R20,0xFF
     1C4 4F5F      SBCI	R21,0xFF
     1C5 94AA      DEC	R10
     1C6 20AA      TST	R10
     1C7 F751      BNE	0x01B2
     1C8 940C 040B JMP	pop_xgsetF03C
_ext_int0_isr:
     1CA 922A      ST	R2,-Y
     1CB 923A      ST	R3,-Y
     1CC 924A      ST	R4,-Y
     1CD 925A      ST	R5,-Y
     1CE 930A      ST	R16,-Y
     1CF 931A      ST	R17,-Y
     1D0 932A      ST	R18,-Y
     1D1 933A      ST	R19,-Y
     1D2 938A      ST	R24,-Y
     1D3 939A      ST	R25,-Y
     1D4 93AA      ST	R26,-Y
     1D5 93BA      ST	R27,-Y
     1D6 B62F      IN	R2,0x3F
     1D7 922A      ST	R2,-Y
FILE: C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
(0001) //Atmega16的红外遥控器接收试验
(0002) //使用1602液晶进行显示,
(0003) #include<iom16v.h>
(0004) #include"1602.h"
(0005) #pragma interrupt_handler ext_int0_isr:2  //指定外部中断函数
(0006) #define uchar unsigned char 
(0007) #define uint unsigned int 
(0008) 
(0009) uchar irr_b=0,s_s=0;
(0010) uchar wb=0,a=0,ds=0;
(0011) long da=0;
(0012) uchar d1,d2,d3,d4;
(0013) uchar ten_1,ten_2,ten_3,ten_4,i;
(0014) 
(0015) //中断接收
(0016) void ext_int0_isr(void)
(0017) {
(0018) if(irr_b==0)        //第一个中断
     1D8 9020 0060 LDS	R2,irr_b
     1DA 2022      TST	R2
     1DB F431      BNE	0x01E2
(0019)   {
(0020)   irr_b=1;          //状态为:开始接收
     1DC E081      LDI	R24,1
     1DD 9380 0060 STS	irr_b,R24
(0021)   TCNT1L=0x00;      //定时器清零
     1DF 2422      CLR	R2
     1E0 BC2C      OUT	0x2C,R2
(0022)   }
     1E1 C071      RJMP	0x0253
(0023) else if(irr_b==1)   //第二个以后的中断
     1E2 9180 0060 LDS	R24,irr_b
     1E4 3081      CPI	R24,1
     1E5 F009      BEQ	0x01E7
     1E6 C06C      RJMP	0x0253
(0024)   {
(0025)    a=TCNT1L;        //读取定时器的值
     1E7 B42C      IN	R2,0x2C
     1E8 9220 0063 STS	a,R2
(0026)    //判断是引导,还是数据
(0027)    if((170<a)&&(a<235))       //引导
     1EA 2C42      MOV	R4,R2
     1EB 2433      CLR	R3
     1EC EA8A      LDI	R24,0xAA
     1ED E090      LDI	R25,0
     1EE 1582      CP	R24,R2
     1EF 0593      CPC	R25,R3
     1F0 F4A4      BGE	0x0205
     1F1 2D82      MOV	R24,R2
     1F2 3E8B      CPI	R24,0xEB
     1F3 F488      BCC	0x0205
(0028)      {
(0029)       wb=0;                   //数据计数清零     
     1F4 2422      CLR	R2
     1F5 9220 0062 STS	wb,R2
(0030) 	  da=0;                   //数据清零
     1F7 E080      LDI	R24,0
     1F8 E090      LDI	R25,0
     1F9 E0A0      LDI	R26,0
     1FA E0B0      LDI	R27,0
     1FB 9390 0066 STS	da+1,R25
     1FD 9380 0065 STS	da,R24
     1FF 93B0 0068 STS	da+3,R27
     201 93A0 0067 STS	da+2,R26
(0031) 	  TCNT1L=0x00;            //定时器清零 
     203 BC2C      OUT	0x2C,R2
(0032) 	  }
     204 C04E      RJMP	0x0253
(0033)    else if((8<a)&&(a<25))     //数据0
     205 9020 0063 LDS	R2,a
     207 E088      LDI	R24,0x8
     208 1582      CP	R24,R2
     209 F4F8      BCC	0x0229
     20A 2D82      MOV	R24,R2
     20B 3189      CPI	R24,0x19
     20C F4E0      BCC	0x0229
(0034)      { 
(0035)      wb++;
     20D 9180 0062 LDS	R24,wb
     20F 5F8F      SUBI	R24,0xFF
     210 9380 0062 STS	wb,R24
(0036)      da=(da<<1);
     212 9040 0067 LDS	R4,da+2
     214 9050 0068 LDS	R5,da+3
     216 9020 0065 LDS	R2,da
     218 9030 0066 LDS	R3,da+1
     21A 0C22      LSL	R2
     21B 1C33      ROL	R3
     21C 1C44      ROL	R4
     21D 1C55      ROL	R5
     21E 9230 0066 STS	da+1,R3
     220 9220 0065 STS	da,R2
     222 9250 0068 STS	da+3,R5
     224 9240 0067 STS	da+2,R4
(0037) 	 TCNT1L=0x00;
     226 2422      CLR	R2
     227 BC2C      OUT	0x2C,R2
(0038)      }
     228 C02A      RJMP	0x0253
(0039)    else if((25<a)&&(a<45))    //数据1
     229 9100 0063 LDS	R16,a
     22B E189      LDI	R24,0x19
     22C 1780      CP	R24,R16
     22D F528      BCC	0x0253
     22E 320D      CPI	R16,0x2D
     22F F518      BCC	0x0253
(0040)      {
(0041)      wb++;
     230 9180 0062 LDS	R24,wb
     232 5F8F      SUBI	R24,0xFF
     233 9380 0062 STS	wb,R24
(0042) 	 da=(da<<1)+1;
     235 E081      LDI	R24,1
     236 E090      LDI	R25,0
     237 E0A0      LDI	R26,0
     238 E0B0      LDI	R27,0
     239 9040 0067 LDS	R4,da+2
     23B 9050 0068 LDS	R5,da+3
     23D 9020 0065 LDS	R2,da
     23F 9030 0066 LDS	R3,da+1
     241 0C22      LSL	R2
     242 1C33      ROL	R3
     243 1C44      ROL	R4
     244 1C55      ROL	R5
     245 0E28      ADD	R2,R24
     246 1E39      ADC	R3,R25
     247 1E4A      ADC	R4,R26
     248 1E5B      ADC	R5,R27
     249 9230 0066 STS	da+1,R3
     24B 9220 0065 STS	da,R2
     24D 9250 0068 STS	da+3,R5
     24F 9240 0067 STS	da+2,R4
(0043) 	 TCNT1L=0x00;
     251 2422      CLR	R2
     252 BC2C      OUT	0x2C,R2
(0044)      }
(0045) }
(0046) if(wb==32)                    //数据长度够32位
     253 9180 0062 LDS	R24,wb
     255 3280      CPI	R24,0x20
     256 F441      BNE	0x025F
(0047)   {
(0048)   irr_b=0;                    //状态为停止接收
     257 2422      CLR	R2
     258 9220 0060 STS	irr_b,R2
(0049)   wb=0;                       //数据计数清零
     25A 9220 0062 STS	wb,R2
(0050)   s_s=1;                      //打开显示许可
     25C E081      LDI	R24,1
     25D 9380 0061 STS	s_s,R24
(0051)   }
     25F 9029      LD	R2,Y+
     260 BE2F      OUT	0x3F,R2
     261 91B9      LD	R27,Y+
     262 91A9      LD	R26,Y+
     263 9199      LD	R25,Y+
     264 9189      LD	R24,Y+
     265 9139      LD	R19,Y+
     266 9129      LD	R18,Y+
     267 9119      LD	R17,Y+
     268 9109      LD	R16,Y+
     269 9059      LD	R5,Y+
     26A 9049      LD	R4,Y+
     26B 9039      LD	R3,Y+
     26C 9029      LD	R2,Y+
     26D 9518      RETI
(0052) }
(0053) 
(0054) //定时器T1初始化
(0055) void t1_init()
(0056) {
(0057) TCCR1B=0x00;   //关闭定时器
_t1_init:
     26E 2422      CLR	R2
     26F BC2E      OUT	0x2E,R2
(0058) TCNT1H=0x00;   //定时器初值
     270 BC2D      OUT	0x2D,R2
(0059) TCNT1L=0x00;

⌨️ 快捷键说明

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