STC8h2k08u IO输入无效
示波器检测电压正常,IO输出控制正常,唯有作为输入时检测不到IO状态,一共用了三个按键,都检测不到,图上是测试程序和初始化IO,请大佬帮看看仿真时按按键就没进if里,但是程序也在扫着 代码贴全一点
盲猜while(1); star串了10k电阻? 是不是编译优化掉了? 使能内部上拉试试 Lkck8210 发表于 2024-4-23 13:12
代码贴全一点
盲猜while(1);
#include "stc8h.h"
#include "intrins.h"
sbit Sda = P3^7;
sbit STAR = P3^4;
sbit keyjia = P3^3;
sbit keyjian = P3^2;
void Timer0_Init(void) //1毫秒@5.5296MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xEA; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void Delay1ms(void) //@5.5296MHz
{
unsigned char data i, j;
_nop_();
_nop_();
i = 8;
j = 43;
do
{
while (--j);
} while (--i);
}
void Delay100us(void) //@5.5296MHz
{
unsigned char data i;
_nop_();
i = 182;
while (--i);
}
void Delay20ms(void) //@5.5296MHz
{
unsigned char data i, j;
_nop_();
_nop_();
i = 144;
j = 157;
do
{
while (--j);
} while (--i);
}
void delayms(unsigned int ms)
{
while(--ms)
{
Delay1ms();
}
}
void Wait(unsigned int us)
{
while(--us)
{
Delay100us();
}
}
void on_line(unsigned char Addr)
{
char i;
Wait(30);
for(i=0;i<8;i++)
{
Sda=1;
if(Addr&1)
{
Wait(15);Sda=0;Wait(5);
}
else{
Wait(5);
Sda=0;
Wait(15);
}Addr>>=1;
}Sda=1;
}
bit star_bofang = 0;
void key_star()
{
if(STAR == 0)
{
Wait(300);
if(STAR == 1)
{
star_bofang =! star_bofang;
}
}
}
unsigned int jia_time = 0,jian_time = 0;
unsigned char keyjia_flag = 0,keyjian_flag = 0;
unsigned char jia_key = 0,jian_key = 0;//按键值
void key_jia()
{
if(keyjia == 0)
{
keyjia_flag = 1;
}
if(keyjia == 1 && jia_time<1000 && keyjia_flag == 1)
{
keyjia_flag = 0;
jia_time = 0;
jia_key = 1;//短按
}
if(keyjia == 1 && jia_time>2000 && keyjia_flag == 1)
{
keyjia_flag = 0;
jia_time = 0;
jia_key = 2;//长按
}
}
void key_jian()
{
if(keyjian == 0)
{
keyjia_flag = 1;
}
if(keyjian == 1 && jian_time<1000 && keyjian_flag == 1)
{
keyjian_flag = 0;
jian_time = 0;
jian_key = 1;//短按
}
if(keyjian == 1 && jia_time>2000 && keyjian_flag == 1)
{
keyjian_flag = 0;
jian_time = 0;
jian_key = 2;//长按
}
}
void pwm_init(unsigned int zhouqi,unsigned int zhankongbi)
{
P_SW2 = 0x80;
PWMA_CCER1 = 0x00; //写CCMRx前必须先清零CCERx关闭通道
PWMA_CCMR1 = 0x60; //设置CC1为PWMA输出模式
PWMA_CCER1 = 0x01; //使能CC1通道
PWMA_CCR1 = zhankongbi; //设置占空比时间
PWMA_ARR = zhouqi; //设置周期时间
PWMA_ENO = 0x01; //使能PWM1P端口输出
PWMA_BKR = 0x80; //使能主输出
PWMA_CR1 = 0x01; //开始计时
}
unsigned int PWM_zhouqi,PWM_zhankongbi = 0,zhendong =0;
void Delay300ms(void) //@5.5296MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 9;
j = 107;
k = 90;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
unsigned char yinliang = 0xe3;
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P3M0 = 0x20; P3M1 = 0x00; //电机口推挽
P3M0 &= ~0x10; P3M1 &= ~0x10;
// P3M0 |= 0x10; P3M1 |= 0x10;
on_line(0xf1);//切换到u盘
Wait(500);
on_line(0xf7);//循环播放
Wait(500);
on_line(0xe3);//音量设置 d2-f0
Timer0_Init();//1毫秒定时
EA = 1;
//pwm_init(100,PWM_zhankongbi);
while(1)
{
// key_star();
// key_jia();
// key_jian();
// if(!STA )
// {
// on_line(0xfa);//播放
// zhendong = 1;
// }else{ on_line(0xfb);zhendong = 0;}//暂停
if(jia_key == 1)//短按
{
jia_key = 0;
PWM_zhankongbi++;
pwm_init(100,PWM_zhankongbi);
}
if(jian_key == 1)//短按
{
jia_key = 0;
PWM_zhankongbi--;
pwm_init(100,PWM_zhankongbi);
}
if(jia_key == 2)//长按
{
jia_key = 0;
yinliang++;
on_line(yinliang);//音量设置 d2-f0
}
if(jian_key == 2)//长按
{
jia_key = 0;
yinliang--;
on_line(yinliang);//音量设置 d2-f0
}
if(P33 == 0)
{
Delay20ms();
if(P33 == 0)
{
zhendong =! zhendong;
}
}
}
}
void Timer0_Isr(void) interrupt 1
{
static int i,pwm_time;
i++;
if(i>500)
{
P15 =! P15;
i = 0;
}
if(keyjia_flag == 1)//判断按下的时间
{
jia_time++;
}
if(keyjian_flag == 1)//判断按下的时间
{
jian_time++;
}
if(zhendong == 1){
pwm_time++;
if(pwm_time<PWM_zhankongbi)
P35 = 1;
if(pwm_time>PWM_zhankongbi&&pwm_time<PWM_zhouqi)
P35 = 0;
if(pwm_time>PWM_zhouqi)
pwm_time = 0;
}elseP35 = 0;
} P3=0xff; 脱离仿真环境,直接下载固件到单机全速运行试试 电子小陈 发表于 2024-4-23 23:29
P3=0xff;
可以在初始化程序中,加入P3=0xff试试
页:
[1]
2