#include <stc32g.h>				// 包含头文件
#include <stdio.h>				// 包含标准输入输出库
#include "stc32_stc8_usb.h"

char *USER_DEVICEDESC  = NULL;			
char *USER_PRODUCTDESC = NULL;			
char *USER_STCISPCMD   = "@STCISP#";    //// 不停电自动ISP下就命令,可以自定义

sbit SPI_SS = P2^2; 			// 从机选择引脚
sbit SPI_SCK = P2^5; 			// 时钟引脚
sbit SPI_MOSI = P2^3; 			// 主机输出从机输入引脚
sbit SPI_MISO = P2^6; 			// 主机输入从机输出引脚

//P3.2口按键复位所需变量
bit Key_Flag;
u16 Key_cnt;

#define MAIN_Fosc  24000000UL   // 主时钟频率

////void IspSendStr(char *p);		        // 串口发送字符串

void Delayms(u16 ms)		//@24.000MHz
{
    u16 i, j;
    i = 24000;
    j = ms;
    do
    {
         while (--j);    
    }
    while (--i); 
}

void sysini()
{
	EAXFR = 1; 						// 使能访问 XFR
	CKCON = 0x00; 					// 设置外部数据总线速度为最快
	WTST = 0x00;					// 设置程序代码等待参数，等待时间为0个时钟，CPU执行程序速度最快

	P0M1 = 0x00;P0M0 = 0x00;		// 设置P0口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P1M1 = 0x00;P1M0 = 0x00;		// 设置P1口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P2M1 = 0x00;P2M0 = 0xFF;		// 设置P2口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P3M1 = 0x00;P3M0 = 0x00;		// 设置P3口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P4M1 = 0x00;P4M0 = 0x00;		// 设置P4口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P5M1 = 0x00;P5M0 = 0x00;		// 设置P5口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P6M1 = 0x00;P6M0 = 0x00;		// 设置P6口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
	P7M1 = 0x00;P7M0 = 0x00;		// 设置P7口为准双向口模式 //00：准双向口 01：推挽输出 10：高阻输入 11：开漏输出
    
    //====== USB 初始化 ======
    P3M0 &= ~0x03;
    P3M1 |= 0x03;    
    IRC48MCR = 0x80;  //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));    
    USBCLK = 0x00;
    USBCON = 0x90;
    //========================
}

void SPI_Init(void)        /* 初始化SPI */
{  
    SPI_SS = 1;            /* 主机输出从机输入引脚，拉低，使能SPI */
    SPI_SCK = 0;           /* 主机输入从机输出引脚，拉低，使能SPI */
    SPI_MOSI = 0;          /* 主机输出从机输入引脚，拉低，使能SPI */
    SPI_MISO = 0;          // 主机输入从机输出引脚，拉低，使能SPI
    DORD=1;                // 数据顺序，高位在前MSB
    SPCTL=0X50;            // 设置SPI工作方式，0000 0000 0101 0000
    SPSTAT=0XC0;           // 设置SPI状态，0110 0000
    ESPI = 1;              // 使能SPI
    EA = 1;                // 开总中断
    SPI_S1 = 0;            // 设置SPI状态，0000 0000
    SPI_S0 = 1;            // 设置SPI状态，0000 0001
}


 u16 usb_read_reg()       //读取寄存器
{
    u16 result;
    u8 high_byte, low_byte; 
   SPIF = 1;                                //SPI中断标志位。写1进行清零。
    high_byte = SPDAT;                 // 从寄存器中读取高8位数据
    SPIF = 1;                       //SPI中断标志位。写1进行清零。
    low_byte = SPDAT;              // 从寄存器中读取低8位数据    
    result = ((u16)high_byte<< 8) | low_byte;  // 将高8位和低8位数据合并成一个16位数据
    return result;                              // 返回读取到的数据
}

void ASD7870_init()                                  /* 初始化ASD7870 */
{
    SPI_Init();                                     // 初始化SPI
    SPI_SS = 0;
    SPDAT=0X00;
    SPI_SS = 1;
}

void IspSendStr(char *p)			    // 发送字符串函数
{
	while (*p)							// 字符串结束标志‘\0’前循环
	{
		SPDAT=(*p++);				    // 逐个发送字符串的字符
	}
}

void main(void)
{
    sysini() ;                             // 系统初始化
   usb_init();
    EA = 1;
    P2 = 0X00;
    EUSB = 1;
   ASD7870_init()   ;                     // 初始化ASD7870  
    
    while(1)                               // 循环
	{
        if(!P35)
        {
        IspSendStr(0x2401);
        usb_read_reg();              // 读取寄存器
        P2 = 0XFF;
        Delayms(500);                      // 延时500ms
        P2 = 0X00;
	    }

	}
}
