打印
[STM32F1]

STM32同一I/O口做按键检测和数据输出复用问题

[复制链接]
2851|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
仙人球W|  楼主 | 2014-10-28 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能描述:
1,8个I/O作按键检测输入和数码管显示输出
2,现在按键和显示(5个数码管动态显示)单独使用好用

问题:
1,按键检测时 输出寄存必须置1,显示出问题
2,显示3ms,在3ms内执行按键检测(显示正常)按键不好用

如何解决,个人感觉这两个间有矛盾。为了检测按键得输出高电位短时间内不能输出数据信息,会导致显示问题。如果检测时间过短,显示正常,按键检测不到。STM32的I/O口 在输入输出复用问题上感觉没51准双向I/O口好用了?
大神指教!!
沙发
mmuuss586| | 2014-10-29 20:43 | 只看该作者
你设置的啥模式啊??浮空输入吗

使用特权

评论回复
板凳
airwill| | 2014-10-30 11:48 | 只看该作者
STM32的I/O口 在输入输出复用问题性能肯定优于 51准双向I/O口,不过上拉能力远没有 51的口强。

在3ms内执行按键检测,按键不好用。 这不应该。我做按键检测,也就不到100微秒的时间供按键信号稳定就可以了。

使用特权

评论回复
地板
仙人球W|  楼主 | 2014-11-4 16:20 | 只看该作者
mmuuss586 发表于 2014-10-29 20:43
你设置的啥模式啊??浮空输入吗

开漏模式呀

使用特权

评论回复
5
仙人球W|  楼主 | 2014-11-4 16:25 | 只看该作者
airwill 发表于 2014-10-30 11:48
STM32的I/O口 在输入输出复用问题性能肯定优于 51准双向I/O口,不过上拉能力远没有 51的口强。

在3ms内执 ...

等这个项目做完 看来得多验证下

使用特权

评论回复
6
mmuuss586| | 2014-11-4 18:53 | 只看该作者
仙人球W 发表于 2014-11-4 16:20
开漏模式呀

上拉电阻接了吗?

使用特权

评论回复
7
仙人球W|  楼主 | 2014-11-5 10:40 | 只看该作者
mmuuss586 发表于 2014-11-4 18:53
上拉电阻接了吗?

接了上拉 显示和按键检测独立都好用 现在分开来了 项目就差个参数复制功能啦 现在用STM32的IIC读写EEPROM 占时用的野火的资料测试 然后再用中断方式

使用特权

评论回复
8
lu50211| | 2014-11-5 10:50 | 只看该作者
仙人球W 发表于 2014-11-5 10:40
接了上拉 显示和按键检测独立都好用 现在分开来了 项目就差个参数复制功能啦 现在用STM32的IIC读写EEPROM ...

显示和按键要分开来做,比如:四位数码管,8个按健接段码。

需要:用一计数器计数,从0-3用于显示,4用于按键检测,大于等于5就把计数器清零。
//====================================================================
//===          显示扫描函数          ===//
void display_scan(void)
{//采用扫描段码方法,需要扫描8次。
    unsigned char i;
/*    p_seg_a = 0;
    p_seg_b = 0;
    p_seg_c = 0;
    p_seg_d = 0;
    p_seg_e = 0;
    p_seg_f = 0;
    p_seg_g = 0;
    p_seg_h = 0;
    p_dig_1 = 1;
    p_dig_2 = 1;
    p_dig_3 = 1;
    p_dig_4 = 1;
    p_dig_5 = 1;
    p_dig_6 = 1;*/
    _pa |= 0xe4;
    _pa &= 0x17;
    _pb |= 0x01;
    _pb &= 0x07;
    _pc  = 0x02; 关闭显示,防止出现鬼影
//======================================//
    for(i = 0;i < 4;i ++)
    {
        r_dis_data = table_seg[r_dis_buff];
    }
    if(r_dis_data[0] & (1 << r_dig_bit)) p_dig_1 = 0;//给位码值
    if(r_dis_data[1] & (1 << r_dig_bit)) p_dig_2 = 0;
    if(r_dis_data[2] & (1 << r_dig_bit)) p_dig_3 = 0;
    if(r_dis_data[3] & (1 << r_dig_bit)) p_dig_4 = 0;
    if(r_dis_buff[4] & (1 << r_dig_bit)) p_dig_5 = 0;
    if(r_dis_buff[5] & (1 << r_dig_bit)) p_dig_6 = 0;
    switch (r_dig_bit)
    {
        case 0:
            p_seg_a = 1;//开段码
            break;
        case 1:
            p_seg_b = 1;
            break;
        case 2:
            p_seg_c = 1;
            break;
        case 3:
            p_seg_d = 1;
            break;
        case 4:     
            p_seg_e = 1;
            break;
        case 5:
            p_seg_f = 1;
            break;
        case 6:
            p_seg_g = 1;
            break;
        case 7:
            p_seg_h = 1;
            break;
        default:
                keyscan_process();//按键处理函数
            break;
    }

    r_dig_bit ++;
    if(r_dig_bit >= 9)
    r_dig_bit = 0;
}

使用特权

评论回复
9
mmuuss586| | 2014-11-5 12:49 | 只看该作者
仙人球W 发表于 2014-11-5 10:40
接了上拉 显示和按键检测独立都好用 现在分开来了 项目就差个参数复制功能啦 现在用STM32的IIC读写EEPROM ...

哦,这样也行;

使用特权

评论回复
10
仙人球W|  楼主 | 2014-11-7 13:57 | 只看该作者
lu50211 发表于 2014-11-5 10:50
显示和按键要分开来做,比如:四位数码管,8个按健接段码。

需要:用一计数器计数,从0-3用于显示,4用 ...

受教啦 改天试试的 现在用STM32f103的IIC对AT24C32AN_32K(EEPROM)读写,用的野火代码 只能写不能读,读的时候死在while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); // Added by Najoua                总线忙标志位  不知道什么原因,劳烦赐教。

使用特权

评论回复
11
周董| | 2014-11-9 19:22 | 只看该作者
仙人球W 发表于 2014-11-7 13:57
受教啦 改天试试的 现在用STM32f103的IIC对AT24C32AN_32K(EEPROM)读写,用的野火代码 只能写不能读,读 ...

恩 有道理啊

使用特权

评论回复
12
仙人球W|  楼主 | 2014-11-18 10:45 | 只看该作者
还等一下

使用特权

评论回复
13
小班儿| | 2014-11-18 11:09 | 只看该作者
不太建议这样复用使用.

使用特权

评论回复
14
仙人球W|  楼主 | 2014-11-21 13:33 | 只看该作者
小班儿 发表于 2014-11-18 11:09
不太建议这样复用使用.

为什了 这样不是节省资源?

使用特权

评论回复
15
lu50211| | 2015-1-2 11:56 | 只看该作者
小班儿 发表于 2014-11-18 11:09
不太建议这样复用使用.

当你硬件资源受限,且成本控制严格的时候(客户指定IC),你不复用都不行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

720

帖子

5

粉丝