[技术问答] N76E003 IO内部上拉

[复制链接]
6515|18
 楼主| yjgna 发表于 2018-2-5 15:58 | 显示全部楼层 |阅读模式
请问如何配置IO内部上拉?
小S咯 发表于 2018-2-5 16:20 | 显示全部楼层
#define P00_PushPull_Mode                        P0M1&=~SET_BIT0;P0M2|=SET_BIT0
#define P01_PushPull_Mode                        P0M1&=~SET_BIT1;P0M2|=SET_BIT1
#define P02_PushPull_Mode                        P0M1&=~SET_BIT2;P0M2|=SET_BIT2
#define P03_PushPull_Mode                        P0M1&=~SET_BIT3;P0M2|=SET_BIT3
#define P04_PushPull_Mode                        P0M1&=~SET_BIT4;P0M2|=SET_BIT4
#define P05_PushPull_Mode                        P0M1&=~SET_BIT5;P0M2|=SET_BIT5
#define P06_PushPull_Mode                        P0M1&=~SET_BIT6;P0M2|=SET_BIT6
#define P07_PushPull_Mode                        P0M1&=~SET_BIT7;P0M2|=SET_BIT7
#define P10_PushPull_Mode                        P1M1&=~SET_BIT0;P1M2|=SET_BIT0
#define P11_PushPull_Mode                        P1M1&=~SET_BIT1;P1M2|=SET_BIT1
#define P12_PushPull_Mode                        P1M1&=~SET_BIT2;P1M2|=SET_BIT2
#define P13_PushPull_Mode                        P1M1&=~SET_BIT3;P1M2|=SET_BIT3
#define P14_PushPull_Mode                        P1M1&=~SET_BIT4;P1M2|=SET_BIT4
#define P15_PushPull_Mode                        P1M1&=~SET_BIT5;P1M2|=SET_BIT5
#define P16_PushPull_Mode                        P1M1&=~SET_BIT6;P1M2|=SET_BIT6
#define P17_PushPull_Mode                        P1M1&=~SET_BIT7;P1M2|=SET_BIT7
#define P30_PushPull_Mode                        P3M1&=~SET_BIT0;P3M2|=SET_BIT0
#define GPIO1_PushPull_Mode                P1M1&=~SET_BIT0;P1M2|=SET_BIT0
dongliushui 发表于 2018-2-5 16:21 | 显示全部楼层
N76E003最多支持26个可位寻址的通用I/O引脚,分成4组 P0 到 P3 。每一个端口有它的端口控制寄存器(Px)。端口控制寄存器的写和读有不同的意思。写端口控制寄存器设置输出锁存逻辑值,读端口引脚的逻辑状态。所有I/O引脚(除P2.0)可以被软件独立配置成四种I/O模式中的一种。这四种模式是准双向模式(标准8051端口结构)、推挽输出、输入和开漏模式。每一个端口通过两个特殊功能寄存器PxM1 和 PxM2来选择端口Px的I/O模式。下表指示如何选择Px.n的I/O模式。注意任何复位之后,默认的配置是高阻输入模式。
dongliushui 发表于 2018-2-5 16:21 | 显示全部楼层
推挽模式就行。
 楼主| yjgna 发表于 2018-2-5 17:03 | 显示全部楼层

我试过,还是不行呀。
我用的是P07。

下面两种都试过了
P07_Quasi_Mode;
//P07_PushPull_Mode;
P07 = 1;


按键没有按下时,读回来一直是低电平。

NUC126 内部上拉是 配置成准双向模式,然后输出高电平。N76E003不行。

IO外接按键

IO外接按键
dongliushui 发表于 2018-2-5 17:06 | 显示全部楼层
喔,,你早说清楚啊
dongliushui 发表于 2018-2-5 17:07 | 显示全部楼层
你这个是按键,肯定不能这么搞的。按键你毛线的 推挽啊。推挽是输出用的,你要说清楚。
dongliushui 发表于 2018-2-5 17:09 | 显示全部楼层
别急,我去官方看看 他们开发板怎么做的这个。
dongliushui 发表于 2018-2-5 17:15 | 显示全部楼层
  1. /* ***************************************************** */
  2. // 工  程   : N76E003AT20核心板
  3. // 文件名   : GPIO
  4. // 处理器   : N76E003AT20(TSSOP20)
  5. // 编译环境 : Keil4 C51
  6. // 系统时钟 : 内部RC时钟频率16MHz
  7. // 功能说明 :
  8. // 版    本        : V1.0
  9. // 生成日期        : 2016-10-28                                          
  10. /* ***************************************************** */
  11. // 功能:  GPIO模式测试

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 GPIO demo code
  14. //***********************************************************************************************************

  15. #include <stdio.h>
  16. #include "N76E003.h"
  17. #include "Define.h"
  18. #include "Common.h"
  19. #include "Delay.h"
  20. #include "SFR_Macro.h"
  21. #include "Function_define.h"

  22. #define  Key1 P30 // 按键开关引脚
  23. //#define  T0_10MS  64203     //算法:65536-16000000/1000/12 ,16000000/1000/12是 12T模式1MS的值


  24. UINT16 T0_CNT=0;

  25. UINT8 u8TH0_Tmp,u8TL0_Tmp;
  26. UINT8 SystemTime0_5Ms_cnt=0;

  27. #define TH0_INIT        53333           //定义重装的初值   高位    定时5mS
  28. #define TL0_INIT        53333         //定义重装的初值   低位

  29. bit SystemTime0_5Ms=0;  //定时器5的 5mS系统时标

  30. // 枚举类型
  31. /* ***************************************************** */
  32. enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};
  33. /* ***************************************************** */


  34. /********************************************************
  35. * 函数名称:GPIO_init
  36. * 输    入:无
  37. * 输    出:无
  38. * 功能描述: i/o口初始化
  39. ********************************************************/
  40. void GPIO_init()            // 端口初始化
  41. {
  42.     P0M1=0x00;     //如果板上P0口接了下拉电阻,上电后将补拉成低电平 若要想输出高电平 必设成推挽输出
  43.         P0M2=0x1f;    // 将P0端口接LED灯的引脚配置为推挽输出
  44.        
  45.         P1M1=0x00;
  46.         P1M2=0x07;   // 将P1端口接LED灯的引脚配置为推挽输出
  47.        
  48.         P3M1=0x00;
  49.         P3M2=0x00;  // 将P3端口配置为准双向弱上拉方式
  50.                        
  51.         P0=0Xe0;;            // 关闭P0口接的所有灯
  52.         P1=0Xf8;;            // 关闭P1口接的所有灯
  53. }

  54. /* *****************************************************
  55. * 函数名称:KeyScan(void)
  56. * 函数功能:扫描按键
  57. * 入口参数:无
  58. * 出口参数:无     
  59. * 功能描述:基于状态机的
  60. /* ***************************************************** */
  61. void KeyScan(void)
  62. {
  63.         static UINT16 KeyStateTemp = 0,KeyTime = 0;
  64.         UINT8 num;
  65.         bit KeyPressTemp;
  66.         KeyPressTemp=Key1;                                        //读取I/O口的键值
  67.         switch(KeyStateTemp)
  68.         {
  69.                 case StateInit:                                                //按键初始状态
  70.                         if(!KeyPressTemp)                                //当按键按下,状态切换到确认态
  71.                                 KeyStateTemp = StateAffirm;
  72.                         break;
  73.                 case StateAffirm:                                        //按键确认态
  74.                         if(!KeyPressTemp)                                //抖动已经消除
  75.                         {
  76.                                 KeyTime = 0;
  77.                                 KeyStateTemp = StateSingle;        //切换到单次触发态
  78.                         }
  79.                         else KeyStateTemp = StateInit;         //还处于抖动状态,切换到初始态
  80.                         break;
  81.                 case StateSingle:                                        //按键单发态
  82.                         if(KeyPressTemp)                                //按下时间小于1s且按键已经释放
  83.                         {
  84.                                 KeyStateTemp =StateInit;          //按键释放,则回到初始态
  85.                             P03=~P03;  //LED取反   松手后有效
  86.                        
  87.                          }
  88.                         else if(++KeyTime >300)                //按下时间大于3s(300*10ms)
  89.                         {
  90.                                 KeyStateTemp = StateRepeat;        //状态切换到连发态
  91.                                 KeyTime = 0;       
  92.                         }
  93.                         break;
  94.                 case StateRepeat:                                        //按键连发态       
  95.                         if(KeyPressTemp)
  96.                                 KeyStateTemp = StateInit;        //按键释放,则进初始态
  97.                         else                                                        //按键未释放
  98.                         {
  99.                                 if(++KeyTime > 10)                        //按键计时值大于100ms(10*10ms)
  100.                                 {
  101.                                         KeyTime = 0;       
  102.                                         num++;                                         //键值每过100ms加一次
  103.                                         if(8==num)
  104.                                                 num = 0;
  105.                                 }
  106.                                 break;
  107.                         }
  108.                         break;
  109.                
  110.                         default:        //KeyStateTemp = KeyStateTemp = StateInit;
  111.                         break;                       
  112.         }
  113. }

  114. void main (void)
  115. {
  116.         GPIO_init();            // IO端口初始化                                        // Define in Function_define.h
  117.         TIMER0_MODE1_ENABLE;
  118.          clr_T0M;           //设置定时器0为12T
  119.         //set_T0M;
  120.        
  121.         u8TH0_Tmp = (65536-TH0_INIT)/256;
  122.     u8TL0_Tmp = (65536-TL0_INIT)%256;
  123.        
  124.         TH0 = u8TH0_Tmp;
  125.     TL0 = u8TL0_Tmp;
  126.        

  127.        
  128.        
  129.         set_ET0;                                    //开启 Timer0 中断
  130.         set_EA;                                     //开启 总中断
  131.     set_TR0;                                    //Timer0 开启
  132.        
  133.   while(1)          
  134.   {
  135.        if(SystemTime0_5Ms==1)
  136.            {
  137.                    SystemTime0_5Ms=0;
  138.                    SystemTime0_5Ms_cnt++;
  139.                    if(SystemTime0_5Ms_cnt==2)
  140.                    {
  141.                            SystemTime0_5Ms_cnt=0;
  142.                            KeyScan();              //每5MS 扫描一次按键
  143.                    }   
  144.            }
  145.   }
  146. }
  147. /************************************************************************************************************
  148. *    TIMER 0 interrupt subroutine
  149. ************************************************************************************************************/
  150. void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
  151. {
  152.         TH0 = u8TH0_Tmp;
  153.     TL0 = u8TL0_Tmp;
  154.         SystemTime0_5Ms=1;
  155.             
  156.        

  157.      T0_CNT++;
  158.         if(T0_CNT==100)
  159.         {
  160.                 T0_CNT=0;
  161.         P12 = ~P12;                     // GPIO1 toggle when interrupt
  162.         }       
  163. }



dongliushui 发表于 2018-2-5 17:17 | 显示全部楼层
 楼主| yjgna 发表于 2018-2-5 17:30 | 显示全部楼层
dongliushui 发表于 2018-2-5 17:17
https://bbs.21ic.com/icview-1638702-1-1.html
从这个地方复制来的。

晕,是板子上按键的问题。

我在开发板上测试是正常的。先配置成准双向,然后输出1.


开发板.jpg
dongliushui 发表于 2018-2-5 17:32 | 显示全部楼层
yjgna 发表于 2018-2-5 17:30
晕,是板子上按键的问题。

我在开发板上测试是正常的。先配置成准双向,然后输出1.

好吧,只要理论上没问题,就查硬件,加油。
lailai518 发表于 2019-10-23 21:58 | 显示全部楼层
dongliushui 发表于 2018-2-5 17:17
https://bbs.21ic.com/icview-1638702-1-1.html
从这个地方复制来的。

N76E003AT20核心板  例程资料可以分享给我吗
yehuifei 发表于 2019-10-25 11:25 | 显示全部楼层
推挽是输出,按键直接配准双向输入可以,内部有弱上拉
heisexingqisi 发表于 2019-10-25 22:24 | 显示全部楼层
用宏,看头文件。
小明的同学 发表于 2019-10-25 23:02 | 显示全部楼层
看手册,就知道有没有这个功能,如果有,看头文件,找对应寄存器。
小明的同学 发表于 2019-10-25 23:02 | 显示全部楼层
003都封装好宏了,直接调用
天灵灵地灵灵 发表于 2019-10-25 23:53 | 显示全部楼层
貌似还有下拉电阻。
幸福小强 发表于 2019-10-26 23:42 | 显示全部楼层
搞定就好,先确认自己硬件电路如何接的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

92

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部