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

📄 cpu.c

📁 STC51系列的源码
💻 C
字号:
/********************************************************************************/
/* filename : CPU.h                                                             */
/* created  : xillinx                                                           */
/* descript : 选择CPU的类型                                                     */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../CFG/CFG.h"
#include "../UART/UART.h"

extern unsigned int system_timer;
unsigned char data CPU_soft_timer_lo=0x0;
unsigned char data CPU_soft_timer_hi=0x0;

/********************************************************************************/
/* 地址定义表,由7412138译码,最高位必须为1<G引脚>,其余3位组合                    */
/* +-----+-----+-----+-----+                                                    */
/* | A15 | A14 | A13 | A12 |                                                    */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  0  |  0  |  0  |     0x8000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  0  |  0  |  1  |     0x9000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  0  |  1  |  0  |     0xA000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  0  |  1  |  1  |     0xB000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  1  |  0  |  0  |     0xC000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  1  |  0  |  1  |     0xD000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  1  |  1  |  0  |     0xE000                                         */
/* +-----+-----+-----+-----+                                                    */
/* |  1  |  1  |  1  |  1  |     0xF000                                         */
/* +-----+-----+-----+-----+                                                    */
/********************************************************************************/
unsigned char volatile xdata c51_hc138_cs1[0x1000]      _at_ 0x8000;
unsigned char volatile xdata c51_hc138_cs2[0x1000]      _at_ 0x9000;
unsigned char volatile xdata c51_hc138_cs_io2[0x1000]   _at_ 0xA000;
unsigned char volatile xdata c51_hc138_cs_lcd1[0x1000]  _at_ 0xB000;
unsigned char volatile xdata c51_hc138_cs_lcd2[0x1000]  _at_ 0xC000;
unsigned char volatile xdata c51_hc138_cs_keyr[0x1000]  _at_ 0xD000;
unsigned char volatile xdata c51_hc138_cs_keyw[0x1000]  _at_ 0xE000;
unsigned char volatile xdata c51_hc138_cs_mt[0x1000]    _at_ 0xF000;

unsigned char volatile c51_U07_latch;   //* U7数据寄存器
unsigned char volatile c51_U19_latch;   //* CS-IO2寄存器

cpu_interrupt_function CPU_001_tick_process;
cpu_interrupt_function CPU_002_tick_process;
cpu_interrupt_function CPU_004_tick_process;
cpu_interrupt_function CPU_008_tick_process;
cpu_interrupt_function CPU_010_tick_process;
cpu_interrupt_function CPU_020_tick_process;
cpu_interrupt_function CPU_040_tick_process;
cpu_interrupt_function CPU_080_tick_process;
cpu_interrupt_function CPU_100_tick_process;
cpu_interrupt_function CPU_200_tick_process;
cpu_interrupt_function CPU_400_tick_process;
cpu_interrupt_function CPU_extern_0_process;
cpu_interrupt_function CPU_extern_1_process;
cpu_interrupt_function CPU_timer_02_process;

/********************************************************************************/
/* fun_name : CPU_interrupt_proc_null()                                         */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/*  这个函数是中断的缺省函数,什么也不做                                         */
/********************************************************************************/
void CPU_interrupt_proc_null(void) 
{   ;
} 


/********************************************************************************/
/* system interrupt dispatch                                                    */
/* <0> <0003> INT_Extern_0 <==> HT9302D Recv dial number CLK INT                */
/* <1> <000B> INT_Timer_0  <==> For system time                                 */
/* <2> <0013> INT_Extern_1 <==> USB interrupt                                   */
/* <3> <001B> INT_Timer_1  <==> Not used                                        */
/* <4> <0023> INT_Serial   <==> Sery interrupt                                  */
/* <5> <002B> INT_Timer_2  <==> Not used                                        */
/* <6> <0033> INT_Extern_2 <==> For codec chip read and write interrupt         */
/* <7> <003B> INT_Extern_3 <==> Not used                                        */
/********************************************************************************/

/********************************************************************************/
/* fun_name : CPU_uart_serial_initial()                                         */
/* descript :                    2'(SMOD) X Fosc                                */
/*            load_val = 256 - -----------------                                */
/*                              baud X 32 X 12                                  */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void CPU_uart_serial_initial(void)
{   PCON  = 0x80;               //* double baud
    SCON  = 0x50;               //* SCON: mode 1, 8-bit UART, enable RECV
    TMOD &= 0x0F;
    TMOD |= 0x20;               //* TMOD: timer 1, mode 2, 8-bit reload
    TH1   = 0xFE;               //* TH1:  reload value for 115200 baud @ 44.2368MHz(22.1184Mx2)
    TR1   = 1;                  //* TR1:  timer 1 run
}

/********************************************************************************/
/* fun_name : CPU_timer_0_load_init_value()                                     */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/* descript : load value<==>65536-(oscxtime(s))/12=65536-44236800 x 0.002/12    */
/*            2MS定时器                                                         */
/********************************************************************************/
void CPU_timer_0_load_init_value(void)
{   TR0=0x00;
    TH0=0xE3;
    TL0=0x34;
    TR0=0x01;
}

/********************************************************************************/
/* fun_name : CPU_timer_0_initialize()                                          */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/* descript : clled by main intilize                                            */
/********************************************************************************/
void CPU_timer_0_initialize(void)
{   TMOD &= 0xF0;                   //* TMOD: timer 0, mode 1, 16-bit
    TMOD |= 0x01;                   //* counter Fosc/12
    CPU_timer_0_load_init_value();  //* TR0:  timer 0 run
}

/********************************************************************************/
/* fun_name : CPU_timer_0_interrupt()                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void CPU_timer_0_interrupt(void) interrupt 1  
{   CPU_timer_0_load_init_value();  //* TR0:  timer 0 run
    CPU_timer_interrupt();
}


/********************************************************************************/
/* fun_name : CPU_timer_2_initialize()                                          */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/* descript : 定时器2初始化,用作红外部分接收                                    */
/* T=12/OSC=12/44236800=0.01736
/********************************************************************************/
void CPU_timer_2_initialize(void)
{   C_T2   =0x00;       //* 内部定时器
    T2MOD &=0xFE;       //* DCEN=0x0,递增计数器,递增计数到0xFFFF后,溢出,然后在把RCAP2L和RCAP2H加载到TL2和TH2
    RCAP2L =0x00;       //* 如果溢出了,就重新从0开始递增计数
    RCAP2H =0x00;
    TL2    =0x00;
    TH2    =0x00;
    TR2    =0x00;
}


/********************************************************************************/
/* fun_name : CPU_extern_0_interrupt()                                          */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void CPU_extern_0_interrupt(void) interrupt 0                        
{   CPU_extern_0_process();
}

/********************************************************************************/
/* fun_name : CPU_extern_1_interrupt()                                          */
/* descript : For USB                                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void CPU_extern_1_interrupt(void) interrupt 2 
{   CPU_extern_1_process();
}

/********************************************************************************/
/* fun_name : CPU_serial_1_interrupt()                                          */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/* descript : For uart                                                          */
/********************************************************************************/
void CPU_serial_1_interrupt(void) interrupt 4 
{   if( RI==1)
    {   RI=0;
        UART_recv_isr_process();
    }
    else if(TI==1)
    {   TI=0;
        UART_xmit_isr_process();
    }
}

/********************************************************************************/
/* fun_name : CPU_source_initialize()                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/* descript : 控制CPU的资源使用                                                 */
/********************************************************************************/
void CPU_source_initialize (void)
{   CPU_timer_0_initialize();
    CPU_timer_2_initialize();
    CPU_uart_serial_initial();
    IT0 = 0x1;    //* 选择中断类型: 0<==>低电平,1<==>下降沿
    EX0 = 0x1;    //* 外部中断0
    ET0 = 0x1;    //* 定时器0
    EX1 = 0x0;    //* 外部中断1
    ET1 = 0x0;    //* 定时器1
    ES  = 0x1;    //* UART串口0
    EA  = 0x1;    //* 全局中断控制
}


/********************************************************************************/
/* fun_name : CPU_timer_0_interrupt()                                           */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void CPU_timer_interrupt(void)                       
{   CPU_soft_timer_lo++;
    system_timer++;             	//* for system time operator
    CPU_001_tick_process();
    if((CPU_soft_timer_lo&0x01)==0x0)
    {  CPU_002_tick_process();
    }
    if((CPU_soft_timer_lo&0x03)==0x0)
    {  CPU_004_tick_process();
    }
    if((CPU_soft_timer_lo&0x07)==0x0)
    {  CPU_008_tick_process();
    }
    if((CPU_soft_timer_lo&0x0F)==0x0)
    {  CPU_010_tick_process();
    }
    if((CPU_soft_timer_lo&0x1F)==0x0)
    {   CPU_020_tick_process();
    }
    if((CPU_soft_timer_lo&0x3F)==0x0)
    {   CPU_040_tick_process();
    }
    if((CPU_soft_timer_lo&0x7F)==0x0)
    {   CPU_080_tick_process();
    }
    if((CPU_soft_timer_lo&0xFF)==0x0)
    {   CPU_100_tick_process();
        CPU_soft_timer_hi++;
        if((CPU_soft_timer_hi&0x01)==0x0)
        {  CPU_200_tick_process();
        }
        if((CPU_soft_timer_hi&0x03)==0x0)
        {  CPU_400_tick_process();
        }
    }
}


/********************************************************************************/
/* fun_name : CPU_timer_2_interrupt()                                           */
/* descript : 定时器2中断                                                       */
/* version  : v1.00                                                             */
/* created  : xillinx                                                           */
/********************************************************************************/
void CPU_timer_2_interrupt(void) interrupt 5 
{   TF2=0x0;
}

⌨️ 快捷键说明

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