找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2905|回复: 8
收起左侧

中微的单片机程序请教大神 发现IO口没有检测到上拉的5V,更是检测不了按键

[复制链接]
ID:607312 发表于 2020-9-26 09:10 | 显示全部楼层 |阅读模式
以下这个程序我用CMS89F6285B来做的,但是发现IO口没有检测到上拉的5V。更是检测不了按键。请问=大神帮忙看看是哪里错了

#include <cms.h>


#define                BSET(x,y)        x|=(1<<y)                //将寄存器x第y位置1
#define                BCLR(x,y)        x&=~(1<<y)                //将寄存器x第y位置0

#define                Key1                RB1                                //定义按键IO口
#define                Key2                RB2
#define                Key3                RB3
#define                Key4                RB4
#define                Led1                RE3                                //定义Led IO口


volatile unsigned char KeyData;                        //按键值
volatile unsigned char KeyFlag;                        //按键标志,0位有按键、1位有短按键、2位有长按键
//函数声明
void Kscan(void);        
void Maink(void);

//主程序
void main(void)
{

        TRISA = 0B11111111;                                //配置IO状态
        TRISB = 0B11111111;
        TRISC = 0B11111111;
        TRISE = 0B00000000;
        
        //PORTB = 0B11111111;
        
        WPUA = 0B11111111;                                //配置上拉情况
        WPUB = 0B00011110;
        WPUC = 0B00000000;
        WPUE = 0B00000000;                                                //1为使能上拉,0为禁止上拉
        
        while(1)
        {
                asm("clrwdt");                                        //清看门狗
               
                Kscan();                                                //按键扫描
                Maink();                                                //按键处理
        }
}

/***********************************************
函数名称:Kscan
函数功能:按键扫描
入口参数:无
出口参数:无
备注:
************************************************/
void Kscan()
{        
        static unsigned char keycount,nkeycount,keyold;
        static unsigned int keylong;
        
        KeyData = 0;
        
        if(!Key1)                                                        //为低时有按键
                BSET(KeyData,0);
        if(!Key2)               
                BSET(KeyData,1);
        if(!Key3)               
                BSET(KeyData,2);
        if(!Key4)        
                BSET(KeyData,3);
        
        if(KeyData)                                                        //有按键                                                
        {        
                if(KeyData == keyold)                        //键值等于旧键值
                {
                        if(KeyFlag & 0x02)                        //有按键判断长按键
                        {
                                if((KeyData == 0x99) && (++keylong >= 200))//匹配有长按键的按键,如需长按键可修改KeyData匹配值
                                {
                                        keylong =0;
                                        BSET(KeyFlag,0);        //有按键标志
                                        BSET(KeyFlag,2);        //长按键标志                                       
                                }                                                                                       
                        }                        
                        else if(++keycount >= 5)        //消抖动
                        {
                                BSET(KeyFlag,0);                //有按键标志
                                BSET(KeyFlag,1);                //短按键标志
                        }
                }
                else
                {
                        keyold =KeyData;
                        keycount =0;        
                }               
        }
        else                                                                //无按键
        {
                keycount =0;
                keylong =0;        
                if(++nkeycount >=5)                                //无按键超过5次时清标志位
                {
                        KeyFlag =0;
                        KeyData =0;
                        keyold =0;
                }        
        }        
}
/***********************************************
函数名称:Maink
函数功能:按键处理
入口参数:无
出口参数:无
备注:
************************************************/
void Maink()
{
        if(KeyFlag & 0x01)
        {        
                BCLR(KeyFlag,0);
                                
                switch(KeyData)
                {
                        case 0x01: Led1 = 1; break;
                        case 0x02: Led1 = 0; break;
                        case 0x04: Led1 = 1; break;
                        case 0x08: Led1 = 0; break;                                                                                       
                }
        }        
}

回复

使用道具 举报

ID:654028 发表于 2020-9-26 14:12 | 显示全部楼层
电压没有的话找找电路原因
回复

使用道具 举报

ID:607312 发表于 2020-9-26 16:26 | 显示全部楼层
心有浮生 发表于 2020-9-26 14:12
电压没有的话找找电路原因

没有电路了,我直接把单片机VCC,GND接2条线出来测试了同样是没有电压,我也打开了上拉。求大神指教啊
回复

使用道具 举报

ID:654028 发表于 2020-9-26 17:41 | 显示全部楼层
cdiyy 发表于 2020-9-26 16:26
没有电路了,我直接把单片机VCC,GND接2条线出来测试了同样是没有电压,我也打开了上拉。求大神指教啊

没电压怎么能驱动芯片工作啊
回复

使用道具 举报

ID:607312 发表于 2020-9-27 09:57 | 显示全部楼层
心有浮生 发表于 2020-9-26 17:41
没电压怎么能驱动芯片工作啊

5V是正常的,配置了IO口为输入脚,同时打开了上拉电阻,可是该IO脚没有输入的检测5V
回复

使用道具 举报

ID:235954 发表于 2020-9-27 17:00 | 显示全部楼层
TRISA<7:0>: PORTA 三态控制位 1 = PORTA 引脚被配置为输入(三态) 0 = PORTA 引脚被配置为输出
回复

使用道具 举报

ID:235954 发表于 2020-9-27 17:01 | 显示全部楼层
WPUA<7:0>: 弱上拉寄存器位 1 = 使能上拉 0 = 禁止上拉
回复

使用道具 举报

ID:607312 发表于 2020-9-29 14:09 | 显示全部楼层
梁廷明 发表于 2020-9-27 17:01
WPUA: 弱上拉寄存器位 1 = 使能上拉 0 = 禁止上拉

求大神帮忙看看如何修改啊,搞得怀疑人生了
回复

使用道具 举报

ID:705966 发表于 2021-11-6 10:50 | 显示全部楼层
        TRISA = 0B11111111;                                //配置IO状态
        TRISB = 0B11111111;
        TRISC = 0B11111111;
1全改为0试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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