中断键盘扫描
有程序吗 贴出来看看
就是在中断里面读取管脚的电平判断就是了
#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不是很懂你这个按键按下去有接地?