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

📄 main.c

📁 这是我从朋友那搞到的pic学习资料
💻 C
字号:
/* ****************************************************************
** 功能描述: 采用查询方式识别键盘,按下K1键时第一个数码管数码管显示1,按下K2键时显示2,按下K3键时显示3,按下K4键时显示4
*************************************************************** */
#include	"pic18.h"		/* PIC18系列的头文件 */
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显示段码表 */
unsigned char data;			/* 定义查询按键的键值寄存器 */

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

/* ****************************************************************
** 函 数 名: 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=6553; i>0;--i)
		i=i;
}

/* ****************************************************************
** 函 数 名: KEYSERVE()
** 功能描述: 键服务子程序,确定当前的按键键值
*************************************************************** */
char	KEYSERVE()
{
	unsigned	char	j;
	RB1=0;					/* K1,K2置低电平 */
	RA3=0;				
	PORTE=3;				/* K3,K4置高电平 */
	if(RB4==0)				/* RB4为0,表示按键为K1,K2中的一个 */
	{
		RB1=0;				/* K1置低电平 */ 
		RA3=1;				/* K2置高电平 */
		if(RB4==0)	j=0X01; /* RB4为0,表示按键为K1 */
		else	
			j=0X02;			/* RB4为1,表示按键为K2 */
	}
	else					/* RB4为1,表示按键为K3,K4中的一个 */
	{
		RE0=0;				/* K3置低电平*/
		RE1=1;				/* K4置高电平 */
		if(RB4==0)	j=0X03;	/* RB4为0,表示按键为K3 */
		else	
			j=0X04;			/* RB4为1,表示按键为K4 */
	}
	while(1)
	{
		if(RB4==1) break;	/*为了防止一次按键多次识别,等键松开才返回*/
	}
	return(j);
}

/* ****************************************************************
** 函 数 名: KEYSCAN()
** 功能描述: 键扫描子程序,查询当前是否有按键按下
*************************************************************** */
char	KEYSCAN()
{
	unsigned	char	j=0;	
	RB1=0;
	RA3=0;
	PORTE=0;				/* 将K1,K2,K3,K4四条列线置0 */
	if (RB4==0)				/* 有键按下,RB4为0表示有键按下 */
	{
		DELAY();			/* 软件延时 */
		if (RB4==0)
			j=KEYSERVE();	/* 如果仍有键按下,则调用键服务子程序 */
		else	j=0x00;		/* 如果为干扰,则令返回值为0 */
	}
	else	j=0x00;			/* 如果为干扰,则令返回值为0 */
	return(j);
}
	
/* ****************************************************************
** 函 数 名: 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 发送完成标志 */
}

/* ****************************************************************
** 函 数 名: display(unsigned  char  data)
** 功能描述: 在第8个数码管显示数据,其余7个不显示(全暗)
*************************************************************** */
void	display(unsigned  char  data)
{
	unsigned  char  k;

	RA5=0;					/* 准备锁存显示数据 */
	data=table[data];		/* 查与显示数据对应的段码 */
	SPILED(data);			/* 发送显示段码 */
	for(k=1;k<8;k++)
	{
		SPILED(0Xff);		/* 发送当前数码管不显示段码 */
	}
	RA5=1;					/* 给锁存信号,显示数字 */
}

main()					
{
	initial();				// 系统初始化
	keyinitial();			// 键盘按键相应口初始化子程序
	SPIinitial();			// SPI输出初始化子程序
	display(0XFF);			/* 清数码管当前显示 */
	while(1)
	{
		data=KEYSCAN();		/* 键扫描子程序*/
		if(data!=0)
			display(data);  /* 如有键按下,在数码管上显示按键值 */
	}
}

⌨️ 快捷键说明

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