lpc2131 arm 驱动数码管 程序

来源:互联网 发布:数据库账号密码 编辑:程序博客网 时间:2024/05/20 07:31

 

                                                     仿真效果图

 

我写的一个秒的计时程序,使用了向量中断模式,把秒显示在数码管上。发表在空间表示我在学习,没有颓废**/
/*****************************此次实验用的是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;
}

原创粉丝点击