找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机多个IO输入端,有什么比较好的方法检测出其中的IO口发生变化

[复制链接]
ID:878906 发表于 2021-3-3 18:24 | 显示全部楼层 |阅读模式
IAP15W系列的单片机芯片,假设有30个IO口(P0~P7都有用到)都作为输入口,初始化时都默认为高电平。有什么比较好的方法检测出其中的IO口发生变化(有可能是多个都变低)后去做相应动作?请各个大神指教?

回复

使用道具 举报

ID:743654 发表于 2021-3-3 20:30 | 显示全部楼层
最土的方法,全接LED灯,看灯的状态。
回复

使用道具 举报

ID:888199 发表于 2021-3-4 00:40 | 显示全部楼层
不能轮询或者定时中断查询吗?
回复

使用道具 举报

ID:470833 发表于 2021-3-4 08:41 | 显示全部楼层
用万用表测
回复

使用道具 举报

ID:798631 发表于 2021-3-4 12:26 | 显示全部楼层
设置各个口线触发的任务序号           序号根据需要进行任务的轻重缓急进行分配 ,合理调度就可以了   
回复

使用道具 举报

ID:451718 发表于 2021-3-4 14:35 | 显示全部楼层
本帖最后由 robinsonlin 于 2021-3-4 14:37 编辑

//--------对于每个端口,定义一个结构体
struct ADDR
{
        unsigned char bit0: 1;
        unsigned char bit1: 1;
        unsigned char bit2: 1;
        unsigned char bit3: 1;
        unsigned char bit4: 1;
        unsigned char bit5: 1;
        unsigned char bit6: 1;
        unsigned char bit7: 1;
}addrP0;
//---------定义一个状态变量
unsigned char Dev_AddrP0 ;
//---------端口状态读取函数
unsigned char ReadDevAddrP0(void)
{
        if(P0^0 == 1)addrP0.bit0 = 1;
        else addrP0.bit0 = 0;
        
        if(P0^1 == 1)addrP0.bit1 = 1;
        elseaddrP0.bit1 = 0;
        
        if(P0^2 == 1)addrP0.bit2 = 1;
        else addrP0.bit2 = 0;

       .........省略P0^3到P0^7的检测语句
        
        Dev_AddrP0 = (*((unsigned char*)&addrP0)) & 0xff;
       return Dev_AddrP0;
}

检测函数返回的值,就是端口对于IO口的状态
回复

使用道具 举报

ID:451718 发表于 2021-3-4 14:58 | 显示全部楼层
补充:上贴是默认初始状态都为低的。  如果初始状态都为高,要检测低电平事件,就把返回值按位取反就好了。
回复

使用道具 举报

ID:883031 发表于 2021-3-4 21:34 | 显示全部楼层
先保存初始端口值,再读入端口值,若两者不等,说明端口有变化,再将新读入的值保存,反复判断。
回复

使用道具 举报

ID:858964 发表于 2021-3-5 14:31 | 显示全部楼层
若仅是监测IO口变化而无须对变化作处理,
建议用cheney03推荐的做法:查看各路IO的LED灯亮/灭,
这一般的工控做法,用指示灯显示外设状态;
.
若须要对IO口发后变化进行实时处理,
建议用robinsonlin推荐的做法:
循环扫描各IO口的0/1状态并作相应处理。

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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