📄 main.c
字号:
//********************************
// 主程序
// 编译环境WinAVR GCC
// 2007-01-9
// hjxiang
//********************************
//标准C头文件
#include <stdint.h>
#include <stdlib.h>
//AVR头文件
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
//自定义头文件
#include "usb.h"
#include "epphal.h"
#include "d12ic.h"
#include "isr.h"
#include "main.h"
extern void (*StandardDeviceRequest[])(void);
extern void (* VendorDeviceRequest[])(void);
#define F_IO 16000000 //单片机外部时钟频率
#define baud 1200 //串口通信波特率
#define RD_N 4
#define WR_N 5
#define ALE 6
#define CS_N 7
#define RESET_N 3
#define TXD232 1
#define INT_N 2
#define MCU_D12_CS_0() PORTB&=~(1<<CS_N)
#define MCU_D12_CS_1() PORTB|=(1<<CS_N)
#define LEDon() PORTB&=~(1<<PB1)
#define LEDoff() PORTB|=(1<<PB1)
void LED(void)
{
while(1)
{
PORTC=0xff;
}
}
void IO_Init(void)
{
DDRB=(1<<CS_N)|(1<<RD_N)|(1<<WR_N)|(1<<RESET_N)|(1<<ALE);
PORTB=(1<<CS_N)|(1<<RD_N)|(1<<WR_N)|(1<<RESET_N)|(1<<ALE);
DDRD=(0<<INT_N)|(1<<TXD232);
DDRC=0xff;
PORTC=0;
}
//USART初始化
void USART_Init(void)
{
/*设置波特率*/
UCSRA = 0x00;
//*接收器与发送器使能,接收结束中断使能*/
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/*设置帧格式:8个数据位,1个停止位,偶校验位*/
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1);
UBRRH =(F_IO/baud/16-1)/256;
UBRRL =(F_IO/baud/16-1)%256;
}
//串口发送数据
void put_c(unsigned char cData) //发送采用查询方式
{
while( !(UCSRA & (1<<UDRE)) );
UDR=cData;
}
void put_s(unsigned char *ptr)
{
while (*ptr)
{
put_c(*ptr++);
}
put_c(0x0D);
put_c(0x0A); //结尾发送回车换行
}
//中断初始化
void Inter_Init(void)
{
MCUCR=0; //int0低电平中断
GICR=(1<<INT0);
}
SIGNAL(SIG_INTERRUPT0)
{
fn_usb_isr();
}
void main(void)
{
IO_Init();
USART_Init();
Inter_Init();
bEPPflags.value=0; //清除事件标志寄存器bEPPflags
reconnect_USB();
sei();
while(1)
{
if (bEPPflags.bits.bus_reset) //总线复位处理
{
bEPPflags.bits.bus_reset = 0; //清标志
}
if (bEPPflags.bits.suspend) //总线挂起处理
{
bEPPflags.bits.suspend= 0; //清标志
}
if (bEPPflags.bits.setup_packet) //协议处理
{
bEPPflags.bits.setup_packet = 0; //清标志
control_handler();
}
}
}
//断开USB总线
void disconnect_USB(void)
{
//初始化D12工作状态,断开Soft Connect上拉电阻
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}
//连接USB总线
void connect_USB(void)
{
DISABLE;
bEPPflags.value=0; //清除事件标志
ENABLE;
//初始化D12工作状态,接通Soft Connect上拉电阻
D12_SetDMA(0);
D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_12M );
}
//重新连接到USB
void reconnect_USB(void)
{
unsigned long clk_cnt;
disconnect_USB();
for(clk_cnt=0;clk_cnt<50000;clk_cnt++)
;
connect_USB();
}
//USB处理子程序
void control_handler(void)
{
unsigned char type,req;
type=ControlData.DeviceRequest.bmRequestType & USB_REQUSET_TYPE_MASK;
req=ControlData.DeviceRequest.bRequest & USB_REQUSET_MASK;
// put_c(req);
if(type == USB_STANDERD_REQUEST)
(*StandardDeviceRequest[req])();
else
if(type==USB_VENDOR_REQUEST)
(*VendorDeviceRequest[req])();
else
stall_ep0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -