📄 pwm-led.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 + -