📄 main.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 + -