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

📄 main.c

📁 双龙公司开发版源程序
💻 C
字号:
/*******************************************/
/*            广州天河双龙电子公司         */
/*            http://www.sl.com.cn         */
/*           BOOT引导IAP应用演示程序       */
/*             作者:ntzwq@wx88.net         */
/*                2002年5月11日            */
/*   目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
/*******************************************/
#include "self.h"
#include "assembly.h" 
#include<iom8v.h>
#define fosc 8000000 //晶振8MHZ
#define baud 19200	 //波特率
#define osc_address   0x1ff0  //晶振校准字节的地址,此地址也可以是eeprom单元。
extern unsigned char read_flash(unsigned int add);
/*  		字符输出函数 		 */
void sendchar(unsigned char c)
	{	 
     while (!(UCSRA&(1<<UDRE)));
	 UDR=c;    
	}
/*  		字符输入函数 		 */	
unsigned char recchar(void)
  	{
	 while(!(UCSRA& (1<<RXC)));
     return UDR;
	}		
/*			UART初始化				*/	
void uart_init(void)
{
 OSCCAL=read_flash(osc_address);//对内部RC OSC调整
 UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
 UBRRL=(fosc/16/(baud+1))%256;
 UBRRH=(fosc/16/(baud+1))/256;
 UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
}
void iap(void)
{
    unsigned int intval,address,data;
    unsigned char val, ldata;
     for(;;)                           
      {
       val=recchar();         
       if(val=='a')                    //Autoincrement?
          { 
		   sendchar('Y');				    //Autoincrement is quicker
		  }
       else if(val=='A')                   //write address 
          {
           address=recchar();                //read address 8 MSB
           address=(address<<8)|recchar();
           address=address<<1;               //convert from word address to byte address
           sendchar('\r');
          }
        else if(val=='c')                   //Write program memory, low byte
          {       
           ldata=recchar();
           sendchar('\r');
          }
        else if(val== 'C')                  //Write program memory, high byte 
          {
           data=ldata|(recchar()<<8);
           fill_temp_buffer(data,(address)); //call asm routine. 
           address+=2;  
           sendchar('\r');
          }        
         else if(val=='e')                   //Chip erase 
          {
           for(address=0;address < APP_END;address += PAGESIZE)  //Application section = 60 pages
             {
              write_page(address,0x03);       //Perform page erase
             }
           sendchar('\r');        
          }
         else if(val=='l')                   // write lockbits 
          {
           write_lock_bits(recchar());
           sendchar('\r');
          }       
         else if(val== 'm')                  // write page
          {
           write_page((address),0x05);       
           sendchar('\r');
          }        
         else if((val=='P')||(val=='L'))     // Enter programming mode 
          {
           sendchar('\r');
          }
         else if (val=='p')
          {
           sendchar('S');
          }              
         else if(val=='R')                   //Read program memory 
          {
		   if (address>=APP_END)
		     {
			  sendchar(0xff);
			  sendchar(0xff);
			  address+=2;
			 }
		   else
		     {           
              intval=read_program_memory(address,0x00);
              sendchar((char)(intval>>8));      //send MSB  
              sendchar((char)intval);           //send LSB
              address+=2;
		     }  
          }        
         else if (val == 'D')
          {
           EEARL = address;
           EEARH = (address >> 8);
           address++;
           EEDR = recchar();
           EECR |= (1<<EEMWE);
           EECR |= (1<<EEWE);
           while (EECR & (1<<EEWE))
              ;
           sendchar('\r');
           }
          else if (val == 'd')
           {
            EEARL = address;
            EEARH = (address >> 8);
            address++;
            EECR |= (1<<EERE);
            sendchar(EEDR);
           }       
          else if(val=='F')                   // read fuse bits
           {
            sendchar(read_program_memory(0x0000,0x09));
           }        
          else if(val=='r')                   // read lock bits
           {
            sendchar(read_program_memory(0x0001,0x09));
           }        
          else if(val=='N')                   // read high fuse bits
           {
            sendchar(read_program_memory(0x0003,0x09));
            }        
          else if(val=='t')                   // Return programmer type 
           {
            sendchar(device);
            sendchar(0);
            }
          else if ((val=='x')||(val=='y')||(val=='T'))
            {
             recchar();
             sendchar('\r');
            }       
          else if (val=='S')                  // Return software identifier 
            {
             sendchar('A');
             sendchar('V');
             sendchar('R');
             sendchar('B');
             sendchar('O');
             sendchar('O');
             sendchar('T');
            }			                       
          else if (val=='V')                  // Return Software Version
            {
             sendchar('1');
             sendchar('0');
             }        
          else if (val=='s')                  // Return Signature Byte
            {							
             sendchar(sig_byte3);
             sendchar(sig_byte2);
             sendchar(sig_byte1);
            }       
          else if(val!=0x1b)                  // if not esc
            {
             sendchar('?');
             }
         }	
}
void main(void)
{
    void (*funcptr)( void ) = 0x0000;       // Set up function pointer
	DDRD=0;
	PORTD=0xff;	
    uart_init();
	if ((PIND&0x04)==0)   
       {
	    PORTD=0;
	    iap();
	   }
	else
	   funcptr();   
}

⌨️ 快捷键说明

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