我是靠谱客的博主 外向万宝路,这篇文章主要介绍关于STC按键INT0外部上拉改内部上拉后上电误触发1次探讨,现在分享给大家,希望可以做个参考。

一、问题

前段时间碰到个问题:STC8 按键接P32外部中断脚INT0(边沿或下降沿),用外部上拉电阻本来很正常的,后来想改用内部上拉4.1K省个电阻,结果每次上电INT0误触发+1次!理应等同,已验证内部上拉电阻设置成功,已排除其他干扰,百思不得其解!决定必须一查到底!

二、之前代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void BOOT() //初始化; (STC8G1K08) { dl_ms(100); //上电适当延时一下好些; P1M1=P3M1=P5M1=0x00; //P1P3P5口:均设双向置1(其他上电默认值无需设置); KEY= 0; //初值: Kc短按次数); G=R=b=W=0, dl_ms(1000); //开机/复位后: 绿红蓝白灯全亮1s再灭; G=R=b=W=1, dl_ms(1000); //问题: 以上3行放最后面编译代码少1B;奇怪? P_SW2 |= 0x80; //访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才要); P3IE=0x08; //输入只留P32(其余全关); P3PU=0x04; //使能内部上拉电阻; TMOD= 0x01; //T0:模式01;16位不自动重载(默认12T);按键消抖用的查询方式; EX0=EX1=EA =1; //开中断; }

三、解决过程

1、 先暂时软件处理上电按键次数-1次。可以解决。还得追究原因;

2、后试了开中断前后加空操作或足够的延时等办法,均无效;

3、后来,调整段落,发现将第3段代码(最后5行)改到第2段代码(中间3行)的前面后,居然正常了(关键终于用内部上拉或外部上拉都一样正常了)!还是不得其解!2短代码顺序看不出问题!编译后代码还少1B?于是继续研究...理论上:  上拉电阻用外接或内置一样效果才对, 只需注意先设置好后再开中断;

4、最后:最终还是加了1句“IE0=IE1=0”后才全都很正常了,2段代码顺序无影响了,STC INT0口据实际需要,设为双向(无需上拉)或高阻(内部或外部上拉)都正常了;

5、结果:原来用外部中断脚,开中断前,还是得先清除中断标志位才可靠!(据说老鸟都经历过,呵呵!)

  四、目前代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void BOOT() //初始化; (STC8G1K08) { dl_ms(100); //上电适当延时一下好些; P1M1=P3M1=P5M1=0x00; //P1P3P5口:均设双向置1(其他上电默认值无需设置); KEY= 0; //初值: Kc短按次数); G=R=b=W=0, dl_ms(1000); //开机/复位后: 绿红蓝白灯全亮1s再灭; G=R=b=W=1, dl_ms(1000); //问题: 以上3行放最后面编译代码少1B;奇怪? P_SW2 |= 0x80; //访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才要); P3IE=0x08; //输入只留P32(其余全关); P3PU=0x04; //使能内部上拉电阻; TMOD= 0x01; //T0:模式01;16位不自动重载(默认12T);按键消抖用的查询方式; IE0=IE1=0; //必须加这1句先清0才行!不然上电很可能会误触发1次!!! EX0=EX1=EA =1; //开中断; }

最后

以上就是外向万宝路最近收集整理的关于关于STC按键INT0外部上拉改内部上拉后上电误触发1次探讨的全部内容,更多相关关于STC按键INT0外部上拉改内部上拉后上电误触发1次探讨内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部