小白爱上51 发表于 2024-4-23 11:36:55

STC8h2k08u IO输入无效

示波器检测电压正常,IO输出控制正常,唯有作为输入时检测不到IO状态,一共用了三个按键,都检测不到,图上是测试程序和初始化IO,请大佬帮看看

小白爱上51 发表于 2024-4-23 11:38:07

仿真时按按键就没进if里,但是程序也在扫着

Lkck8210 发表于 2024-4-23 13:12:42

代码贴全一点
盲猜while(1);

jwd 发表于 2024-4-23 14:10:17

star串了10k电阻?

jwd 发表于 2024-4-23 14:10:51

是不是编译优化掉了?

xiangzichen 发表于 2024-4-23 15:17:09

使能内部上拉试试

小白爱上51 发表于 2024-4-23 17:19:19

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;
       
}

电子小陈 发表于 2024-4-23 23:29:25

P3=0xff;

晓飛飛 发表于 2024-4-23 23:49:37

脱离仿真环境,直接下载固件到单机全速运行试试

小飞侠 发表于 2024-4-24 07:58:24

电子小陈 发表于 2024-4-23 23:29
P3=0xff;

可以在初始化程序中,加入P3=0xff试试
页: [1] 2
查看完整版本: STC8h2k08u IO输入无效