仿真效果图
我写的一个秒的计时程序,使用了向量中断模式,把秒显示在数码管上。发表在空间表示我在学习,没有颓废**/
/*****************************此次实验用的是LPC2132,晶振是12MHz,当然,周立功公司在程序前面是有7 ARM7板底层个文件,和启动文件,在这里不能列出****************************************************************/
#include "config.h"
#define key1 (1<<25) // P0.25 ,
/************数码管显示代码和数码管位显示的代码*****************************************///
unsigned int num_code[]={0xff00003f,0xff000006,0xff00005b,0xff00004f,0xff000066,0xff00006d,0xff00007d,0xff000007,0xff00007f,0xff00006f};
unsigned int wei[]={0xfffe0000,0xfffd0000,0xfffb0000,0xfff70000};//定义位选的列表,32位的数值
/***************************************************************************************/
unsigned char n=0;//秒计数变量,8位
/*******************************************************************************************
** 函数名称 : DelayNS()
** 函数功能 : 长软件延时。
** 入口参数 : dly 延时控制值,值越大延时越长
** 出口参数 : 无
******************************************************************************************
*/
void DelayNS(uint32 dly)//延时函数
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<3400; i++);//初定为3400个自减变量,用于数码管延时显示
}
/***************************************数码管显示程序********************************************/
void display(unsigned int x)
{
unsigned int i;
unsigned int dis_num[4];
unsigned int temp;
temp=x;
for(i=0;i<4;i++) //限定4位显示
{
dis_num[i]=temp%10; //把最低位的模取出来
temp=temp/10; //把要显示的数值缩小十倍
IO0CLR=0xffffffff; //把低8位和位(位控制端的高8位同时清空为0000
IO0SET=num_code[dis_num[i]]; //送往P0.0-P0.8显示
IO0SET=wei[i]; //位的切换
DelayNS(2);
}
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_Timer0 (void)//中断格式和函数名字在LPC的底层和开始文件定义了
{
n++;
if (n >= 60)
n=0; /*判断你的值,使其少于60 */
T0IR = 0x01; /* 清除中断标志 */
VICVectAddr = 0x00; /* 通知VIC中断处理结束 */
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :使用定时器实现1秒钟定时,控并且在led数码管上显示。中断方式。
** 调试说明 :
*********************************************************************************************************
*/
int main(void)
{
uint32 temp_key;//按键定义,此程序未用到
PINSEL0 = 0x00000000; // 设置P0.0~P0.15为GPIO功能
PINSEL1 = 0x00000000; // 设置P0.16~P0.31为GPIO功能
IO0DIR = 0xffffffff; // 设置BEEP控制口P0.7为输出模式,(P0的)其它I/O为输入模式
IO0SET = 0xffffffff; // 控制BEEP(P0.7)输出高电平1
IRQEnable(); /* IRQ中断使能,此函数的定义在底层驱动文件中 */
// 由于LPC2131的P0口的I/O与其它功能复用,比如P0.7与PWM2、SSEL0、EINT2复用,
// 所以要先设置管脚连接。把口线设置为GPIO功能时,才能进行I/O控制。
/* 定时器0初始化 */
T0TC = 0; /* 定时器设置为0 */
T0PR = 0; /* 时钟不分频 */
T0MCR = 0x03; /* 设置T0MR0匹配后复位T0TC,并产生中断标志 */
T0MR0 = Fpclk / 2; /* 0.5秒钟定时,据蓝鸟说,如是Fpclk / 1,就是一秒 */
T0TCR = 0x01; /* 启动定时器 */
/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; /* 所有中断通道设置为IRQ中断 */
VICVectCntl0 = 0x20 | 0x04; /* 设置定时器0中断通道分配最高优先级 */
VICVectAddr0 = (uint32)IRQ_Timer0; /* 设置中断服务程序地址 */
VICIntEnable = 1 << 0x04; /* 使能定时器0中断 */
while(1)
{
display(n);//不停的显示数值
}
return 0;
}