📄 main.c
字号:
/* 2004.06.05
****************************************
** Copyright (C) W.ch 1999-2004 **
** Web: http://www.winchiphead.com **
****************************************
** USB Host File Interface for CH375 **
** TC2.0@PC, WinAVR_GCC_3.45@AVR **
****************************************
*/
/* CH375 主机文件系统接口 */
/* 支持: FAT12/FAT16/FAT32 */
/* AVR单片机C语言的U盘文件读写示例程序 */
/* 该程序将U盘中的/C51/CH375HFT.C文件中的前600个字符显示出来,
如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名,
如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名,
最后将程序ROM中的一个字符串写入写入新建的文件"NEWFILE.TXT"中
*/
/* CH375的INT#引脚采用查询方式处理, 数据复制方式为"内部复制", 本程序适用于ATmega128单片机, 串口0输出监控信息,9600bps */
/* 本例以字节为单位读写U盘文件,读写速度较扇区模式慢,但是由于字节模式读写文件不需要文件数据缓冲区FILE_DATA_BUF,
所以总共只需要600字节的RAM,适用于单片机硬件资源有限、数据量小并且读写速度要求不高的系统 */
/* AVR-GCC -v -mmcu=atmega128 -O2 -xc CH375HFT.c -oCH375HFT.ELF -lCH375HFD */
/* AVR-OBJCOPY -j .text -j .data -O ihex CH375HFT.ELF CH375HFT.HEX */
//#include <string.h>
//#include <stdio.h>
//********************************************
#include "common.h"
#include "beep.h"
#include "clock.h"
#include "display.h"
#include "flash.h"
#include "flash_sub.h"
#include "key.h"
#include "RS232.h"
//#include "usb.h"
#include "fm1808.h"
#include "kaiguan.h"
#include "comsub.h"
#include "print_1.h"
//*******************************************
#define F_CPU 7372800 /* 单片机主频为16MHz,用于延时子程序 */
//#include <util/delay.h>
//#include <avr/io.h>
//#include <macros.h>
const prog_char product_head[ ] = "——车辆行驶记录仪——";
const prog_char product_head1[ ] = "———苏州广福公司——";
const prog_char chepai_head[ ] = "车牌号码:";
//const prog_char *CheLiangHaoMa= "苏E 88888";
const prog_char fenlei_head[ ] = "车牌分类:";
//uchar *ChePaiFenLei = "大型卡车";
const prog_char jsy_head[ ] = "驾驶员代码:";
//uchar num_str[] ="123";
const prog_char jsz_head[ ] = "驾驶证号码:";
//uchar *JiaShiZhengHaoMa = "D88888888888888889";
const prog_char time_head[ ] = "打印时间:";
const prog_char speed_head[ ] = "停车前15分钟平均速度:";
const prog_char tired_head[ ] = "疲劳驾驶纪录:";
const prog_char tired_no_head[ ] = "无纪录";
const prog_char tired_s_head[ ] = "开始时间";
const prog_char tired_e_head[ ] = "结束时间";
const prog_char tired_l_head[ ] = "记录:";
/* 以下定义的详细说明请看CH375HF9.H文件 */
#define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
#define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
#define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
#define CH375_INT_WIRE ( PINE & 0x10 ) /* PINB.4, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */
#define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */
#include "CH375HFD.H"
#define CH375_CMD_PORT_ADDR 0xff01 //0x5FFF
#define CH375_DAT_PORT_ADDR 0xff00 //0x5EFF
/* 有些AVR单片机提供开放系统总线,那么直接将CH375挂在其系统总线上,以8位I/O方式进行读写 */
/* 虽然Atmega128提供系统总线,不过本例假定不开放系统总线,所以用I/O引脚模拟产生CH375的并口读写时序 */
/* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述3个并口读写子程序) */
/* 单片机的引脚 CH375芯片的引脚
PINB.4 INT#
PORTB.3 A0
PORTB.2 CS#
PORTB.1 WR#
PORTB.0 RD#
PORTA(8位端口) D7-D0 */
#ifdef F_CPU
// 使用系统delay.h中提供函数
#define mDelay1uS( ) _delay_us(1)
#else
void mDelay1uS( ) /* 至少延时1uS,根据单片机主频调整 */
{
// UINT16 i;
// for ( i = 5; i != 0; i -- );
// 以上代码会被优化掉,所以用嵌入式汇编
UINT8 count = 5; /* 延时1uS,3x50nS@20MHz */
__asm__ volatile (
"1: dec %0" "\n\t"
"brne 1b"
: "=r" (count)
: "0" (count)
);
}
#endif
//-------------------------
void Usb_Read();
void Usb_Write();
uchar *pCodeStr;
//--------------------------
void port_init(void)
{
// PORTA = 0x00;
// DDRA = 0x00;
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x03;
DDRD = 0xEF;
PORTE = 0x00;
DDRE = 0x0c;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//设置T1和捕捉功能
void set_T1(void)
{TCCR1A= 0x00;
TCCR1B= 0X81;
TCCR1C= 0X00;
speed_cn=0;
speed_cap=0;
TCNT1=0;
}
//设置T3和输出
void set_T3(void)
{
OCR3A=0X0732;
TCCR3A= 0x40;
TCCR3B= 0X09;
TCCR3C= 0X00;
TCNT3=0;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
// CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
MCUCR = 0x80;
EICRA = 0x00; //extended ext ints
EICRB = 0x20; //extended ext ints,int6低电平中断
EIMSK = 0x40;
set_T1();
TIMSK = 0x24; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
TIFR=0X00;
EIFR=0x00;
// SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
{
// DDRA = 0x00; /* 设置8位并口为输入 */
// PORTB = 0x07; /* 设置CS,WR,RD默认为高电平 */
// DDRB = 0x0F; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */
}
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */
{
mDelay1uS( ); mDelay1uS( ); /* 至少延时1uS */
// PORTB |= 0x08; /* 输出A0=1 */
// PORTA = mCmd; /* 向CH375的并口输出数据 */
// DDRA = 0xFF; /* 并口D0-D7输出 */
// PORTB &= 0xF9; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */
// DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
// PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */
// DDRA = 0x00; /* 禁止数据输出 */
// PORTB &= 0xF7; /* 输出A0=0; 可选操作 */
*(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd;// 通过并口直接读写CH375而非普通I/O模拟 */
// CH375_CMD_PORT=mCmd;
mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */
}
void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */
{
// PORTA = mData; /* 向CH375的并口输出数据 */
// DDRA = 0xFF; /* 并口D0-D7输出 */
// PORTB &= 0xF1; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */
// DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
// PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */
// DDRA = 0x00; /* 禁止数据输出 */
*(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; // 通过并口直接读写CH375而非普通I/O模拟 */
mDelay1uS( ); /* 至少延时1.2uS */
}
UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */
{
UINT8 mData;
mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; // 通过并口直接读写CH375而非普通I/O模拟 */
mDelay1uS( ); /* 至少延时1.2uS */
// mDelay1uS( ); /* 至少延时1.2uS */
// DDRA = 0x00; /* 数据输入 */
// PORTB &= 0xF2; /* 输出有效读控制信号, 读CH375芯片的数据端口, A0=0; CS=0; WR=1; RD=0; */
// DDRA = 0x00; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
// mData = PINA; /* 从CH375的并口PA输入数据 */
// PORTB |= 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */
return( mData );
}
/* 在P0.2连接一个LED用于监控演示程序的进度,低电平LED亮 */
#define LED_OUT_INIT( ) { ; } /* PORTB.7 高电平为输出方向 */
#define LED_OUT_ACT( ) {; } /* PORTB.7 低电平驱动LED显示 */
#define LED_OUT_INACT( ) { ; } /* PORTB.7 低电平驱动LED显示 */
/* 延时指定毫秒时间,根据单片机主频调整,不精确 */
void mDelaymS( UINT8 ms )
{
UINT16 i;
while ( ms -- ) for ( i = 1000; i != 0; i -- ) mDelay1uS( );
}
/* 检查操作状态,如果错误则显示错误代码并停机 */
void mStopIfError( UINT8 iError )
{
if ( iError == ERR_SUCCESS ) return; /* 操作成功 */
printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */
while ( 1 ) {
LED_OUT_ACT( ); /* LED闪烁 */
mDelaymS( 100 );
LED_OUT_INACT( );
mDelaymS( 100 );
}
}
/* 为printf和getkey输入输出初始化串口 */
int uart_putchar( char c, FILE *stream )
{
if (c == '\n') uart_putchar( '\r', stream );
while ( ( UCSR0A & (1<<UDRE) ) == 0 );
UDR0 = c;
return 0;
}
FILE uart_str = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );
void mInitSTDIO( )
{
UBRR0H = 0;
UBRR0L = 103; /* 9600bps@16MHz */
UCSR0B = 0x18; /* BIT(RXEN) | BIT(TXEN); */
UCSR0C = 0x06; /* BIT(UCSZ1) | BIT(UCSZ0); */
stdout = stdin = &uart_str;
}
//***************************
void DelayMs(uint t)
{
uint i;
for(i =0;i<t;i++)
_delay_loop_2( 250*FREQ );
}
void delay(void)
{uchar i;
//for(i=0;i<4;i++)
asm("nop");
asm("nop");
asm("nop");
}
//***************************
//USB
void Usb_InitZX(void)
{
MCUCR |=_BV(SRE) |_BV(SRW10); //外部SRAM可用 SRW10高段WAIT
MCUCR |=0xc0;
XMCRA |= _BV(SRW11);
XMCRA |=0x0e;
DDRD = 0XFF;
DDRB = 0XFF;
PORTB |=_BV(PB7);
USBCS;
}
//****************************
int main( ) {
// UINT8 speed_cn,speed_cap,speed,acc_x,acc_y;
// UINT32 tmp;
uchar *p1,i,i1,i2;
UINT16 TotalCount,j,j1,j2;
ulong TLL;
UINT8 *pCodeStr;
//***************************
//液晶显示
// speed =100;
// speed_dot = 9;
MCUCR=0XC0;
XMCRA=0X0E;
//------------------------------------
FM_CS;
Flash_InIt();
//Usb_Read();
Usb_Write();
while(1)
{
i =0;
}
//------------------------------------
EICRA=0X00;
EICRB=0X20;
EIMSK=0X40;
jsq1=0;
jsq2=0;
// FM_CS;
// rt_index_buf1=0;
// rt_index_buf=0;
Status_run=0;
Ini_speed();
Dis_Pin=36;
Disp_pwm();
LCD_INT();
CLEAR();
DelayMs(2000);
Xs();
TIFR=0X00;
// SET_SQR();
//------------------------------------
FM_CS;
Usb_Read();
while(1)
{
i =0;
}
//------------------------------------
SET_Ini();
SYS_Time[0]=0x00;
SYS_Time[1]=0x01;
SYS_Time[2]=0x20;
SYS_Time[3]=0x10;
SYS_Time[4]=0x07;
SYS_Time[5]=0x06;
SYS_Time[6]=0x10;
SYS_Time[7]=0x06;
// SET_Time();
TCNT1=0x0000;
TCCR1B=0X81;
speed_cap=1;
speed_cn=0;
TCCR1A=0;
TCCR1C=0;
TIMSK=0X24;
ETIMSK=0X00;
TIFR=0X00;
ETIFR=0X00;
CLOCK_RTIME();
TCCR1B=0X80;
EIFR=0X00;
Receive0_lp=0;
Rs232_Init();
Rs232_1_Init();
Flash_InIt();
sei();
/*
//****************************************
while(1)
{i=0;
}
Usb_Initzx();
BeeP();
// Clock_Init();
LCD_INT();
Flash_InIt();
// Key_InIt();
//****************************************
init_devices(); */
Status_run=0;
Status1=0;
while(1)
{ key_v=GetKey(); //读入按键值
io_v=Get_IO();
IC_SELECT=0X07;
FM_CS;
p1=Tzx_Buf;
tzxs=(*p1*256+*(p1+1))*256+*(p1+2);
tzxs=1000;
if(speed>speed_warm_up)
PORTE|=(1<<2);
else
PORTE&=~(1<<2);
DDRE|=(1<<2);
Flash_S =0; //tiaoshi
// Staut0=0; //tiaoshi
// d360_save_flag2=NOOP; //NEEDSAVE;
if(d360_save_flag2==NEEDSAVE)
{Flash_Save(); //flash 需要保存
LoadPage(1,com1subbuf,528);
i=0;}
else
if((Staut0&0x01)==1) //通讯部分
{ j2 = Receive0[3] * 256 + Receive0[4] + 6; //CRC校验
i = Receive0[0];
for(j1=1;j1<j2;j1++)
i=i ^ Receive0[j1];
if(i!=Receive0[j2])
{ Staut0&=~(1<<0);
UCSR0B =0X48;
Send0[0]=0x05;
Send0[1]=0x55;
Send0[2]=0x7a;
Send0[3]=0xfa;
Send0[4]=0x00;
Send0[5]=0xd5;
Send0_lp=2;
UDR0=Send0[1];
}
else
{ Staut0&=~(1<<0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -