📄 五个按键四个数码管输出pwm的程序.txt
字号:
这是我前阵子做的一个控制电机的小项目,功能:
1、通过五个按键控制PWM的输出,同时在四位数码管的后三位上显示占空比。
2、S1为调整—正常转换键,在正常工作时,按S1能进入调整状态,其余键无效。
3、进行调整模式后,S2、S3为左、右移键,使闪烁显示的数码管移动,按位调整。
4、S4、S5为减、加键,使闪烁显示的位上数据变化。
5、最后按S1回到正常工作模式,并存入调整后的数据。
程序文件如下:
//---------------主函数-----------------
void main(void)
{
uchar a;
uchar key;
uint pwm_sj;
DDRA=0xE0;
PORTA=0x1F;
DDRB=0xFF;
PORTB=0xFF;
DDRC=0xFF;
PORTC=0x00;
DDRD=0xF0;
PORTD=0x0F;
CLI(); //先关闭所有中断
timer0_init(); //设定定时器
timer1_init();
timer2_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x41; //允许定时器0、定时器1/2中断
SEI(); //开总中断
led2_on;
eprom_read(); //读出存储的数据
OCR1A=pwm_zh(); //转换并输出PWM
delay_ms(3000); //延时3秒
pow_on; //开电机电源
while(1)
{
if(rdkey!=0) //如果读按键不为0,有键按下
{
key=rdkey; //先保存按键值
delay_ms(20); //延时消抖
if(rdkey==key) //如果键值相等:有效按键
{
switch(key) //分别处理
{
case 0x01: //键值为01,S3按下
if(set_flag==1) //如果调整标志为1,可调整
{
spk(10,1); //响1短声
xs_sel--; //调整闪烁位右移
if(xs_sel>2)xs_sel=0;//如果已经右移到第一位,不再移
xs_zh(); //显示数据转换
}
break;
case 0x04: //键值为04,S2按下
if(set_flag==1) //如果调整标志为1,可调整
{
spk(10,1); //响1短声
xs_sel++; //调整闪烁左移
if(xs_sel>2)xs_sel=2;//如果已经左移到第四位,不再移
xs_zh(); //显示数据转换
}
break;
case 0x08: //键值为08,S1按下
spk(10,1); //响1短声
if(set_flag==0)
{
set_flag=1; //置调整标志
led1_on; //开LED1
led2_off; //关LED2
xs_zh(); //显示数据转换
}
else
{
set_flag=0; //清调整标志:回正常工作状态
led1_off; //关LED1
led2_on; //开LED2
xs_zh(); //显示数据转换
eprom_write(); //将调整后的数据存入
OCR1A=pwm_zh(); //PWM输出转换
}
break;
case 0x20: //键值为20,S5按下:加调整
if(set_flag==1) //如果调整标志为1,可调整
{
spk(10,1); //响1短声
switch(xs_sel)
{
case 0:
xs[0]++; //个位调整:加
if(xs[0]>=10)xs[0]=0;//0-9之间循环
break;
case 1:
xs[1]++; //十位调整:加
if(xs[1]>=10)xs[1]=0;//0-9之间循环
break;
case 2:
if(xs[2]==0) //百位调整:在100%与50%之间转换
{
xs[2]=1;
xs[1]=0;
xs[0]=0;
}
else
{
xs[2]=0;
xs[1]=5;
xs[0]=0;
}
break;
default:break;
}
xs_zh();
}
break;
case 0x80: //键值为80,S4按下:减调整
if(set_flag==1) //如果调整标志为1,可调整
{
spk(10,1); //响1短声
switch(xs_sel)
{
case 0:
xs[0]--; //个位调整:减
if(xs[0]>=10)xs[0]=9;//9-0之间循环
break;
case 1:
xs[1]--; //十位调整:减
if(xs[1]>=10)xs[1]=9;//9-0之间循环
break;
case 2:
if(xs[2]==0) //百位调整:在100%与50%之间转换
{
xs[2]=1;
xs[1]=0;
xs[0]=0;
}
else
{
xs[2]=0;
xs[1]=5;
xs[0]=0;
}
break;
default:break;
}
xs_zh();
}
break;
default:break;
}
}
while(rdkey!=0)delay_ms(10); //等待按键释放
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -