欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

clock.c

ARM芯片LPC2131的一个完整的中断时钟程序
C
字号:
// 说明: 利用LPC2131实现可调时电子钟功能
// 硬件连接:SEG:P0.0~P0.6;	BIT:P0.8~P0.13
// 
// 编写: 王晓荣
// 日期: 20080514
#include <LPC213X.H>

#define OFF 10 
const unsigned char LEDMAP[] =
{
	0x3f, 0x06, 0x5b, 0x4f, 0x66, 
	0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x00
};
unsigned char state;
unsigned char LEDBuf[6]; 
unsigned char sec;
unsigned char min;
unsigned char hour;

//void  __irq shiftState();
//void  __irq adjustTime();
//void  __irq Timer1s();
void  __irq shiftState() 		//需加IRQ标识号
{	
	state ++;
	if(state == 4)
		state = 0; 
    
	EXTINT = 0X01;		    //清中断标志       
	VICVectAddr = 0x00;		//ppt//清中断地址
}

void  __irq adjustTime() 		//需加IRQ标识号
{	
	switch(state)
	{
	case 1:
		sec++;
		if(sec == 60)
			sec = 0;
		break;
	case 2:
		min++;
		if(min == 60)
			min = 0;
		break;
	case 3:
		hour++;
		if(hour == 24)
			hour = 0;
		break;
	}	   
	EXTINT = 0X02;		    //清中断标志       
	VICVectAddr = 0x00;		//ppt//清中断地址
}

void  __irq Timer1s() 
{
	sec++;		
	if(60 == sec)
	{
		sec = 0;
		min ++;	
		if(60 == min)
		{
			min = 0;
			hour ++;	
			if(24 == hour)
			{
				hour = 0;			
			}
		}
	}	
	T0IR = 0x01;        //清中断标志
	VICVectAddr = 0x00;		
}
delay1ms();
display();
showNormal();
showAdjustSec();
showAdjustMin();
showAdjustHour();
main()
{
//将引脚P0_14设为外部中断1输入引脚
//将引脚P0_16设为外部中断0输入引脚
	PINSEL0 = 0x20000000; 
	PINSEL1 = 0x01;
	IO0DIR |= 0X00003F7F;
//外部中断0和1均使用边沿触发	   
	EXTMODE = 0X03;

	T0TC = 0;		   //定时器0赋初值
	T0PR = 0;		   //TC每经过PR + 1 个pclk周期加1
	T0MCR = 0X03;      //MR0与TC匹配时,产生中断,TC清0 
	T0MR0 = 11059200;  //1S定时
	T0TCR = 0x01;	   //启动定时器
		
	VICIntSelect = 0x00;  // 所有中断都不采用FIQ 
		
//将14#中断设为向量IRQ,并绑定通道0(最高优先级)
	VICVectCntl0 = 0x20 | 14; 	
	VICVectAddr0 = (unsigned int) shiftState; 
//将15#中断设为向量IRQ,并绑定通道1
	VICVectCntl1 = 0x20 | 15;	         
	VICVectAddr1 = (unsigned int) adjustTime;
//将 4#中断设为向量IRQ,并绑定通道2
	VICVectCntl2 = 0x20 | 4; 	
	VICVectAddr2 = (unsigned int) Timer1s;
		 
	VICIntEnable = 0xc010;    //使能4、14、15
	
	while(1)
	{
		switch(state)
		{
		case 0:
			showNormal();
			break;
		case 1:
			showAdjustSec();
			break;
		case 2:
			showAdjustMin();
			break;
		case 3:
			showAdjustHour();
			break;
		default:
			state = 0;
			break;
		}
		display();			
	}
}

showNormal()
{	
	LEDBuf[0] = sec%10;
	LEDBuf[1] = sec/10;
	LEDBuf[2] = min%10;
	LEDBuf[3] = min/10;
	LEDBuf[4] = hour%10;
	LEDBuf[5] = hour/10;		
}

showAdjustSec()
{
	LEDBuf[0] = sec%10;
	LEDBuf[1] = sec/10;
	LEDBuf[2] = OFF;
	LEDBuf[3] = OFF;
	LEDBuf[4] = OFF;
	LEDBuf[5] = OFF;    
}

showAdjustMin()
{
	LEDBuf[0] = OFF;
	LEDBuf[1] = OFF;
	LEDBuf[2] = min%10;
	LEDBuf[3] = min/10;
	LEDBuf[4] = OFF;
	LEDBuf[5] = OFF;     
}

showAdjustHour()
{
	LEDBuf[0] = OFF;
	LEDBuf[1] = OFF;
	LEDBuf[2] = OFF;
	LEDBuf[3] = OFF;
	LEDBuf[4] = hour%10;
	LEDBuf[5] = hour/10;    
}

delay1ms()
{
	unsigned int i;
	for(i = 2500; i > 0; i--); 	
}
display()
{
	unsigned char i;
	unsigned char outbit;
	outbit = 0x01;  // 从右边开始显示
	for (i = 0; i < 6; i++)
	{
		// 关所有LED		
		IO0SET = 0x3f << 8;
		// 送数据  
		IO0SET = LEDMAP[LEDBuf[i]];
		IO0CLR = ~LEDMAP[LEDBuf[i]]; 
		IO0SET = (~outbit) << 8;
		IO0CLR = outbit << 8; 		
		delay1ms();
		outbit <<= 1;     // 显示下一位
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -