所需的原理图:
不同按键的配置过程不一样,我采用了按键p1_1
1、配置LED的初始化
void LED_init() // LED灯初始化
{
P0SEL &=~0X12;
P0DIR |=0X12;
}
2、配置外部中断函数:
void NVIC_Init()//按键P1_1中断初始化
{
EA=1; //开启总中断
IEN2=0X10; //中断端口2初始化
P1IEN |=0X02; //p1_1位中断使能
PICTL |=0X02; //配置为下降沿触发
P1IFG |=0X00; //初始化中断标志位,默认值为0,
}
3、中断服务函数:
#pragma vector =P1INT_VECTOR
__interrupt void P1_ISR(void)
{
if(P1IFG>0)
{
Delay10ms(); //按键消抖
if(S3==0) //判断按键是否按下
{
static int digital_bety=0; //定义一个标志位
digital_bety++; //数字累加,计数范围为0~9
if(digital_bety==10)
{
digital_bety=0;
}
digital_tube_BYTE(digital_bety);//数码管显示不同的数字
led2=!led2;led3=!led3; //led取反
}
}
P1IFG=0; //清除中断标志位
IEN2|=0; //清除中断标志
}
4、数码管的初始化以及读取数码管的键值:
static UCHAR digital[]={0x3f,0x06,0x5b,0x4f,//0,1,2,3,4,5,6,7,8,9,灭
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00};
void digital_tube_Init()//数码管的初始化 P1_2以及P1_3
{
P1SEL &=~0x0C; // 配置为普通IO模式
P1DIR |=0x0C;// 配置为输出模式
}
void digital_tube_BYTE(UCHAR Index) //P1.3 DATA P1.2 CLK
{
UCHAR i=0;
UCHAR Data=digital[Index];//读取数码管的位值
for(;i<8;i++)//8位将数据一位一位的读取出来
{
if(0x80 & Data)
{
P1_3=1;
}
else
{
P1_3=0;
}
Data=Data << 1;//移位
P1_2=0;
P1_2=1;
}
}
5、main函数;
void main()
{
LED_init();
NVIC_Init();
digital_tube_Init();
digital_tube_BYTE(0);
led2=1;//灭灯
led3=1;
while(1)
{
}
}
最后完整代码:
//test.c:
#include <iocc2530.h>
#include "test.h"
#include "digital.h"
void NVIC_Init()//按键P1_1中断初始化
{
EA=1; //开启总中断
IEN2=0X10; //中断端口2初始化
P1IEN |=0X02; //p1_1位中断使能
PICTL |=0X02; //配置为下降沿触发
P1IFG |=0X00; //初始化中断标志位,默认值为0,
}
void LED_init() // LED灯初始化
{
P0SEL &=~0X12;
P0DIR |=0X12;
}
void main()
{
LED_init();
NVIC_Init();
digital_tube_Init();
digital_tube_BYTE(0);
led2=1;//灭灯
led3=1;
while(1)
{
}
}
#pragma vector =P1INT_VECTOR
__interrupt void P1_ISR(void)
{
if(P1IFG>0)
{
Delay10ms(); //按键消抖
if(S3==0) //判断按键是否按下
{
static int digital_bety=0; //定义一个标志位
digital_bety++; //数字累加,计数范围为0~9
if(digital_bety==10)
{
digital_bety=0;
}
digital_tube_BYTE(digital_bety);//数码管显示不同的数字
led2=!led2;led3=!led3; //led取反
}
}
P1IFG=0; //清除中断标志位
IEN2|=0; //清除中断标志
}
//test.h
#define led2 P0_1//LED
#define led3 P0_4//LED
#define S3 P1_1//按键
void LED_init();
void Delay10ms() //@11.0592MHz,延时函数
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
//digital.c
#include <ioCC2530.h>
#include "digital.h"
static UCHAR digital[]={0x3f,0x06,0x5b,0x4f,//0,1,2,3,4,5,6,7,8,9,灭
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00};
void digital_tube_Init()//数码管的初始化 P1_2以及P1_3
{
P1SEL &=~0x0C; // 配置为普通IO模式
P1DIR |=0x0C;// 配置为输出模式
}
void digital_tube_BYTE(UCHAR Index) //P1.3 DATA P1.2 CLK
{
UCHAR i=0;
UCHAR Data=digital[Index];//读取数码管的位值
for(;i<8;i++)//8位将数据一位一位的读取出来
{
if(0x80 & Data)
{
P1_3=1;
}
else
{
P1_3=0;
}
Data=Data << 1;//移位
P1_2=0;
P1_2=1;
}
}
//digital.h
#ifndef __digital_H__
#define __digital_H__
#include<ioCC2530.h>
#define UCHAR unsigned char
void digital_tube_Init();
void digital_tube_BYTE(UCHAR Data);//P1.3 DATA P1.2 CLK
#endif