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

📄 tcxoboard.lst

📁 详细介绍M8两版间通讯
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0114) 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(integer地址)
    0248 2766      CLR	R22
    0249 C010      RJMP	0x025A
(0115) 			 {
(0116) 				charInput=getchar()-48;
    024A DF2B      RCALL	_getchar
    024B 2F80      MOV	R24,R16
    024C 5380      SUBI	R24,0x30
    024D 2EC8      MOV	R12,R24
(0117) 				val+=charInput*temp;
    024E 2F08      MOV	R16,R24
    024F 2711      CLR	R17
    0250 0195      MOVW	R18,R10
    0251 D1AC      RCALL	empy16s
    0252 0F40      ADD	R20,R16
    0253 1F51      ADC	R21,R17
(0118) 				temp/=10;
    0254 E02A      LDI	R18,0xA
    0255 E030      LDI	R19,0
    0256 0185      MOVW	R16,R10
    0257 D18C      RCALL	div16u
    0258 0158      MOVW	R10,R16
    0259 9563      INC	R22
    025A 3064      CPI	R22,4
    025B F370      BCS	0x024A
(0119) 			 }
(0120) 			eeprom_addr=val;
    025C 93500092  STS	eeprom_addr+1,R21
    025E 93400091  STS	eeprom_addr,R20
(0121) 
(0122) 			charInput=getchar();//无用的前导空格字符
    0260 DF15      RCALL	_getchar
    0261 2EC0      MOV	R12,R16
(0123) 			val=0;//复位
    0262 2744      CLR	R20
    0263 2755      CLR	R21
(0124) 			temp=1000;//复位
    0264 EE88      LDI	R24,0xE8
    0265 E093      LDI	R25,3
    0266 015C      MOVW	R10,R24
(0125) 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(需转换为char数据)
    0267 2766      CLR	R22
    0268 C010      RJMP	0x0279
(0126) 			 {
(0127) 				charInput=getchar()-48;
    0269 DF0C      RCALL	_getchar
    026A 2F80      MOV	R24,R16
    026B 5380      SUBI	R24,0x30
    026C 2EC8      MOV	R12,R24
(0128) 				val+=charInput*temp;
    026D 2F08      MOV	R16,R24
    026E 2711      CLR	R17
    026F 0195      MOVW	R18,R10
    0270 D18D      RCALL	empy16s
    0271 0F40      ADD	R20,R16
    0272 1F51      ADC	R21,R17
(0129) 				temp/=10;
    0273 E02A      LDI	R18,0xA
    0274 E030      LDI	R19,0
    0275 0185      MOVW	R16,R10
    0276 D16D      RCALL	div16u
    0277 0158      MOVW	R10,R16
    0278 9563      INC	R22
    0279 3064      CPI	R22,4
    027A F370      BCS	0x0269
(0130) 			 }
(0131) 			eeprom_val=(unsigned char)val;
    027B 93400090  STS	eeprom_val,R20
(0132) 			InterruptFlag|=0b00000100;//通知Timer0中断程序,需要写入数据
    027D 91800089  LDS	R24,InterruptFlag
    027F 6084      ORI	R24,4
    0280 93800089  STS	InterruptFlag,R24
(0133) 			break;
    0282 C03A      RJMP	0x02BD
(0134) 		 }
(0135) 
(0136) 		case 'w'://写入AT2402(或者另外一块模拟AT2402的8Mega2#)珽EPROM
(0137) 		 {
(0138) 			charInput=getchar();//无效的空格字符
    0283 DEF2      RCALL	_getchar
    0284 2EC0      MOV	R12,R16
(0139) 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(integer地址)
    0285 2766      CLR	R22
    0286 C010      RJMP	0x0297
(0140) 			 {
(0141) 				charInput=getchar()-48;
    0287 DEEE      RCALL	_getchar
    0288 2F80      MOV	R24,R16
    0289 5380      SUBI	R24,0x30
    028A 2EC8      MOV	R12,R24
(0142) 				val+=charInput*temp;
    028B 2F08      MOV	R16,R24
    028C 2711      CLR	R17
    028D 0195      MOVW	R18,R10
    028E D16F      RCALL	empy16s
    028F 0F40      ADD	R20,R16
    0290 1F51      ADC	R21,R17
(0143) 				temp/=10;
    0291 E02A      LDI	R18,0xA
    0292 E030      LDI	R19,0
    0293 0185      MOVW	R16,R10
    0294 D14F      RCALL	div16u
    0295 0158      MOVW	R10,R16
    0296 9563      INC	R22
    0297 3064      CPI	R22,4
    0298 F370      BCS	0x0287
(0144) 			 }
(0145) 			ExtendRomAddr=val;
    0299 9340008F  STS	ExtendRomAddr,R20
(0146) 
(0147) 			charInput=getchar();//无用的前导空格字符
    029B DEDA      RCALL	_getchar
    029C 2EC0      MOV	R12,R16
(0148) 			val=0;//复位
    029D 2744      CLR	R20
    029E 2755      CLR	R21
(0149) 			temp=1000;//复位
    029F EE88      LDI	R24,0xE8
    02A0 E093      LDI	R25,3
    02A1 015C      MOVW	R10,R24
(0150) 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(需转换为char数据)
    02A2 2766      CLR	R22
    02A3 C010      RJMP	0x02B4
(0151) 			 {
(0152) 				charInput=getchar()-48;
    02A4 DED1      RCALL	_getchar
    02A5 2F80      MOV	R24,R16
    02A6 5380      SUBI	R24,0x30
    02A7 2EC8      MOV	R12,R24
(0153) 				val+=charInput*temp;
    02A8 2F08      MOV	R16,R24
    02A9 2711      CLR	R17
    02AA 0195      MOVW	R18,R10
    02AB D152      RCALL	empy16s
    02AC 0F40      ADD	R20,R16
    02AD 1F51      ADC	R21,R17
(0154) 				temp/=10;
    02AE E02A      LDI	R18,0xA
    02AF E030      LDI	R19,0
    02B0 0185      MOVW	R16,R10
    02B1 D132      RCALL	div16u
    02B2 0158      MOVW	R10,R16
    02B3 9563      INC	R22
    02B4 3064      CPI	R22,4
    02B5 F370      BCS	0x02A4
(0155) 			 }
(0156) 			ExtendRomVal=(unsigned char)val;
    02B6 9340008E  STS	ExtendRomVal,R20
(0157) 			ExtendRomRW|=0b00000100;//通知Main程序,需要写入At2402(或者Mega8 2#)EEPROM数据
    02B8 91800060  LDS	R24,ExtendRomRW
    02BA 6084      ORI	R24,4
    02BB 93800060  STS	ExtendRomRW,R24
(0158) 			break;
(0159) 		 }
(0160) 
(0161) 
(0162) 		default://B口进行IO输出
(0163) 		 {
(0164) 
(0165) 		 }
(0166) 	 }
    02BD D154      RCALL	pop_gset5
    02BE D18F      RCALL	pop_lset
    02BF 9518      RETI
_delay_ms:
  loopcount            --> R20
  i                    --> R10
  ms                   --> R22
    02C0 D16D      RCALL	push_gset3
    02C1 01B8      MOVW	R22,R16
FILE: G:\Mega8程序\TCXO评估板\Main\INT0+1.c
(0001) /*INT0、INT1使用中断方式,一个中断处理函数 实现对INT0/INT1按键的处理*/
(0002) #include <iom8v.h>
(0003) #include <macros.h>
(0004) extern void uart_init(void);
(0005) void delay_ms(unsigned int ms)
(0006)  {
(0007) 	unsigned char i,loopcount;
(0008) 	ms=4*ms+1;
    02C2 E004      LDI	R16,4
    02C3 E010      LDI	R17,0
    02C4 019B      MOVW	R18,R22
    02C5 D138      RCALL	empy16s
    02C6 01B8      MOVW	R22,R16
    02C7 5F6F      SUBI	R22,0xFF
    02C8 4F7F      SBCI	R23,0xFF
(0009) 	for(loopcount=0;loopcount<ms;loopcount++)//外循环
    02C9 2744      CLR	R20
    02CA C007      RJMP	0x02D2
(0010) 	 {
(0011) 		for(i=0;i<=251;i++);
    02CB 24AA      CLR	R10
    02CC C001      RJMP	0x02CE
    02CD 94A3      INC	R10
    02CE EF8B      LDI	R24,0xFB
    02CF 158A      CP	R24,R10
    02D0 F7E0      BCC	0x02CD
    02D1 9543      INC	R20
    02D2 2E24      MOV	R2,R20
    02D3 2433      CLR	R3
    02D4 1626      CP	R2,R22
    02D5 0637      CPC	R3,R23
    02D6 F3A0      BCS	0x02CB
    02D7 D138      RCALL	pop_gset3
    02D8 9508      RET
(0012) 		//内循环
(0013) 	 }
(0014)  }
(0015) void int_init(void)
(0016) {GICR  = 0xC0;}
_int_init:
    02D9 EC80      LDI	R24,0xC0
    02DA BF8B      OUT	0x3B,R24
    02DB 9508      RET
_int_isr:
  loopcount            --> Y+1
  i                    --> R20
    02DC D15A      RCALL	push_lset
    02DD D136      RCALL	push_gset1
(0017) //初始化int0,int1中断使能
(0018) #pragma interrupt_handler int_isr:iv_INT0 int_isr:iv_INT1
(0019) void int_isr(void)
(0020)  {
(0021) 	unsigned char i;
(0022) 	unsigned char loopcount;
(0023) 	delay_ms(50);//延时10ms后检测按键是否有效,进行软防抖
    02DE E302      LDI	R16,0x32
    02DF E010      LDI	R17,0
    02E0 DFDF      RCALL	_delay_ms
(0024) 	/*for (loopcount=0;loopcount<41;loopcount++)
(0025) 		{for(i=0;i<251;i++);}
(0026) 	//不使用延时函数而直接使用循环进行延时*/
(0027) 	i=PIND&0x0c;//检测键盘是否仍按下
    02E1 B340      IN	R20,0x10
    02E2 704C      ANDI	R20,0xC
(0028) 	if(i==0x0c) return;//按键误触发
    02E3 304C      CPI	R20,0xC
    02E4 F409      BNE	0x02E6
    02E5 C036      RJMP	0x031C
(0029) 	else
(0030) 	 {
(0031) 		if(i==0x08)//INT0键按下
    02E6 3048      CPI	R20,0x8
    02E7 F491      BNE	0x02FA
(0032) 		 {
(0033) 			if (OCR1A<3890) OCR1A+=205;//递增
    02E8 B58A      IN	R24,0x2A
    02E9 B59B      IN	R25,0x2B
    02EA 3382      CPI	R24,0x32
    02EB E0EF      LDI	R30,0xF
    02EC 079E      CPC	R25,R30
    02ED F438      BCC	0x02F5
    02EE B58A      IN	R24,0x2A
    02EF B59B      IN	R25,0x2B
    02F0 5383      SUBI	R24,0x33
    02F1 4F9F      SBCI	R25,0xFF
    02F2 BD9B      OUT	0x2B,R25
    02F3 BD8A      OUT	0x2A,R24
    02F4 C01E      RJMP	0x0313
(0034) 			else OCR1A=0x0fff;
    02F5 EF8F      LDI	R24,0xFF
    02F6 E09F      LDI	R25,0xF
    02F7 BD9B      OUT	0x2B,R25
    02F8 BD8A      OUT	0x2A,R24
(0035) 			//12位满幅值,防止出现数据变为负向数值
(0036) 		 }
    02F9 C019      RJMP	0x0313
(0037) 		else if(i==0x04)//INT1键按下
    02FA 3044      CPI	R20,4
    02FB F499      BNE	0x030F
(0038) 		 {
(0039) 			if (OCR1A>205) OCR1A-=205;//递减
    02FC EC8D      LDI	R24,0xCD
    02FD E090      LDI	R25,0
    02FE B42A      IN	R2,0x2A
    02FF B43B      IN	R3,0x2B
    0300 1582      CP	R24,R2
    0301 0593      CPC	R25,R3
    0302 F438      BCC	0x030A
    0303 B58A      IN	R24,0x2A
    0304 B59B      IN	R25,0x2B
    0305 5C8D      SUBI	R24,0xCD
    0306 4090      SBCI	R25,0
    0307 BD9B      OUT	0x2B,R25
    0308 BD8A      OUT	0x2A,R24
    0309 C009      RJMP	0x0313
(0040) 			else OCR1A=0;
    030A 2422      CLR	R2
    030B 2433      CLR	R3
    030C BC3B      OUT	0x2B,R3
    030D BC2A      OUT	0x2A,R2
(0041) 		 }
    030E C004      RJMP	0x0313
(0042) 		else if(i==0x00) UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    030F 2344      TST	R20
    0310 F411      BNE	0x0313
    0311 E988      LDI	R24,0x98
    0312 B98A      OUT	0x0A,R24
(0043) 		//两键同时按下,重新切换到USART中,允许接收中断、发送和接收
(0044) 	 }
(0045) 	GICR  = 0x00;
    0313 2422      CLR	R2
    0314 BE2B      OUT	0x3B,R2
(0046) 	//int0,int1禁止使能
(0047) 	SEI();
    0315 9478      BSET	7
(0048) 	while ((PIND&0x0c)!=0x0c);
    0316 B380      IN	R24,0x10
    0317 708C      ANDI	R24,0xC
    0318 308C      CPI	R24,0xC
    0319 F7E1      BNE	0x0316
(0049) 	//检查按键释放
(0050) 	GICR  = 0xC0;
    031A EC80      LDI	R24,0xC0
    031B BF8B      OUT	0x3B,R24
    031C D0FA      RCALL	pop_gset1
    031D D130      RCALL	pop_lset
    031E 9518      RETI
FILE: G:\Mega8程序\TCXO评估板\Main\RW_eeprom.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) void rom_write(unsigned int Address,unsigned  char Data)
(0004)  {
(0005) 	while(EECR&(1<<EEWE));
_rom_write:
  Data                 --> R18
  Address              --> R16
    031F 99E1      SBIC	0x1C,1
    0320 CFFE      RJMP	_rom_write
(0006) 	EEAR=Address;
    0321 BB1F      OUT	0x1F,R17
    0322 BB0E      OUT	0x1E,R16
(0007) 	EEDR=Data;
    0323 BB2D      OUT	0x1D,R18
(0008) 	EECR|=(1<<EEMWE);
    0324 9AE2      SBI	0x1C,2
(0009) 	EECR|=(1<<EEWE);
    0325 9AE1      SBI	0x1C,1
    0326 9508      RET
(0010)  }
(0011) unsigned char rom_read(unsigned int Address)
(0012)  {
(0013)  	CLI();
_rom_read:
  Address              --> R16
    0327 94F8      BCLR	7
(0014) 	while(EECR&(1<<EEWE));
    0328 99E1      SBIC	0x1C,1
    0329 CFFE      RJMP	0x0328
(0015) 	EEAR=Address;
    032A BB1F      OUT	0x1F,R17
    032B BB0E      OUT	0x1E,R16
(0016) 	EECR|=(1<<EERE);
    032C 9AE0      SBI	0x1C,0
(0017) 	SEI();
    032D 9478      BSET	7
(0018) 	return EEDR;
    032E B30D      IN	R16,0x1D
    032F 9508      RET
FILE: G:\Mega8程序\TCXO评估板\Main\I2C.c
(0001) #include<iom8v.h>
(0002) /*     AT2402C地址
(0003) 1	0	1	0		A2 A1 A0 R/W
(0004) 前4位为AT240X系列的特征字
(0005) 后3位为可编程位
(0006) 最后一位为读写位
(0007) */
(0008) #define rd_device_add 0xa1 //读地址:0b10100001
(0009) #define wr_device_add 0xa0 //写地址:0b10100000
(0010) 
(0011) /*TWI状态定义----MT 主方式传输  MR 主方式接收*/
(0012) #define START								0x08
(0013) #define RE_START						0x10
(0014) 
(0015) #define MT_SLA_ACK					0x18
(0016) #define MT_SLA_NOACK				0x20
(0017) #define MT_DATA_ACK					0x28
(0018) #define MT_DATA_NOACK				0x30
(0019) 
(0020) #define MR_SLA_ACK					0x40
(0021) #define MR_SLA_NOACK				0x48
(0022) #define MR_DATA_ACK					0x50
(0023) #define MR_DATA_NOACK				0x58
(0024) 
(0025) 
(0026) #define EE_READ							0xf0
(0027) #define EE_READ_OK					0x50
(0028) #define EE_WRITE						0x0f
(0029) #define EE_WRITE_OK					0x05
(0030) #define EE_WRITE_OVER				0xa5
(0031) 
(0032) #define Start()						(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE))
(0033) //清除中断标志位,在总线上发出起始信号,激活TWI功能,开放TWI中断
(0034) #define Stop()						(TWCR=((1<<TWINT)|(1<<TWSTO)|(1<<TWEN))&(~(1<<TWIE)))
(0035) //清除中断标志位,在总线上发出终止信号,激活TWI功能,关闭TWI中断
(0036) #define TestAck() (TWSR&0xf8)
(0037) //TWSR--I2C状态寄存器,检查TWI状态,应该将预分频位屏蔽(第三位是保留位)
(0038) #define MT_NACK						(TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE))
(0039) //清除中断标志位,使能TWI功能,开放TWI中断,在主控接收状态下不对SDA线作应答
(0040) #define MT_ACK						(TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWEA))
(0041) //清除中断标志位,使能TWI功能,开放TWI中断,在主控接收状态下对SDA线作应答
(0042) #define TWItransmit(x)		{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);}
(0043) //写入8位数据到数据寄存器中,同时清除中断标志位,使能TWI功能,开放TWI中断
(0044) 
(0045) extern void delay_ms(unsigned int time);
(0046) 
(0047) unsigned char charData;//TWI中断中,传送的数据
(0048) unsigned char charAddr;//TWI中断中,数据所处的EEPROM地址
(0049) unsigned char charState;//TWI中断中,中断所处的状态
(0050) 
(0051) void TWI_init(void)
(0052)  {
(0053) 	charState=EE_READ;
_TWI_init:
    0330 EF80      LDI	R24,0xF0
    0331 93800093  STS	charState,R24
(0054) 	TWBR=0x20;//波特率寄存器,正常情况下应不小于10
    0333 E280      LDI	R24,0x20
    0334 B980      OUT	0x00,R24
(0055) 	TWSR=0x00;//TWI状态寄存器,时钟分频值1
    0335 2422      CLR	R2
    0336 B821      OUT	0x01,R2
    0337 9508      RET
_TWI_Ready:
    0338 922A      ST	R2,-Y
    0339 930A      ST	R16,-Y
    033A 931A      ST	R17,-Y
    033B 938A      ST	R24,-Y
    033C 939A      ST	R25,-Y
    033D 93EA      ST	R30,-Y
    033E B62F      IN	R2,0x3F
    033F 922A      ST	R2,-Y
(0056)  }

⌨️ 快捷键说明

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