[技术问答] N79E815,我用POO接了一个按钮,然后控制P30口的电平。硬件板上一上电就执行P30=0了。

[复制链接]
2832|26
 楼主| 听沙的声音 发表于 2018-10-30 12:02 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include "N79E81x.h"
#include "Typedef.h"
#include "Define.h"
#include "Common.h"
#include <intrins.h>
#include "Version.h"
#include "Delay.h"
#include <string.h>
#define P00_Quasi_Mode                                P0M1&=~SET_BIT0;P0M2&=~SET_BIT0
#define P30_Quasi_Mode                                P3M1&=~SET_BIT0;P3M2&=~SET_BIT0
unsigned char key;
void main(void)
{
            P00_Quasi_Mode;
      P30_Quasi_Mode;
      key=P00;  
                         while(1)
                        {
                         if(key !=1 )
                           {
                                       
                              Delay1ms(500);
                                    if(key !=1 )
                                      {
                                                  P30=0;
                                }
           
         }
       }       
}
 楼主| 听沙的声音 发表于 2018-10-30 12:05 | 显示全部楼层
所以按钮就根本没起作用,写的if语句一上电为什么就是真,执行了。求高手指教,我是在io口配置方面有问题吗?那个IO口模式的配置我看和N76E003差不多,就直接从N76E003那里照搬过来了。
天灵灵地灵灵 发表于 2018-10-30 12:33 | 显示全部楼层
电路出来啊,你怎么接的这个端口的图啊。
天灵灵地灵灵 发表于 2018-10-30 12:33 | 显示全部楼层
另外KEy要设置为输入模式啊,是读取外部的状态。输入模式。
 楼主| 听沙的声音 发表于 2018-10-30 12:37 | 显示全部楼层
天灵灵地灵灵 发表于 2018-10-30 12:33
另外KEy要设置为输入模式啊,是读取外部的状态。输入模式。

准双向不是也可以作为输入吗,求指教
天灵灵地灵灵 发表于 2018-10-30 12:39 | 显示全部楼层
好像这个模式你需要设置一个上拉电阻才行。你看传统的8051,就是这种接口模式,所以做Key的时候喜欢用个上拉电阻,按下时候拉低到地,松手后又拉高。
 楼主| 听沙的声音 发表于 2018-10-30 13:07 | 显示全部楼层
天灵灵地灵灵 发表于 2018-10-30 12:39
好像这个模式你需要设置一个上拉电阻才行。你看传统的8051,就是这种接口模式,所以做Key的时候喜欢用个上 ...

我的硬件电路确实没有加上拉电阻,就是一个按钮和电容并联接到P00,因为我想着单片机上电后P00就是高电平,然后只需要读一下按钮按下是个低电平这个状态。然后用示波器测,P00始终是高电平的,但P30从一开始就是低电平。所以就懵逼了。复位电路我是通过100欧电阻和10uf电容串联到地,reset脚连到电阻和电容间
 楼主| 听沙的声音 发表于 2018-10-30 13:08 | 显示全部楼层
这是我的硬件图
QQ截图20181030130224.png

评论

我的VDD是有5v供电的,图上没体现出来  发表于 2018-10-30 13:09
天灵灵地灵灵 发表于 2018-10-30 15:26 | 显示全部楼层
这个按键有毒。
天灵灵地灵灵 发表于 2018-10-30 15:31 | 显示全部楼层
  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. }



天灵灵地灵灵 发表于 2018-10-30 15:33 | 显示全部楼层
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Apr/21/2017
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 I/O Interrupt demo code
  14. //***********************************************************************************************************

  15. #include "N76E003.h"
  16. #include "SFR_Macro.h"
  17. #include "Function_define.h"
  18. #include "Common.h"
  19. #include "Delay.h"

  20. #if 0
  21. //Following setting in Function_define.h

  22. ///****************************************************************************
  23. //   Enable INT port 0~3
  24. //***************************************************************************/
  25. //#define         Enable_INT_Port0                                        PICON &= 0xFB;
  26. //#define                Enable_INT_Port1                                        PICON |= 0x01;
  27. //#define                Enable_INT_Port2                                        PICON |= 0x02;
  28. //#define                Enable_INT_Port3                                        PICON |= 0x03;
  29. ///*****************************************************************************
  30. // Enable each bit low level trig mode
  31. //*****************************************************************************/
  32. //#define                Enable_BIT7_LowLevel_Trig                        PICON&=0x7F;PINEN|=0x80;PIPEN&=0x7F
  33. //#define                Enable_BIT6_LowLevel_Trig                        PICON&=0x7F;PINEN|=0x40;PIPEN&=0xBF
  34. //#define                Enable_BIT5_LowLevel_Trig                        PICON&=0xBF;PINEN|=0x20;PIPEN&=0xDF
  35. //#define                Enable_BIT4_LowLevel_Trig                        PICON&=0xBF;PINEN|=0x10;PIPEN&=0xEF
  36. //#define                Enable_BIT3_LowLevel_Trig                        PICON&=0xDF;PINEN|=0x08;PIPEN&=0xF7
  37. //#define                Enable_BIT2_LowLevel_Trig                        PICON&=0xEF;PINEN|=0x04;PIPEN&=0xFB
  38. //#define                Enable_BIT1_LowLevel_Trig                        PICON&=0xF7;PINEN|=0x02;PIPEN&=0xFD
  39. //#define                Enable_BIT0_LowLevel_Trig                        PICON&=0xFD;PINEN|=0x01;PIPEN&=0xFE
  40. ///*****************************************************************************
  41. // Enable each bit high level trig mode
  42. //*****************************************************************************/
  43. //#define                Enable_BIT7_HighLevel_Trig                        PICON&=0x7F;PINEN&=0x7F;PIPEN|=0x80
  44. //#define                Enable_BIT6_HighLevel_Trig                        PICON&=0x7F;PINEN&=0xBF;PIPEN|=0x40
  45. //#define                Enable_BIT5_HighLevel_Trig                        PICON&=0xBF;PINEN&=0xDF;PIPEN|=0x20
  46. //#define                Enable_BIT4_HighLevel_Trig                        PICON&=0xBF;PINEN&=0xEF;PIPEN|=0x10
  47. //#define                Enable_BIT3_HighLevel_Trig                        PICON&=0xDF;PINEN&=0xF7;PIPEN|=0x08
  48. //#define                Enable_BIT2_HighLevel_Trig                        PICON&=0xEF;PINEN&=0xFB;PIPEN|=0x04
  49. //#define                Enable_BIT1_HighLevel_Trig                        PICON&=0xF7;PINEN&=0xFD;PIPEN|=0x02
  50. //#define                Enable_BIT0_HighLevel_Trig                        PICON&=0xFD;PINEN&=0xFE;PIPEN|=0x01
  51. ///*****************************************************************************
  52. // Enable each bit falling edge trig mode
  53. //*****************************************************************************/
  54. //#define                Enable_BIT7_FallEdge_Trig                        PICON|=0x80;PINEN|=0x80;PIPEN&=0x7F
  55. //#define                Enable_BIT6_FallEdge_Trig                        PICON|=0x80;PINEN|=0x40;PIPEN&=0xBF
  56. //#define                Enable_BIT5_FallEdge_Trig                        PICON|=0x40;PINEN|=0x20;PIPEN&=0xDF
  57. //#define                Enable_BIT4_FallEdge_Trig                        PICON|=0x40;PINEN|=0x10;PIPEN&=0xEF
  58. //#define                Enable_BIT3_FallEdge_Trig                        PICON|=0x20;PINEN|=0x08;PIPEN&=0xF7
  59. //#define                Enable_BIT2_FallEdge_Trig                        PICON|=0x10;PINEN|=0x04;PIPEN&=0xFB
  60. //#define                Enable_BIT1_FallEdge_Trig                        PICON|=0x08;PINEN|=0x02;PIPEN&=0xFD
  61. //#define                Enable_BIT0_FallEdge_Trig                        PICON|=0x04;PINEN|=0x01;PIPEN&=0xFE
  62. ///*****************************************************************************
  63. // Enable each bit rasing edge trig mode
  64. //*****************************************************************************/
  65. //#define                Enable_BIT7_RasingEdge_Trig                        PICON|=0x80;PINEN&=0x7F;PIPEN|=0x80
  66. //#define                Enable_BIT6_RasingEdge_Trig                        PICON|=0x80;PINEN&=0xBF;PIPEN|=0x40
  67. //#define                Enable_BIT5_RasingEdge_Trig                        PICON|=0x40;PINEN&=0xDF;PIPEN|=0x20
  68. //#define                Enable_BIT4_RasingEdge_Trig                        PICON|=0x40;PINEN&=0xEF;PIPEN|=0x10
  69. //#define                Enable_BIT3_RasingEdge_Trig                        PICON|=0x20;PINEN&=0xF7;PIPEN|=0x08
  70. //#define                Enable_BIT2_RasingEdge_Trig                        PICON|=0x10;PINEN&=0xFB;PIPEN|=0x04
  71. //#define                Enable_BIT1_RasingEdge_Trig                        PICON|=0x08;PINEN|=0xFD;PIPEN&=0x02
  72. //#define                Enable_BIT0_RasingEdge_Trig                        PICON|=0x04;PINEN|=0xFE;PIPEN&=0x01
  73. #endif

  74. /******************************************************************************
  75. * FUNCTION_PURPOSE: I/O Pin interrupt Service Routine
  76. ******************************************************************************/
  77. void EXT_INT0(void) interrupt 0
  78. {
  79.                                 clr_GPIO1;
  80.                         Timer0_Delay1ms(100);
  81.                         set_GPIO1;
  82.                         Timer0_Delay1ms(100);
  83.                         clr_GPIO1;
  84.                         Timer0_Delay1ms(100);
  85.                         set_GPIO1;
  86.                         Timer0_Delay1ms(100);   
  87.                         clr_GPIO1;
  88.                         Timer0_Delay1ms(100);
  89.                         set_GPIO1;
  90.                         Timer0_Delay1ms(100);
  91.                         clr_GPIO1;
  92.                         Timer0_Delay1ms(100);
  93.                         set_GPIO1;
  94.                         Timer0_Delay1ms(100);  
  95.                                 clr_GPIO1;
  96.                         Timer0_Delay1ms(100);
  97.                         set_GPIO1;
  98.                         Timer0_Delay1ms(100);
  99.                         clr_GPIO1;
  100.                         Timer0_Delay1ms(100);
  101.                         set_GPIO1;
  102.                         Timer0_Delay1ms(100);   
  103.                         clr_GPIO1;
  104.                         Timer0_Delay1ms(100);
  105.                         set_GPIO1;
  106.                         Timer0_Delay1ms(100);
  107.                         clr_GPIO1;
  108.                         Timer0_Delay1ms(100);
  109.                         set_GPIO1;
  110.                         Timer0_Delay1ms(100);  
  111.                 }

  112. void PinInterrupt_ISR (void) interrupt 7
  113. {
  114.         if(PIF == 0x01)
  115.         {
  116.     PIF = 0x00;                             //clear interrupt flag
  117.                         clr_GPIO1;
  118.                         Timer1_Delay10ms(10);
  119.                         set_GPIO1;
  120.                         Timer1_Delay10ms(10);
  121.                         clr_GPIO1;
  122.                         Timer1_Delay10ms(10);
  123.                         set_GPIO1;
  124.                         Timer1_Delay10ms(10);   
  125.                
  126.         }
  127.         else if (PIF == 0x80)
  128.         {
  129.                         clr_GPIO1;
  130.                         Timer1_Delay10ms(10);
  131.                         set_GPIO1;
  132.                         Timer1_Delay10ms(10);
  133.                         clr_GPIO1;
  134.                         Timer1_Delay10ms(10);
  135.                         set_GPIO1;
  136.                         Timer1_Delay10ms(10);   
  137.                         clr_GPIO1;
  138.                         Timer1_Delay10ms(10);
  139.                         set_GPIO1;
  140.                         Timer1_Delay10ms(10);
  141.                         clr_GPIO1;
  142.                         Timer1_Delay10ms(10);
  143.                         set_GPIO1;
  144.                         Timer1_Delay10ms(10);   
  145.         }
  146. }
  147. /******************************************************************************
  148. The main C function.  Program execution starts
  149. here after stack initialization.
  150. ******************************************************************************/
  151. void main (void)
  152. {

  153.     P07_Input_Mode;
  154.                 set_P0S_7;
  155.                 P00_Input_Mode;
  156.                 P01_Input_Mode;
  157.                 set_P0S_1;
  158.                 P12_PushPull_Mode;
  159.                 P30_PushPull_Mode;
  160.                 P05_PushPull_Mode;
  161.        
  162.                
  163. //----------------------------------------------------
  164. //        P0.5 set as highlevel trig pin interrupt function
  165. //  Keep P0.5 connect to VDD LED will tickle
  166. //  otherwise, MCU into power down mode.
  167. //----------------------------------------------------
  168.                 Enable_INT_Port2;
  169. //                Enable_BIT7_LowLevel_Trig;
  170.                 Enable_BIT0_LowLevel_Trig;

  171.                 P30 =1;
  172.                 P05 = 0;

  173.     set_EPI;                                                        // Enable pin interrupt
  174.                 set_EX0;
  175.     set_EA;                                                                // global enable bit
  176.    
  177.     while(1)
  178.                 {
  179.                         P01=0;
  180.                         P30=0;
  181.                         P01=1;
  182.                         P30=1;
  183.                 }

  184. }


天灵灵地灵灵 发表于 2018-10-30 15:33 | 显示全部楼层
这是官方跟按键相关的一个例子。还有你的按键电路都不对。
玛尼玛尼哄 发表于 2018-10-30 15:43 | 显示全部楼层
988575bd80bb681eaf.png
这样才叫按键。
玛尼玛尼哄 发表于 2018-10-30 15:46 | 显示全部楼层
638715bd80c42b94a6.png
或者直接这样,可能需要配置成输入模式。
玛尼玛尼哄 发表于 2018-10-30 15:49 | 显示全部楼层
输入模式应该由外部设备或电阻提供一个确定的电平。悬浮的引脚在掉电状态下会引起漏电。
应该这个模式也是需要配置一个上拉或者下拉的。
huarana 发表于 2018-10-30 16:31 | 显示全部楼层
内部有上拉的话配置成内部上拉,没有的话只有外面加上拉了。
 楼主| 听沙的声音 发表于 2018-10-30 18:29 | 显示全部楼层
天灵灵地灵灵 发表于 2018-10-30 15:33
这是官方跟按键相关的一个例子。还有你的按键电路都不对。

试了下加上拉电阻,可以了,非常谢谢
 楼主| 听沙的声音 发表于 2018-10-30 18:29 | 显示全部楼层

嗯嗯,对,谢谢指教
 楼主| 听沙的声音 发表于 2018-10-30 18:31 | 显示全部楼层
huarana 发表于 2018-10-30 16:31
内部有上拉的话配置成内部上拉,没有的话只有外面加上拉了。

嗯嗯,准双向口倒是有三种上拉模式,但发现不管用
 楼主| 听沙的声音 发表于 2018-10-30 18:33 | 显示全部楼层
玛尼玛尼哄 发表于 2018-10-30 15:46
或者直接这样,可能需要配置成输入模式。

我直接检测按钮有没有按下,就是把P00当成输入引脚来用的,然后设置成准双向口,发现还是要加上拉电阻才有效果
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

73

帖子

1

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