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

📄 key_display.c

📁 motor_control.zip
💻 C
字号:
/**************COPYRIGHT RESERVED BY DU************************/
//key_display.c
#include "c8051F020.h"
#include "intrins.h"
#include "CH452CMD.H"	// 定义常用命令码及外部子程序
#include "pin.h"
#include "math.h"


#ifndef    __UNSIGNEDS
#define	   __UNSIGNEDS
#define     uint      unsigned int
#define     uchar     unsigned char
#define     ushort    unsigned short
#define	    ulong	  unsigned long
#endif

/***********关看门狗*********************/
void Reset_Sources_Init()
{
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;

}


/***********系统时钟4M*********************/
void Oscillator_Init()
{
    OSCICN    = 0x05;
}



/***********ADC输入初始化,改变AMX0SL=0x01-0x07为AIN1-AIN7*********************/
void ADC_Init()
{	 
    AMX0SL    = 0x01;   //AIN1作为AD输入,30管脚  
    //ADC0CF    = 0x08;
    ADC0CN    = 0x80;	 //ADC使能

}
/***********DAC输出初始化*********************/
void DAC_Init()
{
    DAC0CN    = 0x80;     //DAC使能

}

/***********参考电压初始化*********************/
void Voltage_Reference_Init()
{
    REF0CN    = 0x03;     //内部参考电压2.5V

}
/***输出占空比不同的PWM可以设定P0.0,0.1...改变PCA0CPH0.PCA0CPM1改变占空比 *****/
void PCA_Init()
{
    PCA0CN    = 0x40;	  /*允许PCA定时器/计数器*/
	PCA0L	  = 0x00;
	PCA0H	  = 0x00;//PCA0MD    = 0x80;
    PCA0CPM0  = 0x43;	 /*8位PWM方式,当CCF0=1时,允许辅捉/比较标志的中断申请*/
	PCA0CPL0  = 0x00;	/*置初值*/
    PCA0CPH0  = 0x80;	//  PCA0CPH0  = 0xC0	//PCA0MD = 0x01;	/*PCA定时器/计数器溢出中断禁止*/
	PCA0CPM1  = 0x43;	/*8位PWM方式,当CCF1=1时,允许辅捉/比较标志的中断申请*/
	PCA0CPL1  = 0x00;	/*置初值*/
    PCA0CPH1  = 0x80;



}



/***定时器0,1初始化 TMOD设置几位什么方式CKCON是时基是系统的几倍*****/
void Timer_Init()
 {
	TR0=0;								//关定时器0
	TR1=0;								//关定时器1
	TMOD      = 0x11;	
    CKCON=0x00;							//定时器1的时基与系统1/12
	TH0=0x7D	;						//全程定时
	TL0=0xCC	;
	TH1=0x7D	;						//初值  1s
	TL1=0xFB	;
}


/***********延时n ms******************/
void delayms(uint n)	   
{	
	uint i,j,k;
	for(i=0;i<n;i++)
		for(j=0;j<200;j++)
			for(k=0;k<10;k++)
				_nop_();

}


/***********ADC输入实现****************uchar i,uchar j*****/
float AD_IN(void)											   
{
//    float tmp;
    uint temp;
  // AMX0P     = 0x10;
    delayms(10);
    AD0BUSY=1;
    while(AD0INT == 0);
    temp=ADC0H<<8;
    temp+=ADC0L;
    // tmp=(2.5*(temp/4095.0))*1000;
    //return(tmp);
    return(temp);
}


/***********DAC输出实现*********************/
void DA_OUT(uint dat)															  
{ 
  uint dah,dal;
  dah=dat>>8;
  dal=dat&0x00FF;
  DAC0L=(uchar)dal;
  DAC0H=(uchar)dah;
    
}


/***********CH452写入*********************/
void CH452_Write(ushort cmd)
{
	uchar i;
	DISABLE_KEY_INTERRUPT;		  //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
	CH452_LOAD_CLR;                 //命令开始,LOAD=0
	CH452_LOAD_D_OUT;		// 设置LOAD为输出方向
	CH452_DOUT_D_IN;		// 设置DOUT为输入方向
	CH452_DIN_D_OUT;		// 设置DIN为输出方向
	CH452_DCLK_D_OUT;		// 设置DCLK为输出方向
	for(i=0;i!=12;i++)				//送入12位数据,低位在前
	{
	 if (cmd&1) {CH452_DIN_SET;}
	    else {CH452_DIN_CLR;}  // 输出位数据
                                   // 另外的表达CH452_DIN=cmd&1;
    	 CH452_DCLK_CLR;
    	 cmd>>=1;
	 DELAY_1US;
	 DELAY_1US;	
	   CH452_DCLK_SET;             //上升沿有效
	}
  	CH452_LOAD_SET;         //加载数据,LOAD上升沿
	DELAY_1US;				//命令数据加载周期不小于6US,CH451不需要该周期
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;				//命令数据加载周期不小于6US,CH451不需要该周期
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;				//命令数据加载周期不小于6US,CH451不需要该周期
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	
  	ENABLE_KEY_INTERRUPT;
}



/***********CH452读出*********************/
uchar CH452_Read( void )
{
	uchar i;
  	uchar cmd,keycode;		//定义命令字,和数据存储器
  	DISABLE_KEY_INTERRUPT;			//禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输	
  	cmd=0x07;			        //读按键的命令字
  	CH452_LOAD_CLR;
  	for(i=0;i!=4;i++)                       // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
	{
		if (cmd&1) {CH452_DIN_SET;}
		else {CH452_DIN_CLR;}           // 输出位数据
    	CH452_DCLK_CLR;			 
    	cmd>>=1;			        //往右移一位
    	CH452_DCLK_SET;			        //产生时钟上升沿锁通知CH451输入位数据
 	}
  	CH452_LOAD_SET;				//产生加载上升沿通知CH451处理命令数据
  	keycode=0;				//清除keycode
  	for(i=0;i!=7;i++)
	{
		keycode<<=1;			//数据移入keycode,高位在前,低位在后
		if (CH452_DOUT) keycode++;      //从高到低读入451的数据
    	CH452_DCLK_CLR;			        //产生时钟下升沿通知CH451输出下一位
    	CH452_DCLK_SET;
 	}
  	CLEAR_KEY_INTER_FLAG;	                //清中断标志
  	ENABLE_KEY_INTERRUPT;
  	return(keycode);		        //反回键值
}
/***********CH452初始化*********************/
void CH452_Init(void)            
{
    //CH452_Write(CH452_RESET);     //此套020板子千万不可用020复位,否则数码管不亮
    DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
    CH452_Write( CH452_SYSON2 );                    /* 启用键盘和数码管 */
    CH452_Write( CH452_BCD );   /* BCD译码,8个数码管 */	//	| CH452_SCANLIMIT_7 
    DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
	DELAY_1US;
}
/***********键盘数字转换(0-9)******************/
uchar key_tran(uchar x)
{

	 uchar a;	 
	 if(x==0x78){a=1;}
	 if(x==0x50){a=2;}
	 if(x==0x58){a=3;}
	 if(x==0x79){a=4;}
	 if(x==0x51){a=5;}
	 if(x==0x59){a=6;}
     if(x==0x7A){a=7;}
     if(x==0x52){a=8;}
     if(x==0x5A){a=9;}
     if(x==0x7B){a=0;}
	 return(a);	 
 	
}

/***********在数码管上0-3显示数字(包括小数点和负数)*****************/
void BCDdisplay_l(float n)
{ 
	signed int x;
	signed char a[4],b,t;
	x=abs((int)n);
	for(t=0;t<4;t++)
  		CH452_Write((CH452_DIG0+ (t<<8))|16);
	//if( ( n < 0.00000001 ) || ( n > -0.00000001 ) )  	CH452_Write((CH452_DIG0));
	//else 
	//{
		for(t=0;t<4;t++)
		{ 
			a[t]=x%10;
    		x=x/10;
			if(a[t]) b=t;
		}

		x=abs((int)n);
		if(x-(int)n)
  		{   
			x=b+1;x<<=8;
      		CH452_Write((CH452_DIG1+x)|18);
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
  		}
  		for(t=0;t<=b;t++)
  		{ 
     		x=t;x<<=8;
      		CH452_Write((CH452_DIG1+x)|a[t]);
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
    
  		}
  	
  		CH452_Write(0x1F9);//写小数点
  		n=(n-(int)n);
  		t=(int)(n*10);
  		n=n*10-t;
  		t=abs(t);
  		if(  (int)(  n*10  )>=5 || (int) ( n * 10  ) <=-5 ) t++;
  		CH452_Write(CH452_DIG0|t);
	//}
}
/***********在数码管上4-7显示数字(包括小数点和负数)*****************/
void BCDdisplay_h(float n)
{ 
	signed int x;
	signed char a[4],b,t;
	x=abs((int)n);
	for(t=4;t<8;t++)
  		CH452_Write((CH452_DIG0+ (t<<8))|16);
	//if( ( n < 0.00000001 ) || ( n > -0.00000001 ) )  	CH452_Write((CH452_DIG4));
	//else 
	//{
		for(t=0;t<4;t++)
		{ 
			a[t]=x%10;
    		x=x/10;
			if(a[t]) b=t;
		}

		x=abs((int)n);
		if(x-(int)n)
  		{   
			x=b+5;x<<=8;
      		CH452_Write((CH452_DIG1+x)|18);
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
  		}
  		for(t=0;t<=b;t++)
  		{ 
     		x=t;x<<=8;
      		CH452_Write((CH452_DIG5+x)|a[t]);
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
    
  		}
  	
  		CH452_Write(0x1fd);//写小数点
  		n=(n-(int)n);
  		t=(int)(n*10);
  		n=n*10-t;
  		t=abs(t);
  		if(  (int)(  n*10  )>=5 || (int) ( n * 10  ) <=-5 ) t++;
  		CH452_Write(CH452_DIG4|t);
	//}
}

 /***********显示(包括数)******************/
void BCDdisplay1(uint n)		
{ uint x;
  uchar a[8],t,b;
 x=n;
  //CH452_Write(CH452_RESET);
  CH452_Write(CH452_SYSON2);//打开键盘显示
	CH452_Write(CH452_BCD);   // BCD译码,8个数码管
	for(t=0;t<8;t++)
          CH452_Write((CH452_DIG0+ (t<<8))|16);
  if(n==0) 	CH452_Write((CH452_DIG0));
  else 
{
  for(t=0;t<8;t++)
  { a[t]=x%10;
    x=x/10;
	if(a[t]) b=t;
  }
  
  for(t=0;t<=b;t++)
  { 
     x=t;x<<=8;
      CH452_Write((CH452_DIG0+x)|a[t]);
      DELAY_1US;
      DELAY_1US;
      DELAY_1US;
      DELAY_1US;
      DELAY_1US;}
 }
}


//H_L为1,选择高四位数码管写整数;H_L为0,选择低四位数码管写整数
void BCD_H_L(signed int n,unsigned char H_L)
{ 
	unsigned int x;
	unsigned char a[4],b,t;
	for(t=0;t<4;t++)
	{
		x=t+(H_L<<2);
		x<<=8;
  		CH452_Write((CH452_DIG0 + x)|16);
	}
	x=(H_L<<2);
	x<<=8;
	if( n == 0 )  	
		CH452_Write(CH452_DIG0 +x);
	else 
	{	x=abs(n);
		for(t=0;t<4;t++)
		{ 
			a[t]=x%10;
    		x=x/10;
			if(a[t]) b=t;
		}
	
		if(abs(n)-n)
  		{   
			x=b + (H_L<<2)+1;
			x<<=8;
      		CH452_Write((CH452_DIG0+x)|18);
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
  		}
  		for(t=0;t<=b;t++)
  		{ 
			x=t+(H_L<<2);
      		CH452_Write((CH452_DIG0+ (x << 8))|a[t]);
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
      		DELAY_1US;
    
  		}
	}
}

⌨️ 快捷键说明

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