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

📄 appli.c.bak

📁 压缩包中包括多个常用的汇编
💻 BAK
📖 第 1 页 / 共 3 页
字号:
    u_char k = 0;

    /* 搜索定时消息 */
    if (timer_int == 1)
    {
        timer_int = 0;
        if (timer_number > 0)
        {
            for (i=0; i<timer_number; i++)
            {
                j = timer_map[i];
                timer_count[j]++;
                if (timer_count[j] >=  timer_len[j])
                {
                    msg_first_push(MSG_TIMER, timer_id[j]);
                    timer_sign[j]  = 0;
                    timer_count[j] = 0;   /* 定时计数 */
                    k = 1;
                }
            }
            if (k != 0)
            {
                count_timer_map();
            }
        }
    }
     /* 键盘扫描 */
    key_setmenu_lcd();
    if (key_code != 0xFF) /* 如果有按键则停止采样定时 */
    {
        clear_timer(T_SAMPLE);
        tsample_flag = 0;
    }
    else if (!tsample_flag)/* 无按键并且采样定时器处于停止状态,则启动采样定时器 */
    {
        set_timer(QUERY_TIMER_LEN,0,T_SAMPLE);
        tsample_flag = 1;
    }

    com_command_receive(); /* 接收命令 */
}

/*计算CRC校验和使用MTT(0X1021)
参数:
 pBuff 为需计算CRC的缓冲区的头指针
 BufferLen 缓冲区长度(以字节计)
 */
u_short CalCRC16_1021(u_char x[], u_short BufferLen)
{
    u_short i;
    u_char  j;
    u_short crc16 = 0;
    u_short mask = 0x1021;
    u_char *pByteBuffer;
    u_char tmpbyte;
    u_short calval;

    pByteBuffer = &x[0];

    for (i = 0; i < BufferLen; i++)
    {
        tmpbyte = *pByteBuffer;
        calval = tmpbyte << 8;
        for (j = 0; j < 8; j++)
        {
            if ((crc16 ^ calval) & 0x8000)
                crc16 = (crc16 << 1) ^ mask;
            else
                crc16 <<= 1;

            calval <<= 1;
        }
        pByteBuffer++;
    }
    return crc16;
}

/* 串行接收处理 */
void com_command_receive(void)
{
    u_char var1,var4;
    u_int crc_data = 0;
    var4 = pint_read;

    if (var4 != pint_write)
    {
        var1 = pint_buf[var4];
        var4 = var4+1;
        if (var4 >= MAX_RINTL)
            var4=0;

        pint_read = var4;

        switch(serial_flag)
        {
            case 0: /*收到起始位*/
                if (var1 == SYN)
                {
                    serial_flag = 1;
                }
                else
                {
                    serial_flag = 0;
                }
                break;

            case 1:/*收到起始位*/
                if (var1 == SYN)
                {
                    serial_flag = 2;
                }
                else
                {
                    serial_flag = 0;
                }
                break;

            case 2:/*收到同步位*/
                if (var1 == STX)
                {
                    serial_flag = 3;
                }
                else
                {
                    serial_flag = 0;
                }
                break;

            case 3: /*收到组地址*/
                if (var1 == ADDRESS[0])
                {
                    serial_flag = 4;
                    prec_num = 1;
                    prec_buf[0] = var1;
                }
                else
                {
                    serial_flag = 0;
                }
                break;

            case 4:/*收到本机地址或者广播地址*/
                if ( (var1 == ADDRESS[1]) || (var1 == 0) )
                {
                    prec_num = 2;
                    prec_buf[1] = var1;
                    serial_flag = 5;
                }
                else
                {
                    serial_flag = 0;
                }
                break;

            case 5:/*数据长度*/
                prec_num = 3;
                prec_buf[2] = var1;
                serial_lengthl = var1;
                serial_flag = 6;
                break;

            case 6:
                prec_num = 4;
                prec_buf[3] = var1;
                serial_length |= var1;
                serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
                serial_flag = 7;
                break;

            case 7:
                prec_buf[prec_num] = var1;
                prec_num++;
                serial_length--;
                if (serial_length == 0)
                {
                    crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 计算crc校验和(从组地址开始到ETX )*/

                    if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校验和正确 */
                    {
                        prec_num = 1;
                        var1 = 0;

                        if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */
                        {
                            if (prec_buf[1] != 0x00) /* 如果不是广播地址则回应ACK*/
                                msg_last_push(MSG_ACK,0);

                            command_decoder(); /* 如果校验和正确,则进行命令解码 */
                        }
                        else
                        {
                            msg_last_push(MSG_NAK,0);/* 接收数据错误,则发送NAK */
                        }
                    }
                    else
                    {
                        msg_last_push(MSG_NAK,0);/* 接收数据错误,则发送NAK */
                    }
                    serial_flag = 0;
                    prec_num = 1;
                }
                break;

            default:
                serial_flag = 0;
                prec_num = 1;
                break;
        }
    }
}

/* 串口发送一个字节 */
void com_send_command(u_char onebyte)
{
    psend_int = 0;
    SBUF = onebyte;
    while (psend_int != 1);
}

/* 向主机发送消息帧,入口参数:消息类型 */
void send_command(u_char command)
{

    switch (command)
    {
        case ACK:
            com_send_command(SYN);
            com_send_command(SYN);
            com_send_command(ACK);
            break;

        case NAK:
            com_send_command(SYN);
            com_send_command(SYN);
            com_send_command(NAK);
            break;

        default:
            break;
    }
}

/* 系统消息进入栈首 */
void msg_first_push(u_char type, u_char value)
{
    if (msg_number < MAX_MSGNUM)
    {
         msg_number = msg_number + 1;

         if (msg_readp == 0)
         {
             msg_readp=MAX_MSGNUM-1;
         }
         else
         {
             msg_readp = msg_readp - 1;
         }

         msg_type[ msg_readp]  = type;
         msg_value[ msg_readp] = value;
    }
}

/* 系统消息进入栈尾 */
void msg_last_push(u_char type, u_char value)
{
    if (msg_number < MAX_MSGNUM)
    {
        msg_number = msg_number + 1;
        msg_type[ msg_writep]  = type;
        msg_value[ msg_writep] = value;
        msg_writep = msg_writep + 1;

        if (msg_writep >= MAX_MSGNUM)
        {
            msg_writep = 0;
        }
    }
}

/* 主消息处理子程序 */
void main_message_process(void)
{
    u_char i;
    u_int crc_data = 0;
    switch (msg_nowtype)
    {
        case MSG_TIMER:                   /* 定时器消息处理 */
            switch (msg_nowvalue)
            {
                case T_WATCHDOG:          /* 1秒定时到      */
                    clear_timer(T_WATCHDOG);
                    WDI = ~WDI;           /* 喂狗           */
                    set_timer(WD_TIMER_LEN, 0, T_WATCHDOG);

                    break;

                case T_SAMPLE:            /* 5秒定时到  */

                    clear_timer(T_SAMPLE);

                    /* add 20050922 */
                    clear_timer(T_LUMIN);
                    EX1  = 0;         /* 关外部中断1  */
                    /* end of add */

                    cur_temp = get_temperature();/* 读当前温度 */
                    analog_in_data = adc_1549(); /* 读当前模入*/
                    if (lcd_flag)
                    {
                        lcd_flag = 0;
                        sd2300_read_date();
                        show_time();
                    }
                    else
                    {
                        lcd_flag = 1;
                        show_current_environment(cur_temp, cur_lumin, analog_in_data, SWITCH_IN);
                    }

                    set_timer(QUERY_TIMER_LEN, 0, T_SAMPLE);

                    /* add 20050922 */
                    fhz_tlc555 = 0;
                    EX1  = 1;         /* 开外部中断1  */
                    set_timer(LUMIN_TIMER_LEN, 0, T_LUMIN);
                    /* end of add */

                    break;

                case T_LUMIN:         /* 2.5秒定时到  */
                    clear_timer(T_LUMIN);

                    EX1  = 0;         /* 关外部中断1  */
                    fhz_tlc555 = (fhz_tlc555 * 2) /5;
                    cur_lumin = calc_lumin(fhz_tlc555); /*计算当前光强*/
                    fhz_tlc555 = 0;
                    EX1  = 1;         /* 开外部中断1  */

                    set_timer(LUMIN_TIMER_LEN, 0, T_LUMIN);
                    break;

⌨️ 快捷键说明

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