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

📄 zg60.c

📁 单片机简易数控电源no interupt 源代码
💻 C
字号:
#include "SPCE061V004.H"
#include	"unSPMACRO.h"

#define uchar unsigned char
#define uint unsigned	int
#define Qdshj 200
#define ljshj 8
#define Ref 2       //参考电压2伏
static int Address[10] = {0x3f00, 0x8600, 0xdb00, 0xcf00, 0xe600, 0xed00, 0x7d00, 0x8700, 0xff00, 0xef00};
                                             	 //共阴接法'0''1''2''3''4''5''6''7''8''9'的代码
void delay(void);
void delaylong(void);
void keyprocess1(void);
void keyprocess2(void);
uchar keyflag;                                           	 
static uchar keyswitch=1,keyvalue,flag,counter=0,shi=0,bai=0,dat=0,biao;                                             	 



void key()///////////////////判断按键////////////////////
	
{ static uchar keycounter;

   *P_IOA_Data|=0xff00;
 	keyvalue=*P_IOA_Data;
	keyvalue=~keyvalue;
	keyvalue=keyvalue&0xff00;
	if(!keyvalue)
	{
	keycounter=0;
	keyflag=0;
	return;
	}
	if(keyflag)//////////////////判断是否已经按下,假如已经按下则跳出ket()
	{
	keycounter++;
	if(Qdshj==keycounter)
	{
	keycounter-=ljshj;
	keyprocess();
	}
	else
	{return;}
}
	else
	{
delay();
	*P_IOA_Data=*P_IOA_Data|0xff00;
	keyvalue=*P_IOA_Data;
	keyvalue=~keyvalue;
	keyvalue=keyvalue&0xff00;
	if(!keyvalue)
	{
	keycounter=0;
	keyflag=0;
	return;
	}
	keyflag=1;
	keyprocess();
	}
}	


void keyprocess()     ////////////////按键处理///////////////
{	
	switch(keyvalue)
	{
	case 0x0100:     /////////////////单步加一键
	counter++;
	biao=0x3f00;
    if(counter>9)
	{counter=0;
	shi++;}
	if(shi>9) 
	{shi=0;}
	break;

	case 0x0200://///////////////////单步减一键
	counter--;
	biao=0x3f00;
	if(counter==0xffff)
	{counter=9;
	shi--;}
	if(shi==0xffff)
	{shi=9;}
	break;
	
	case 0x0400:///////////////////开扫描
	//flag=1;
	INT_IRQ();	
	break;
	
	case 0x8000:///////////////关扫描
//	flag=0;
    INT_OFF();
	break;

	case 0x1000: 			//设定个位数值预置值
	counter++;
	biao=0x7100;
	if(counter>9)
	{counter=0;}
	break;
	
	case 0x0800:          ///十位预置值
	shi++;
	biao=0x7100;
	if(shi>9)
	{shi=0;}
	break;
	default :	      break;
	}
  
delay();
}

////////////////////中断服务程序//////////////////////////////

void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void){
			counter++;
			if(counter>9)
			{shi++;
			counter=0;}
		*P_INT_Clear=C_IRQ5_2Hz;
	} 


///////////////////////////////////////////////////////////
void delay()
{
int j=100;
                                          do{j=j-1;}while(j>1);
}

void delaylong()
{ 
int i=20000;
do{i=i-1;}while(i>1);
}

void main(void)
   {
  unsigned int i;
   i=dat;
*P_IOA_Attrib = 0x0000;                        //初始化IOA0~IOA15端口 
*P_IOA_Dir = 0x00ff;
*P_IOA_Data = 0xffff; 

*P_IOB_Attrib = 0xffff;                        //初始化IOB0~IOB1端口 
*P_IOB_Dir = 0xffff;                          
*P_IOB_Data = 0x3f0e; 
*P_INT_Ctrl=C_IRQ5_2Hz;//Setup interrupt
	INT_OFF();
//	for(;;)
//	{

		key();
/*	switch(flag)////////////////扫描判断/////////
	{
	case 1:
	counter++;
	if(counter>9)
	{counter=0;
	shi++;}
	if(shi>9)
	{shi=0;}
delaylong();
delaylong();
	break;
	
	case 0:
	break;
	
	default: break;
	}*/
//////////////////////////////////////////	 
	 dat=shi*10+counter;
	 
    *P_IOB_Data=Address[counter];
	*P_IOB_Data|=0x0008;
 delay();
	
	*P_IOB_Data=Address[shi];
	*P_IOB_Data|=0x0004;
delay();

	*P_IOB_Data=biao;
	*P_IOB_Data|=0x0001;
delay();
	
	
	*P_IOB_Data=dat<<8;
	*P_IOB_Data|=0x0040;
delay();


/*DAC()
{*/
//	__asm("int off");                 //disable interrupt
    
*P_DAC_Ctrl=C_DA1_Direct;             //Latch to extect directly
  
if(i!=dat)
     *P_DAC1=dat*700
     ;                    //output  实现精度为0.001V

//}
	
	*P_Watchdog_Clear = 0x0001;	
//	}
}














⌨️ 快捷键说明

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