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

📄 main.c

📁 《AVR单片机GCC程序设计》
💻 C
字号:
/*
	文件名:main.c
	功  能:LuckyProg2004下位机程序编程框架
	硬件  :	CA-M8(ChipArt-Mega8)
	编  译: WinAVR-20040404
	时  钟:外部4MHz
	
	更改记录:
	2004-11-20      	
*/
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "usart.h"
#include "lp2004.h"

#define FREQ 4		//系统时钟(MHz)
#define DEVICE_ID 0X33	//器件ID

#define SET_RED_LED PORTB&=~_BV(PB1)
#define CLR_RED_LED PORTB|=_BV(PB1)

#define SET_YEL_LED PORTB&=~_BV(PB0)
#define CLR_YEL_LED PORTB|=_BV(PB0)

uchar g_aCommand[5];	//接收命令缓冲区
uchar g_aConfigBits[4];//配置位缓冲,可以不用

//固件信息数据(至少24字节)
const char g_firmmsg[] PROGMEM = "芯艺    QQ:27796915     ";

//延时 t ms
void DelayMs(uint t)
{
	uint i;
	for(i=0;i<t;i++)
		_delay_loop_2(FREQ * 250);
}

//发送应答命令
void ack()
{
	uchar *p=UartGetBuffer();
	p[0]=LP_ACK;
	UartSend(1);
}

//超时检测功能的UART接收例程
uchar UartRecvEx(uint len,uint timeout)
{
	uint count=0;
	UartRecv(len,UART_NO_WAIT);
	while(1)
	{
		count++;
		DelayMs(1);
		if(UartIsRecvComplate())
			return 1;
		if(count>=timeout)
			return 0;
	}
}
//处理LP_WRITE_FLASH命令例程
void WriteFlash(void)
{
	uint i;
	uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
	
	for(i=0;i<PacketCount;i++)
	{
		ack();
		if(!UartRecvEx(LP_PACKET_SIZE,2000))
			break;
		//请将以下语句替换为写FLASH的代码
		DelayMs(100);
	}
	ack();
	//UART_PACKET_SIZE
}
//处理LP_READ_FLASH命令例程
void ReadFlash(void)
{
	uint i;
	uchar j,*p;
	uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
	p=UartGetBuffer();
	
	ack();
	
	for(i=0;i<PacketCount;i++)
	{
		if(!UartRecvEx(1,2000))
			break;
		//请将以下语句替换为读FALSH的代码
		for(j=0;j<LP_PACKET_SIZE;j++)
			p[j]=0x88;
			
		UartSend(LP_PACKET_SIZE);
	}
}
//处理LP_WRITE_EEPROM命令例程
void WriteEeprom(void)
{
	uint i;
	uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
	
	for(i=0;i<PacketCount;i++)
	{
		ack();
		if(!UartRecvEx(LP_PACKET_SIZE,2000))
			break;
		//请将以下语句替换为写EEPROM的代码
		DelayMs(100);
	}
	ack();
}
//处理LP_READ_EEPROM命令例程
void ReadEeprom(void)
{
	uint i;
	uchar j,*p;
	uint PacketCount=g_aCommand[1]+(g_aCommand[2]<<8);
	p=UartGetBuffer();
	
	ack();
	
	for(i=0;i<PacketCount;i++)
	{
		if(!UartRecvEx(1,2000))
			break;
		//请将以下语句替换为读EEPROM的代码
		for(j=0;j<LP_PACKET_SIZE;j++)
			p[j]=0x99;
			
		UartSend(LP_PACKET_SIZE);
	}	
}
//处理LP_WRITE_BITS命令例程
void WriteBits(void)
{
	g_aConfigBits[0]=g_aCommand[1];	
	g_aConfigBits[1]=g_aCommand[2];
	g_aConfigBits[2]=g_aCommand[3];
	g_aConfigBits[3]=g_aCommand[4];
	//请在此输入写配置位代码
	ack();
}
//处理LP_READ_BITS命令例程
void ReadBits(void)
{
	uchar *p;
	p=UartGetBuffer();
	
	//请在此输入读配置位代码
	p[0]=LP_READ_BITS;
	p[1]=g_aConfigBits[0];
	p[2]=g_aConfigBits[1];
	p[3]=g_aConfigBits[2];
	p[4]=g_aConfigBits[3];
	UartSend(5);
}
//处理LP_ERASE_DEVICE命令例程
void EraseDevice(void)
{
	//请在此输入擦除器件的代码
	ack();
}
//处理LP_RESET_DEVICE命令例程
void ResetDevice(void)
{
	//请在此输入复位器件的代码
	ack();
}
//处理LP_READ_FIRMWARE_MSG命令例程
void ReadFirmwareMsg(void)
{
	uchar i;
	uchar *p=UartGetBuffer();
	for(i=0;i<24;i++)
		p[i]=pgm_read_byte(g_firmmsg+i);
	UartSend(24);
}
//入口函数
int main(void)
{
	uchar i;
	uchar *p=UartGetBuffer();
	
	DDRB=_BV(PB0)|_BV(PB1);
	PORTB=0X03;
	
	UartInit();
	sei();
	
	while(1)
	{
		CLR_RED_LED;
		SET_YEL_LED;
		//接收器件ID 或回复器件检测命令
		UartRecv(1,UART_WAIT);
		CLR_YEL_LED;
		SET_RED_LED;
		if(p[0]==DEVICE_ID)
		{
			ack();
		}
		else if(p[0]==LP_ACK)//LP_SCAN_HARDWAR
		{
			ack();		
			continue;
		}
		else
		{
			continue;
		}
		
		//接收命令
		if(!UartRecvEx(5,2000))
			continue;
		for(i=0;i<5;i++)
			g_aCommand[i]=p[i];

		switch(g_aCommand[0])
		{
		case LP_WRITE_FLASH:
			WriteFlash();
			break;
		case LP_READ_FLASH:
			ReadFlash();
			break;
		case LP_WRITE_EEPROM:
			WriteEeprom();
			break;
		case LP_READ_EEPROM	:
			ReadEeprom();
			break;
		case LP_ERASE_DEVICE:
			EraseDevice();
			break;
		case LP_WRITE_BITS  :
			WriteBits();
			break;
		case LP_READ_BITS:
			ReadBits();
			break;
		case LP_RESET_DEVICE:
			ResetDevice();
			break;
		case LP_READ_FIRMWARE_MSG:
			ReadFirmwareMsg();
			break;
		default:
			break;
		}//switch
	}//while(1)
}//main

⌨️ 快捷键说明

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