微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 中断键盘扫描

中断键盘扫描

时间:10-02 整理:3721RD 点击:
中键盘要如何实现,读不了P1口状态


有程序吗 贴出来看看

就是在中断里面读取管脚的电平判断就是了

#include<c8051f310.h>
#include<intrins.h>
float f_trig,repeat_length=50,num,c_length=314,num_show;
unsigned int key_code,num_state,wei_en,dula_en;
char code led_seg_code[]={0XF3,0X60,0XB5,0XF4,0X66,0XD6,0XD7,0X70,0XF7,0XF6}; //led_seg_code[0-9]代表0-9 的7 段码
sbit INT_0=P0^0;
sbit Decimal=P2^3;
bit sw_power=0,manual,ext_pot_trig=0,auto_trig=0;
void SYSCLK_Init(void);
void PORT_Init(void);
void Ext_Interrupt_Init (void);
void led_show(num_show);
void manage_key1(void);
void key_manage(unsigned char key_code);
void delay(unsigned int i)//延时
{
        while(--i)
{
  _nop_();
        _nop_();
        _nop_();
  _nop_();
  _nop_();
        _nop_();
  _nop_();
        _nop_();
        _nop_();
  _nop_();
        _nop_();
        _nop_();
  _nop_();
        _nop_();
        _nop_();
  _nop_();
        _nop_();
        _nop_();
}
}
void main()
{
unsigned char m,n;
PCA0MD&=~0X40;
SYSCLK_Init();
PORT_Init();
VDM0CN=0X80;

RSTSRC|=0X02;
EA=1;
       
        Ext_Interrupt_Init ();
P1=0XFB;
P2=0X08;
m=0X08;
n=0xfb;
while(1)
{
         if(sw_power==1)
         {
    led_show(f_trig);
         }
         else
         {
    delay(80000);
                Decimal=~Decimal;
         }
         
}
}
void SYSCLK_Init(void)
{
OSCICN=0X80;
RSTSRC=0X04;
}
void PORT_Init(void)
{
  P0MDOUT   = 0xFF;
  P1MDOUT   = 0xFF;
  P2MDOUT   = 0xFF;
        P3MDIN    = 0XF7;
        P2SKIP    =        0XFF;
        P0SKIP    =        0X03;
        XBR1      = 0x40;   
}
void led_show(num_show)
{
unsigned int bai,shi,ge,xiao;
bai=num_show*10/10000;
shi=num_show*10%10000/1000; //显示十位
ge=num_show*10%1000/100;
xiao=num_show*10%100/10;
P2=led_seg_code[bai];
P1=0xfe;
delay(200);
P2=0X00;
P1=0XFF;
P2=led_seg_code[shi];
P1=0xfd;
delay(200);
P2=0X00;
P1=0XFF;
P2=(led_seg_code[ge]|0x08);
P1=0xfb;
delay(200);
P2=0X00;
P1=0XFF;

P2=led_seg_code[xiao];
P1=0xf7;
delay(200);
P2=0X00;
P1=0XFF;
}
void Ext_Interrupt_Init (void)
{
   TCON = 0x05;                        // /INT 0 and /INT 1 are edge triggered
   IT01CF = 0x10;                      // /INT0 active low; /INT0 on P0.0;
                                       // /INT1 active low; /INT1 on P0.1
   EX0 = 1;                            // Enable /INT0 interrupts
}
void INT0_ISR (void) interrupt 0
{
  EA=0;
  TR1=1;
  delay(400);          //消抖
  if(INT_0==0)         //再次判断是否有键按下
  {
    key_code=P1;         //获取键值
        key_manage(key_code);
  }
   EA=1;             
}
void key_manage(unsigned char keycode)
{
  switch(keycode)
  {
         case 0x7f:manage_key1();break;
  
    }
  }
void manage_key1(void)                  //sw8,启动按钮
{  while(INT_0==0);
   manual=0;
   AD0EN =0;
   TR1=0;
   TR0=1;
   ext_pot_trig=0;
   num=f_trig;
   num_state=1;
   sw_power=~sw_power;
   wei_en=0xef;
   dula_en=0x10;
       
}

原是想没开机是小数点闪烁,启动按钮按下即进入中断,读取键值,没读到

图不清楚还是什么,我没看到你按键按下的时候会触发中断,接线没问题么?

线路没问题,途中标号  INT0  KEYX1就是中断了

b不是很懂你这个按键按下去有接地?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top