📄 main.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 + -