找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 488|回复: 17
收起左侧

STC单片机按键不能工作是什么原因?

[复制链接]
ID:72649 发表于 2024-1-20 22:27 | 显示全部楼层 |阅读模式
#include "STC8H.h"
#include "intrins.h"


sbit key1 = P0^3 ;
sbit key2 = P5^4 ;
sbit key3 = P3^6 ;
sbit key4 = P3^7 ;       

sbit led1 = P2^4 ;
sbit led2 = P2^5 ;
sbit led3 = P2^2 ;
sbit led4 = P2^3 ;

sbit fmq = P3^2 ;
void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}

void DelayXms(unsigned int x) //@11.0592MHz
{
        while (--x)
        {
   Delay1ms();
         }
}

unsigned char keyscan()
{
char x=0;
        if ( key1 == 0|key2 == 0|key3 == 0|key4 == 0)
  {
                DelayXms(10);
                if ( key1 == 0|key2 == 0|key3 == 0|key4 == 0)
                {
                if ( key1 == 0)        x=1;
                else if ( key2 == 0)        x=2;
    else if ( key3 == 0)        x=3;
                else         x=4;
                        while ( key1 == 0|key2 == 0|key3 == 0|key4 == 0);
                }
   }
        return(x);
}

void main ()
{              
              P0M0 = 0x07; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0xc0;
        P2M0 = 0xff; P2M1 = 0x00;
        P3M0 = 0x3c; P3M1 = 0x00;
//                          fmq = 0;
        while(1)
        {       
unsigned char y;
                 
                                y=keyscan();
                                               if(y!=0)       
                         {
                                 if(y==1) led1 = !led1;
         else if(y==2)led2 = !led2;
         else if(y==3)  led3 = !led3;       
         else          led4 = !led4;
                         }
                 }
}       

回复

使用道具 举报

ID:227818 发表于 2024-1-21 07:48 | 显示全部楼层
看了下STC的手册,STC8系列的单片机,除 P3.0 和 P3.1 外,其余所有 IO 口上电后的状态均为高阻输入状态,用户在使用 IO 口时必须先设置 IO口模式。看程序,您用到的IO口可以设为准双向,且是高电平状态,您试下。

评分

参与人数 1黑币 +20 收起 理由
admin + 20

查看全部评分

回复

使用道具 举报

ID:227818 发表于 2024-1-21 07:56 | 显示全部楼层
我看您的按键口设成了推挽输出?这样它是不会变低的,如果您的按键口没有限流电阻,说不定会烧掉。
回复

使用道具 举报

ID:275826 发表于 2024-1-21 09:26 | 显示全部楼层
程序没问题,检查硬件
回复

使用道具 举报

ID:72649 发表于 2024-1-21 18:28 | 显示全部楼层
newlined 发表于 2024-1-21 07:56
我看您的按键口设成了推挽输出?这样它是不会变低的,如果您的按键口没有限流电阻,说不定会烧掉。

IO口设置没问题啊
回复

使用道具 举报

ID:72649 发表于 2024-1-21 18:29 | 显示全部楼层
newlined 发表于 2024-1-21 07:48
看了下STC的手册,STC8系列的单片机,除 P3.0 和 P3.1 外,其余所有 IO 口上电后的状态均为高阻输入状态, ...

         P0M0 = 0x07; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0xc0;
        P2M0 = 0xff; P2M1 = 0x00;
        P3M0 = 0x3c; P3M1 = 0x00;
没问题啊
回复

使用道具 举报

ID:227818 发表于 2024-1-21 21:42 | 显示全部楼层
P0M0 = 0x00; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0x00;
        P2M0 = 0x00; P2M1 = 0x00;
        P3M0 = 0x00; P3M1 = 0x00;
这样试试
回复

使用道具 举报

ID:227818 发表于 2024-1-21 21:46 | 显示全部楼层
P0=0xff;P2=0xff;P3=0xff;P5=0xff;
回复

使用道具 举报

ID:72649 发表于 2024-1-22 06:33 | 显示全部楼层
newlined 发表于 2024-1-21 21:42
P0M0 = 0x00; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0x00;
        P2M0 = 0x00; P2M1 = 0x00;

也是没有用的
回复

使用道具 举报

ID:72649 发表于 2024-1-22 06:34 | 显示全部楼层
newlined 发表于 2024-1-21 21:46
P0=0xff;P2=0xff;P3=0xff;P5=0xff;

这样也是没有反应
回复

使用道具 举报

ID:72649 发表于 2024-1-22 06:37 | 显示全部楼层
newlined 发表于 2024-1-21 07:48
看了下STC的手册,STC8系列的单片机,除 P3.0 和 P3.1 外,其余所有 IO 口上电后的状态均为高阻输入状态, ...

              P0M0 = 0x00; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0x00;
        P2M0 = 0x00; P2M1 = 0x00;
        P3M0 = 0x00; P3M1 = 0x00;
IO口设为准双向,也是,一样的
回复

使用道具 举报

ID:712072 发表于 2024-1-22 08:47 | 显示全部楼层
是不是|改成||
回复

使用道具 举报

ID:712097 发表于 2024-1-23 10:58 | 显示全部楼层
发硬件原理图看下,按键IO要上拉。
回复

使用道具 举报

ID:72649 发表于 2024-1-23 12:40 来自手机 | 显示全部楼层
chxelc 发表于 2024-1-23 10:58
发硬件原理图看下,按键IO要上拉。

原理图已发
Screenshot_2024_0123_123846.png
回复

使用道具 举报

ID:72649 发表于 2024-1-23 12:43 来自手机 | 显示全部楼层
tyrl800 发表于 2024-1-21 09:26
程序没问题,检查硬件

/*按键K1K2加减数字数码管显示  按键K3K4加减数码管显示
#include "STC8H.h"
#include "intrins.h"
unsigned char NixieTable[]={ 0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/};
sbit k1 = P0^3 ;
sbit k2 = P5^4 ;
sbit k3 = P3^6 ;
sbit k4 = P3^7 ;

unsigned int Num,Num1;
      
void Delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}

void DelayXms(unsigned int x) //@11.0592MHz
{
        while (--x)
        {
   Delay1ms();
         }
}

void Led_Seg(unsigned int date) //显示函数
{      
        unsigned int a,b,c;
          a=date/100%10;                        //求百位
          b=date/10%10;                                  //求十位
          c=date%10;                                          //求个位

          P14=1;P15=1;P33=1;
             P2=NixieTable[a];//百位
          P14=0;P15=1;P33=1;
          DelayXms(5);
                       
          P14=1;P15=1;P33=1;  
         P2=NixieTable;//十位
          P15=0;P33=1;P14=1;
          DelayXms(5);


                P14=1;P15=1;P33=1;  
        P2=NixieTable[c];//个位
          P33=0;P14=1;P15=1;
          DelayXms(5);
}

void Led_Seg1(unsigned int date) //显示函数
{      
        unsigned int a,b,c;
          a=date/100%10;                        //求百位
          b=date/10%10;                                  //求十位
          c=date%10;                                          //求个位

          P00=1;P01=1;P02=1;
             P2=NixieTable[a];//百位
          P00=0;P01=1;P02=1;
          DelayXms(5);
                       
          P00=1;P01=1;P02=1;   
         P2=NixieTable;//十位
         P00=1;P01=0;P02=1;
          DelayXms(5);


                P00=1;P01=1;P02=1;   
        P2=NixieTable[c];//个位
         P00=1;P01=1;P02=0;
          DelayXms(5);
}

unsigned char keyscan()
{
   char x=0;
        if ( k1 == 0|k2 == 0|k3 == 0|k4 == 0)
  {
                DelayXms(10);
                if (  k1 == 0|k2 == 0|k3 == 0|k4 == 0)
                {
                if (k1 == 0)        x=1;
                else if (k2 == 0)        x=2;
    else if (k3 == 0)        x=3;
                else         x=4;
                        while ( k1 == 0|k2 == 0|k3 == 0|k4 == 0);
                }
   }
        return(x);
}

void Timer0_init()  //1ms
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
                                TL0 = 0xCD;                                //设置定时初始值
                                TH0 = 0xD4;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;      //开T0中断
        EA=1;      
}
void main ()
{
              P0M0 = 0x00; P0M1 = 0x00;
        P1M0 = 0x00; P1M1 = 0xc0;
        P2M0 = 0x00; P2M1 = 0x00;
        P3M0 = 0x00; P3M1 = 0x00;
        k1=k2=k3=k4=1;
       Num=123;Num1=456;
        Timer0_init() ;
      
        while(1)
        {

                                        unsigned char y;        

                                y=keyscan();
                                        if(y!=0)      
                         {
                                 if(y==1)      Num++;
         else if(y==2) Num--;
         else if(y==3) Num1 ++;      
         else         Num1--;         
                         }

                 }
         }


void TM1_Isr0()interrupt 1   //数码管扫描定时器0      
{   
         
        unsigned int s;

        if(++s>1)
  {      s=0;
      Led_Seg(Num);P00=1;
                        Led_Seg1(Num1);
}
}
看看这个四个按键分别控制两组三位数码管加减
回复

使用道具 举报

ID:161164 发表于 2024-1-23 21:25 | 显示全部楼层
不说一下数码管程序显示亮度不一致原因是什么吗?

中断里不要用延时!
中断里不要用延时!
中断里不要用延时!
回复

使用道具 举报

ID:72649 发表于 2024-1-23 23:03 来自手机 | 显示全部楼层
lkc8210 发表于 2024-1-23 21:25
不说一下数码管程序显示亮度不一致原因是什么吗?

中断里不要用延时!

消隐问题
回复

使用道具 举报

ID:517951 发表于 2024-1-25 13:07 | 显示全部楼层
要把IO口设置为准双向口, 然后接5K-10K的上拉电阻, 通过按键接地, 当按键按下后, IO电平为低, 程序读取IO口电平, 就能判断是否有按键被按下了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表