📄 tcxoboard.lst
字号:
(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 + -