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

📄 pwm-led.c

📁 通过按键加件PWM频率
💻 C
字号:
#include <pic.h>
#define srclk RC3
#define rclk  RA5
#define ser   RC5
#define hang1 RB7
#define hang2 RB6
#define lie1  RB3
#define lie2  RB4
#define lie3  RB5
#define fengio RB2
unsigned char fengcon;
unsigned char keycon;
unsigned char pwm;
unsigned int abccon;
bit motoronoff;
bit keybit;
//const unsigned char pwm_table[100]={0,22,30,40,50,60,70,80,90,100,20,120,130,140,150,160,170,180,190,200};
const unsigned char LED_TAB1[10]={
				//gedfcahb
        0B01111101,                      //0
        0B00001001,                      //1
        0B11100101,                      //2
        0B10101101,                      //3
        0B10011001,                      //4
        0B10111100,                      //5
        0B11111100,                      //6
        0B00001101,                      //7
        0B11111101,                      //8
        0B10111101,                      //9
        };
const unsigned char LED_TAB2[10]={
				//hcedfgba
        0B01111011,                      //0
        0B01000010,                      //1
        0B00110111,                      //2
        0B01010111,                      //3
        0B01001110,                      //4
        0B01011101,                      //5
        0B01111101,                      //6
        0B01000011,                      //7
        0B01111111,                      //8
        0B01011111,                      //9
        };
void SPIINT(void)
{
	PIR1=0;
	SSPCON=0X30;
	SSPSTAT=0XC0;
	TRISC=0X00;
}
void write595(unsigned char disbuf1,unsigned char disbuf2)
{
	RA5=0;		
	SSPBUF=disbuf1;
	do
	{
		;
	}while(SSPIF==0);
	SSPIF=0;
	SSPBUF=disbuf2;
	do
	{
		;
	}while(SSPIF==0);
	SSPIF=0;
	RA5=1;
	asm("NOP");
  	asm("NOP");
  	RA5=0;
}
void init(void)
{
  	asm("CLRWDT");  
  	OPTION=0x81;
  	TRISA=0B00001011;
  	TRISB=0B00111000;
  	TRISC=0B00000000;
  	TRISD=0B00000000;
  	TRISE=0B00000000;
  	PORTA=0;
  	PORTB=0x04;
  	PORTC=0;
  	PORTD=0;
  	PORTE=0;
  	RBIE=0;
  	
}
void CCP_INIT(void)
{	
	CCPR2L=0x7f;
	CCP2CON=0x3c;	
	PR2=63;              //频率15.625KHZ
	T2CKPS1=0;
	T2CKPS0=0;           //前分频为1:1
	TRISC1=1;	         //将RC1设置为输入,暂时关闭PWM
	TMR2ON=1;	         //启动TIMER2
}
void motor_pro(void)
{	
	if(motoronoff==1)
	{	
		TRISC1=0;  		
	}
	else
	{	 		
		TRISC1=1;	
		pwm=0;           //马达停止时将转速设置为0档,总共四档(0-3)		
	}		
	CCPR2L=pwm;	
}
void fengpro(void)
{
	if(fengio==0)
	{
		if(++fengcon>10)
		{
			fengcon=0;
			fengio=1;		
		}		 	
	}
	else
		fengcon=0;
}
void delay(void)
{
	unsigned char delaycon;
	for(delaycon=0;delaycon<90;delaycon++)
	{
		asm("CLRWDT");
    }	
}
unsigned char key(void)
{
	TRISB3=1;
	TRISB4=1;
	TRISB5=1;
	TRISB6=0;
	TRISB7=0;
	hang1=0;
	hang2=0;
	if(lie1==1&&lie2==1&&lie3==1) return 0;
	hang1=0;
	hang2=1;	
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	asm("NOP");
	if(lie1==0)
	{
		delay();
		if(lie1==0)
			return 1;
		else
			return 0;		
	}
	if(lie2==0)
	{
		delay();
		if(lie2==0)
			return 2;
		else
			return 0;		
	}
	if(lie3==0)
	{
		delay();
		if(lie3==0)
			return 3;
		else
			return 0;		
	}
	hang1=1;
	hang2=0;
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	asm("NOP");
	asm("NOP");	
	asm("NOP");
	if(lie1==0)
	{
		delay();
		if(lie1==0)
			return 4;
		else
			return 0;		
	}
	if(lie2==0)
	{
		delay();
		if(lie2==0)
			return 5;
		else
			return 0;		
	}
	if(lie3==0)
	{
		delay();
		if(lie3==0)
			return 6;
		else
			return 0;
	}
	
	return 0;
}
void keypro(void)
{
	switch(key())
	{
		case 0:
			if(keybit==0)
			{
				if(++keycon>100)
				{
					keycon=0;
					keybit=1;					
				}	
			}
		break;
		case 1:
			if(keybit==1)	//motor pwm-
			{
				keybit=0;
				fengio=0;					
				motoronoff=1;					
				if(motoronoff==1&&pwm>0) 
				{
					pwm--;
				}
			}		
		break;
		case 2:
			if(keybit==1)	//motor pwm+
			{
				keybit=0;
				fengio=0;					
				motoronoff=1;								
				if(motoronoff==1&&pwm<1000)
				{ 
					
					pwm++;
				}					
			}		
		break;
		case 3:
			if(keybit==1)
			{
				keybit=0;
				fengio=0;					
				motoronoff=1;
				pwm=40;
			}
		break;
		case 4:
			if(keybit==1)	//motor off
			{
				keybit=0;
				fengio=0;
				motoronoff=0;
				pwm=0;	
			}		
		break;
		case 5:
			if(keybit==1)
			{
				keybit=0;				
				fengio=0;					
				motoronoff=1;		
				pwm=20;
				}			
		break;
		case 6:
			if(keybit==1)	//motor on
			{
				keybit=0;
				fengio=0;					
				motoronoff=1;
				pwm=120;
			}
		break;
		default:
		break;
	}			
}
main()
{
  	init();
  	SPIINT();  	
  	CCP_INIT();   
  	while(1)
  	{
    	asm("CLRWDT");    
    	fengpro(); 
    	keypro();       	
    	motor_pro();    	
    	if(motoronoff)	    
    		write595(LED_TAB2[pwm%10],LED_TAB1[pwm%100/10]);
    		//write595(LED_TAB2[pwm],0xd5);	   //显示"PX"(X=1\2\3\4),表示状态为电机开,1-4对应速度档次
    	else  
    		write595(0x04,0x80);		       //显示"--",表示状态为电机关	
  	}
}

⌨️ 快捷键说明

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