本帖最后由 紫℡憶星宸 于 2017-4-11 20:14 编辑
程序是自己编的,现在是功能实现不了
#define K1 (((~PINB)&0x01)==0x01) //K1按键按下,等待输入设定值
#define K2 (((~PINB)&0x02)==0x02) //K2按键按下,输入结束
#define K3 (((~PINB)&0X04)==0X04) //K3按键按下,设定值加一
#define K4 (((~PINB)&0X08)==0X08) //K4按键按下,设定值减一
#define K_up ((!K1)|(!K2)|(!K3)|(!K4))//没有按键按下
unsigned char adc0_set = 0;
unsigned char adc2_set = 0;
unsigned char key_count = 1;//用于通道选择
float pwm1_duty = 0.0;
float pwm2_duty = 0.0;
float set1_value = 0.0;
float set2_value = 0.0;
//LCD1602显示标志
unsigned char key0_view[17]={" CH1 L: 000R "};
unsigned char key1_view[17]={" I:0.000A "};
unsigned char key2_view[17]={" CH2 L: 000R "};
unsigned char key3_view[17]={" I:0.000A "};
#define Ch1 (key_count%2==0)
#define Ch2 (key_count%2==1)
//键盘扫描
void key_scan(void)
{
unsigned char i;
unsigned int key_num;
i = 0;
key_num = 0;
if(K1)//SW1按下
{
delay_ms(10);//延时去抖
if(K1)
{
key_count++;
while(!K1)//等待K1按键弹起
continue;
while(!K2)
{
if(K1)
{
delay_ms(10);
if(K1)
key_count++;
while(!(K1))
continue;
}
if(K3)
{
delay_ms(10);
if((K3)&(Ch1))
{
if(adc0_set==250) //越界保护,使设定值在0-250
adc0_set = 250;
else
adc0_set++;
}
if((K3)&(Ch2))
{
if(adc2_set==250)
adc2_set = 250;
else
adc2_set++;
}
i = 20;
while((!K3)|(i>0))
{
i--;
delay_ms(10);//按键连续按下时,每200ms加一
}
}
if(K4)
{
delay_ms(10);
if((K4)&(Ch1))
{
if(adc0_set == 0)
adc0_set = 0;
else
adc0_set--;
}
if((K4)&(Ch2))
{
if(adc2_set == 0)
adc2_set = 0;
else
adc2_set--;
}
i = 20;
while((!K4)|(i>0))
{
i--;
delay_ms(10);
}
}
if((Ch1)&(K_up))
{
pwm1_duty = (float)adc0_set/250.0;//计算占空比
set1_value = pwm1_duty*1.0;//24V1A的设定值
key_num = (unsigned int)(set1_value*1000);
key0_view[12] = adc0_set%10+0x30;//级数显示
key0_view[11] = adc0_set/10%10+0x30;
key0_view[10] = adc0_set%100+0x30;
key1_view[12] = (unsigned char)(key_num%10)+0x30;//设定电流值显示
key1_view[11] = (unsigned char)(key_num/10%10)+0x30;
key1_view[10] = (unsigned char)(key_num/100%10)+0x30;
key1_view[8] = (unsigned char)(key_num%1000)+0x30;
writechar(1,0,16,key0_view);//lcd1602显示数值
writechar(2,0,16,key1_view);
delay_ms(500);//防止刷新频繁
}
if((Ch2)&(K_up))
{
pwm2_duty = (float)adc2_set/250.0;
set2_value = pwm2_duty*2.0;
key_num = (unsigned int)(set2_value*1000);
key2_view[12] = adc2_set%10+0x30;
key2_view[11] = adc2_set/10%10+0x30;
key2_view[10] = adc2_set%100+0x30;
key3_view[12] = (unsigned char)(key_num%10)+0x30;
key3_view[11] = (unsigned char)(key_num/10%10)+0x30;
key3_view[10] = (unsigned char)(key_num/100%10)+0x30;
key3_view[8] = (unsigned char)(key_num%1000)+0x30;
writechar(1,0,16,key2_view);//显示数值
writechar(2,0,16,key3_view);
delay_ms(500);
}
}
key_count = 1;
}
}
}
|