⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是我从朋友那搞到的pic学习资料
💻 C
字号:
/* ****************************************************************
** 功能描述: 定时器0计时的秒表及显示
*************************************************************** */
#include	"pic18.h"				/* PIC18系列的头文件 */
unsigned	char  s[4]={0,0,0,0};	/* 定义0.01 秒、0.1 秒、1秒、10秒计时器 ,初值为0 */
unsigned	char	keytime=0;		// 定义按键按下次数
unsigned	char	keyflag=0;		// 是否有键按下:=1表示有新键按下;=0表示无新键按下
const	char	table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
							//不带小数点的显示段码表,依顺序为0-F共16个
const	char	table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
							//带小数点的0-9显示段码表

/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void	initial()
{
	INTCON=0x00;			/* bit7-bit0:关总中断 */
	ADCON1=0X07;			/* 设置数字输入输出口 */
	PIE1=0;					/* PIE1 的中断不使能 */			
	PIE2=0;					/* PIE2 的中断不使能 */	
	PIE3=0;					/* PIE3 的中断不使能 */	
}

/* ****************************************************************
** 函 数 名: tmint()
** 功能描述: TMR0初始化子程序,10ms中断1次
*************************************************************** */
void	tmint()
{
	T0CON=0X09;			//设定TMR0工作于16位定时器方式,内部时钟,不分频
	INTCON=INTCON|0X20;	//TMR0中断允许
	INTCON=INTCON&0Xfb;	//清除TMR0的中断标志
	TMR0IP=1;				//TMR0中断高优先级
	IPEN=1;					//使能中断优先级
}

/* ****************************************************************
** 函 数 名: SPIinitial()
** 功能描述: SPI输出初始化子程序
*************************************************************** */
void	SPIinitial()
{
	TRISA=TRISA&0xdf;		/* 设置RA5输出74HC595锁存信号 */
	TRISC=TRISC&0xd7;		// SDO(RC5)引脚为输出,SCK(RC3)引脚为输出
	SSPCON1=0x30;			// SSPEN=1;CKP=1,FOSC/4
	SSPSTAT=0xC0;			// 时钟下降沿发送数据
	SSPIF=0;					// 清除SSPIF标志
}

/* ****************************************************************
** 函 数 名: SPILED()
** 功能描述: SPI传输数据(发送数据)子程序
*************************************************************** */
void  	SPILED(char	data)
{
	SSPBUF=data;				/* 启动 SPI 发送 */
	do
	{
	  ;
	}while(SSPIF==0);			/* 等待SPI 发送完成 */
	SSPIF=0;					/* 清SPI 发送完成标志 */
}

/* ****************************************************************
** 函 数 名: keyinitial()
** 功能描述: 键盘按键相应口初始化子程序
*************************************************************** */
void	keyinitial()
{
	TRISB=TRISB|0x10;		//RB4输入(读键)
	TRISB=TRISB&0xfd;		//RB1输出(k1)
	TRISE=TRISE&0xfc;		//E口设置为输出RE0(K3),RE1(k4)
	TRISA=TRISA&0xf7;		//RA3设置为输出(k2)
	RB1=0;
	RA3=0;
	PORTE=0;				//将K1,K2,K3,K4四条列线置0	
}

/* ****************************************************************
** 函 数 名: DELAY()
** 功能描述: 软件延时子程序
*************************************************************** */
void 	DELAY()
{
	unsigned  int  i;

	for(i = 3553; i>0;i--)
		i=i;
}	

/* ****************************************************************
** 函 数 名: dealtime()
** 功能描述: 处理定时器中断子程序
** 作    者: 刘   钊
** 日    期: 2004年3月31日
*************************************************************** */
void	dealtime()
{
	s[0]=s[0]+1;				//10ms计数
	if(s[0]==10)				//每到100ms
	{
		s[0]=0	;
		s[1]=s[1]+1;			//100ms计数
		if(s[1]==10)
		{
			s[1]=0	;
			s[2]=s[2]+1;		//秒计数
			if(s[2]==10)
			{
				s[2]=0;
				s[3]=s[3]+1;	//10S计数
				if(s[3]==10)	s[3]=0;
			}
		}
	}
}

/* ****************************************************************
** 函 数 名: interrupt	HI_ISR()
** 功能描述: 高优先级中断子程序:定时器TMR0 10ms定时中断
*************************************************************** */
void	interrupt HI_ISR()
{
	if(TMR0IF==1)			// 定时器0中断
	{
		TMR0H=0Xd9;		// FFFF-d900=9983采用 4M 晶振,指令周期1微秒
		TMR0L=0X00;		// 对TMR0写入10ms定时调整值9983
		TMR0IF=0;			// 清除中断标志
		dealtime();			// 处理定时器中断子程序
	}
}

/* ****************************************************************
** 函 数 名: dealanjian()
** 功能描述: 键盘按键后处理按键子程序
** 作    者: 刘   钊
** 日    期: 2004年3月31日
*************************************************************** */
void	dealanjian()
{
	unsigned	char	k=0;

	keyflag=0;				//清新键按下标志
	if(keytime==0)				//keytime=0,表示秒表清0
	{
		for(k=0;k<4;k++)		//赋显示初值
			s[k]=0;			
	}

	else	if(keytime==1)			//keytime==1为开始计时键
	{
		TMR0ON=1;			// 打开定时器0
		TMR0H=0Xd8;	
		TMR0L=0Xf4;			// 对TMR0写入初值.注意:与溢出中断写初值不同。
	}

	else	if(keytime==2)			//keytime==2为停止计时键
		TMR0ON=0;			//关定时器
}

/* ****************************************************************
** 函 数 名: display()
** 功能描述: 8个数码管显示数据子程序 
*************************************************************** */
void	display()
{
	unsigned  char  k;
	unsigned  char  data;

	RA5=0;						/* 准备锁存显示数据 */
	/* 显示4位秒表(占用4个数码管99.99s)*************** */
	for(k=0;k<4;k++)
	{
		data=s[k];
		if(k==2)	data=table0[data];	//秒个位需要显示小数点
		else	data=table[data];
		SPILED(data);				//发送显示段码
	}
	/* 显示4位秒表(占用4个数码管99.99s)*************** */

	for(k=0;k<4;k++)
	{
		data=0xFF;
		SPILED(data);				// 连续发送4个DARK(即4个数码管不显示)
	}
	RA5=1;						/* 给锁存信号,显示数字 */
}

/* ****************************************************************
** 函 数 名: KEYSCAN()
** 功能描述: 按键键扫描子程序
*************************************************************** */
void	KEYSCAN()
{
	display();						//调用一次秒表显示子程序
	while(RB4==0)	
	{
		DELAY();				//若有键按下,则软件延时
		if (RB4==1)	return;		//防抖,若为抖动返回
		while(1)
		{
			display();				//调用一次秒表显示子程序
			if (RB4==1)			//为防止按键过于灵敏,每次等键松开才返回
			{
				keytime=keytime+1;//按键按下次数
				if(keytime>2)
					keytime=0;	//键1表示开始,键2表示停止,键0表示清0
				keyflag=1;		//是否有新键按下:=1表示有新键按下
				return;			//为防止按键过于灵敏,每次等键松开才返回
			}
		}			
	}
}

main()					
{
	initial();						/* 系统初始化子程序 */
	tmint();						//TMR0初始化
	SPIinitial();					/* SPI初始化子程序 */
	keyinitial();					//按键键盘初始化
	IPEN=1;						//使能中断高低优先级
	INTCON=INTCON|0xc0;		// 开总中断、开外围接口中断
	while(1)
	{
		display();					//调用一次显示子程序(SPI串行输出秒表)
		KEYSCAN();				//查是否有键按下(如有键按下,直至按键松开为止)			
		if(keyflag==1)				//=1表示有新键按下;=0表示无新键按下
			dealanjian();			//处理按键子程序(秒表工作方式)
	}
}

⌨️ 快捷键说明

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