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

📄 system.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
字号:
#include "System.h" 

//25ms定时器2计数值=0x10000-22.1184M/12/40
#define T2L_VAL 0x00
#define T2H_VAL 0x4C

unsigned char CheckKeyF=0;	//键盘检测标志位
unsigned int  counter=0;	//T2计数器,25ms++
unsigned int  Mycounter;	//计数器,用于用户定时
unsigned char Myflag=0;		//用户定时标志

//键盘数据结构
struct KeyStruct Key[8];

void delay(int n)    //延时函数
{
	int i=0;
	while(i<n)	i++;
}

#define XBARE 0x40	//ENABLE XBR, set XBR2.6 = 1
//配置交叉开关和I/O口
void PORT_INIT()
{ 
	SFRPAGE = CONFIG_PAGE;
	/* XBR0 control follow digital utils
	uart0:xbr0.2->p0.0,p0.1
	spi0:xbr0.1->p0.2,p0.3,p0.4,(p0.5)
	smb0:xbr0.0->p0.6,p0.7
	*/
	XBR0 = 0x07;

	/*XBR2 control follows
	UART1:xbr2.2->p1.0,p1.1
	*/
	XBR2 = 0x4;

	// set P1MDIN.2 to ADC2-in, skip p1.2 pin
	P1MDIN = 0xFB;

	/*XBR1 control follows
	T0:XBR1.1->p1.3
	INT0:XBR1.2->p1.4
	*/
	XBR1 = 0x06;
	//for test
//	P1MDOUT |= 0x10;
//	XBR1 |= 0x82;	//XBR1.7:sysclk->p1.4	


	//ENABLE switch 
	XBR2 |= XBARE;
   
	P5MDOUT|=0x0F;   //LCD控制信号
	P6MDOUT|=0xFF;   //LCD数据信号
	P7MDOUT|=0x13;   //背光,RES,HC157控制
	P3MDOUT|=0x04;   //KEY_EN
}

//系统时钟初始化
void SYSCLK_INIT()                //使用外部晶阵22.1184M   
{   
    SFRPAGE = CONFIG_PAGE;
	OSCXCN |=0x67;                //使能外部晶阵
    while((OSCXCN & 0x80)==0)     //延时,直至外部晶阵就绪
    delay(100);
	CLKSEL |=0x01;                //切换到外部时钟
} 


void Timer2_INIT()                //16位自动重装模式,产成25ms中断
{   
    SFRPAGE = TMR2_PAGE;
	
 	TMR2L=T2L_VAL;                //赋值          
    TMR2H=T2H_VAL;
    RCAP2L=T2L_VAL;
    RCAP2H=T2H_VAL;
    TMR2CF |=0x01;                //SYSCLK/12作为T2输入,向上计数
	TMR2CN &=0xf4;                //T2工作模式: 自动重装,计时器,忽略T2EX信号                       
	ET2=1;
	TR2=1;	
}

void Timer2_ISR() interrupt 5    	 //T2 25ms中断
{   
	TF2=0;
	counter++;
    CheckKeyF=1;     				//键盘检测             	
	if(Mycounter==counter)         
		Myflag=1;					//用户定时到,置位
}

void CheckKey()						//键盘检测.要求每次按键时间超过100ms;持续按键以每秒4次计算
{	
    unsigned char data i;
	unsigned char data M=1;
	SFRPAGE = CONFIG_PAGE;
	OE=1;							//关闭并口
	Key_En=0;           			//使能键盘
	P6MDOUT=0x00;       			//配置P6为数字输入 (数字输入=漏极开路+SFR写1)
	P6=0xff;
	delay(5);
    for(i=0;i<8;i++)    			//依次检测各键
	{  
	    if((P6&M)==0)				//当前第i位为0
		{
			if(Key[i].pressold==0)	//前一次为0
			{
				Key[i].pressing++;
				if(Key[i].pressing==4)  Key[i].pressed=1;
				if(Key[i].pressing==10) Key[i].pressing=0;  //持续按键以每秒4次计算
			}
			else					//前一次为1
			{ 
				Key[i].pressing=1;	
			}
			Key[i].pressold=0;
		}
		else						//当前第i位为1
		{    
        	if(Key[i].pressold==0)	//前一次为0   
		    {
				Key[i].pressing=0; 
			}
			else					//前一次为1
			{
						
			}
		    Key[i].pressold=1;
		}
	    M=M<<1;  
	}
	CheckKeyF=0;
	Key_En=1; 
    P6MDOUT=0xff;					//P6置回输出状态
}

void Key_INIT()
{
  int i;
  for(i=0;i<8;i++)
  {
  	  Key[i].pressed=0;
	  Key[i].pressold=1;
	  Key[i].pressing=0;
  }
}

void ClearKey()
{
	int i;
	for(i=0;i<8;i++)
	{
		Key[i].pressed=0;
	}
}

⌨️ 快捷键说明

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