打印
[技术问答]

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

[复制链接]
2278|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#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要设置为输入模式啊,是读取外部的状态。输入模式。

使用特权

评论回复
5
听沙的声音|  楼主 | 2018-10-30 12:37 | 只看该作者
天灵灵地灵灵 发表于 2018-10-30 12:33
另外KEy要设置为输入模式啊,是读取外部的状态。输入模式。

准双向不是也可以作为输入吗,求指教

使用特权

评论回复
6
天灵灵地灵灵| | 2018-10-30 12:39 | 只看该作者
好像这个模式你需要设置一个上拉电阻才行。你看传统的8051,就是这种接口模式,所以做Key的时候喜欢用个上拉电阻,按下时候拉低到地,松手后又拉高。

使用特权

评论回复
7
听沙的声音|  楼主 | 2018-10-30 13:07 | 只看该作者
天灵灵地灵灵 发表于 2018-10-30 12:39
好像这个模式你需要设置一个上拉电阻才行。你看传统的8051,就是这种接口模式,所以做Key的时候喜欢用个上 ...

我的硬件电路确实没有加上拉电阻,就是一个按钮和电容并联接到P00,因为我想着单片机上电后P00就是高电平,然后只需要读一下按钮按下是个低电平这个状态。然后用示波器测,P00始终是高电平的,但P30从一开始就是低电平。所以就懵逼了。复位电路我是通过100欧电阻和10uf电容串联到地,reset脚连到电阻和电容间

使用特权

评论回复
8
听沙的声音|  楼主 | 2018-10-30 13:08 | 只看该作者
这是我的硬件图

QQ截图20181030130224.png (36.74 KB )

QQ截图20181030130224.png

使用特权

评论回复
评论
听沙的声音 2018-10-30 13:09 回复TA
我的VDD是有5v供电的,图上没体现出来 
9
天灵灵地灵灵| | 2018-10-30 15:26 | 只看该作者
这个按键有毒。

使用特权

评论回复
10
天灵灵地灵灵| | 2018-10-30 15:31 | 只看该作者
/* ***************************************************** */
// 工  程   : N76E003AT20核心板
// 文件名   : GPIO
// 处理器   : N76E003AT20(TSSOP20)
// 编译环境 : Keil4 C51
// 系统时钟 : 内部RC时钟频率16MHz
// 功能说明 :
// 版    本        : V1.0
// 生成日期        : 2016-10-28                                          
/* ***************************************************** */
// 功能:  GPIO模式测试

//***********************************************************************************************************
//  File Function: N76E003 GPIO demo code
//***********************************************************************************************************

#include <stdio.h>
#include "N76E003.h"
#include "Define.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

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


UINT16 T0_CNT=0;

UINT8 u8TH0_Tmp,u8TL0_Tmp;
UINT8 SystemTime0_5Ms_cnt=0;

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

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

// 枚举类型
/* ***************************************************** */
enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};
/* ***************************************************** */


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

/* *****************************************************
* 函数名称:KeyScan(void)
* 函数功能:扫描按键
* 入口参数:无
* 出口参数:无     
* 功能描述:基于状态机的
/* ***************************************************** */
void KeyScan(void)
{
        static UINT16 KeyStateTemp = 0,KeyTime = 0;
        UINT8 num;
        bit KeyPressTemp;
        KeyPressTemp=Key1;                                        //读取I/O口的键值
        switch(KeyStateTemp)
        {
                case StateInit:                                                //按键初始状态
                        if(!KeyPressTemp)                                //当按键按下,状态切换到确认态
                                KeyStateTemp = StateAffirm;
                        break;
                case StateAffirm:                                        //按键确认态
                        if(!KeyPressTemp)                                //抖动已经消除
                        {
                                KeyTime = 0;
                                KeyStateTemp = StateSingle;        //切换到单次触发态
                        }
                        else KeyStateTemp = StateInit;         //还处于抖动状态,切换到初始态
                        break;
                case StateSingle:                                        //按键单发态
                        if(KeyPressTemp)                                //按下时间小于1s且按键已经释放
                        {
                                KeyStateTemp =StateInit;          //按键释放,则回到初始态
                            P03=~P03;  //LED取反   松手后有效
                       
                         }
                        else if(++KeyTime >300)                //按下时间大于3s(300*10ms)
                        {
                                KeyStateTemp = StateRepeat;        //状态切换到连发态
                                KeyTime = 0;       
                        }
                        break;
                case StateRepeat:                                        //按键连发态       
                        if(KeyPressTemp)
                                KeyStateTemp = StateInit;        //按键释放,则进初始态
                        else                                                        //按键未释放
                        {
                                if(++KeyTime > 10)                        //按键计时值大于100ms(10*10ms)
                                {
                                        KeyTime = 0;       
                                        num++;                                         //键值每过100ms加一次
                                        if(8==num)
                                                num = 0;
                                }
                                break;
                        }
                        break;
               
                        default:        //KeyStateTemp = KeyStateTemp = StateInit;
                        break;                       
        }
}

void main (void)
{
        GPIO_init();            // IO端口初始化                                        // Define in Function_define.h
        TIMER0_MODE1_ENABLE;
         clr_T0M;           //设置定时器0为12T
        //set_T0M;
       
        u8TH0_Tmp = (65536-TH0_INIT)/256;
    u8TL0_Tmp = (65536-TL0_INIT)%256;
       
        TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
       

       
       
        set_ET0;                                    //开启 Timer0 中断
        set_EA;                                     //开启 总中断
    set_TR0;                                    //Timer0 开启
       
  while(1)          
  {
       if(SystemTime0_5Ms==1)
           {
                   SystemTime0_5Ms=0;
                   SystemTime0_5Ms_cnt++;
                   if(SystemTime0_5Ms_cnt==2)
                   {
                           SystemTime0_5Ms_cnt=0;
                           KeyScan();              //每5MS 扫描一次按键
                   }   
           }
  }
}
/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
{
        TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
        SystemTime0_5Ms=1;
            
       

     T0_CNT++;
        if(T0_CNT==100)
        {
                T0_CNT=0;
        P12 = ~P12;                     // GPIO1 toggle when interrupt
        }       
}



使用特权

评论回复
11
天灵灵地灵灵| | 2018-10-30 15:33 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

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

//***********************************************************************************************************
//  File Function: N76E003 I/O Interrupt demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

#if 0
//Following setting in Function_define.h

///****************************************************************************
//   Enable INT port 0~3
//***************************************************************************/
//#define         Enable_INT_Port0                                        PICON &= 0xFB;
//#define                Enable_INT_Port1                                        PICON |= 0x01;
//#define                Enable_INT_Port2                                        PICON |= 0x02;
//#define                Enable_INT_Port3                                        PICON |= 0x03;
///*****************************************************************************
// Enable each bit low level trig mode
//*****************************************************************************/
//#define                Enable_BIT7_LowLevel_Trig                        PICON&=0x7F;PINEN|=0x80;PIPEN&=0x7F
//#define                Enable_BIT6_LowLevel_Trig                        PICON&=0x7F;PINEN|=0x40;PIPEN&=0xBF
//#define                Enable_BIT5_LowLevel_Trig                        PICON&=0xBF;PINEN|=0x20;PIPEN&=0xDF
//#define                Enable_BIT4_LowLevel_Trig                        PICON&=0xBF;PINEN|=0x10;PIPEN&=0xEF
//#define                Enable_BIT3_LowLevel_Trig                        PICON&=0xDF;PINEN|=0x08;PIPEN&=0xF7
//#define                Enable_BIT2_LowLevel_Trig                        PICON&=0xEF;PINEN|=0x04;PIPEN&=0xFB
//#define                Enable_BIT1_LowLevel_Trig                        PICON&=0xF7;PINEN|=0x02;PIPEN&=0xFD
//#define                Enable_BIT0_LowLevel_Trig                        PICON&=0xFD;PINEN|=0x01;PIPEN&=0xFE
///*****************************************************************************
// Enable each bit high level trig mode
//*****************************************************************************/
//#define                Enable_BIT7_HighLevel_Trig                        PICON&=0x7F;PINEN&=0x7F;PIPEN|=0x80
//#define                Enable_BIT6_HighLevel_Trig                        PICON&=0x7F;PINEN&=0xBF;PIPEN|=0x40
//#define                Enable_BIT5_HighLevel_Trig                        PICON&=0xBF;PINEN&=0xDF;PIPEN|=0x20
//#define                Enable_BIT4_HighLevel_Trig                        PICON&=0xBF;PINEN&=0xEF;PIPEN|=0x10
//#define                Enable_BIT3_HighLevel_Trig                        PICON&=0xDF;PINEN&=0xF7;PIPEN|=0x08
//#define                Enable_BIT2_HighLevel_Trig                        PICON&=0xEF;PINEN&=0xFB;PIPEN|=0x04
//#define                Enable_BIT1_HighLevel_Trig                        PICON&=0xF7;PINEN&=0xFD;PIPEN|=0x02
//#define                Enable_BIT0_HighLevel_Trig                        PICON&=0xFD;PINEN&=0xFE;PIPEN|=0x01
///*****************************************************************************
// Enable each bit falling edge trig mode
//*****************************************************************************/
//#define                Enable_BIT7_FallEdge_Trig                        PICON|=0x80;PINEN|=0x80;PIPEN&=0x7F
//#define                Enable_BIT6_FallEdge_Trig                        PICON|=0x80;PINEN|=0x40;PIPEN&=0xBF
//#define                Enable_BIT5_FallEdge_Trig                        PICON|=0x40;PINEN|=0x20;PIPEN&=0xDF
//#define                Enable_BIT4_FallEdge_Trig                        PICON|=0x40;PINEN|=0x10;PIPEN&=0xEF
//#define                Enable_BIT3_FallEdge_Trig                        PICON|=0x20;PINEN|=0x08;PIPEN&=0xF7
//#define                Enable_BIT2_FallEdge_Trig                        PICON|=0x10;PINEN|=0x04;PIPEN&=0xFB
//#define                Enable_BIT1_FallEdge_Trig                        PICON|=0x08;PINEN|=0x02;PIPEN&=0xFD
//#define                Enable_BIT0_FallEdge_Trig                        PICON|=0x04;PINEN|=0x01;PIPEN&=0xFE
///*****************************************************************************
// Enable each bit rasing edge trig mode
//*****************************************************************************/
//#define                Enable_BIT7_RasingEdge_Trig                        PICON|=0x80;PINEN&=0x7F;PIPEN|=0x80
//#define                Enable_BIT6_RasingEdge_Trig                        PICON|=0x80;PINEN&=0xBF;PIPEN|=0x40
//#define                Enable_BIT5_RasingEdge_Trig                        PICON|=0x40;PINEN&=0xDF;PIPEN|=0x20
//#define                Enable_BIT4_RasingEdge_Trig                        PICON|=0x40;PINEN&=0xEF;PIPEN|=0x10
//#define                Enable_BIT3_RasingEdge_Trig                        PICON|=0x20;PINEN&=0xF7;PIPEN|=0x08
//#define                Enable_BIT2_RasingEdge_Trig                        PICON|=0x10;PINEN&=0xFB;PIPEN|=0x04
//#define                Enable_BIT1_RasingEdge_Trig                        PICON|=0x08;PINEN|=0xFD;PIPEN&=0x02
//#define                Enable_BIT0_RasingEdge_Trig                        PICON|=0x04;PINEN|=0xFE;PIPEN&=0x01
#endif

/******************************************************************************
* FUNCTION_PURPOSE: I/O Pin interrupt Service Routine
******************************************************************************/
void EXT_INT0(void) interrupt 0
{
                                clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);   
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);  
                                clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);   
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);  
                }

void PinInterrupt_ISR (void) interrupt 7
{
        if(PIF == 0x01)
        {
    PIF = 0x00;                             //clear interrupt flag
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);   
               
        }
        else if (PIF == 0x80)
        {
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);   
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);   
        }
}
/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{

    P07_Input_Mode;
                set_P0S_7;
                P00_Input_Mode;
                P01_Input_Mode;
                set_P0S_1;
                P12_PushPull_Mode;
                P30_PushPull_Mode;
                P05_PushPull_Mode;
       
               
//----------------------------------------------------
//        P0.5 set as highlevel trig pin interrupt function
//  Keep P0.5 connect to VDD LED will tickle
//  otherwise, MCU into power down mode.
//----------------------------------------------------
                Enable_INT_Port2;
//                Enable_BIT7_LowLevel_Trig;
                Enable_BIT0_LowLevel_Trig;

                P30 =1;
                P05 = 0;

    set_EPI;                                                        // Enable pin interrupt
                set_EX0;
    set_EA;                                                                // global enable bit
   
    while(1)
                {
                        P01=0;
                        P30=0;
                        P01=1;
                        P30=1;
                }

}


使用特权

评论回复
12
天灵灵地灵灵| | 2018-10-30 15:33 | 只看该作者
这是官方跟按键相关的一个例子。还有你的按键电路都不对。

使用特权

评论回复
13
玛尼玛尼哄| | 2018-10-30 15:43 | 只看该作者

这样才叫按键。

使用特权

评论回复
14
玛尼玛尼哄| | 2018-10-30 15:46 | 只看该作者

或者直接这样,可能需要配置成输入模式。

使用特权

评论回复
15
玛尼玛尼哄| | 2018-10-30 15:49 | 只看该作者
输入模式应该由外部设备或电阻提供一个确定的电平。悬浮的引脚在掉电状态下会引起漏电。
应该这个模式也是需要配置一个上拉或者下拉的。

使用特权

评论回复
16
huarana| | 2018-10-30 16:31 | 只看该作者
内部有上拉的话配置成内部上拉,没有的话只有外面加上拉了。

使用特权

评论回复
17
听沙的声音|  楼主 | 2018-10-30 18:29 | 只看该作者
天灵灵地灵灵 发表于 2018-10-30 15:33
这是官方跟按键相关的一个例子。还有你的按键电路都不对。

试了下加上拉电阻,可以了,非常谢谢

使用特权

评论回复
18
听沙的声音|  楼主 | 2018-10-30 18:29 | 只看该作者

嗯嗯,对,谢谢指教

使用特权

评论回复
19
听沙的声音|  楼主 | 2018-10-30 18:31 | 只看该作者
huarana 发表于 2018-10-30 16:31
内部有上拉的话配置成内部上拉,没有的话只有外面加上拉了。

嗯嗯,准双向口倒是有三种上拉模式,但发现不管用

使用特权

评论回复
20
听沙的声音|  楼主 | 2018-10-30 18:33 | 只看该作者
玛尼玛尼哄 发表于 2018-10-30 15:46
或者直接这样,可能需要配置成输入模式。

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

使用特权

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

本版积分规则

9

主题

73

帖子

1

粉丝