📄 keyscounter.c
字号:
/********************************************************
文件名 :KeyCounter.c **
功能描述:在数码管上显示按键的击键次数,计数范围0~255,**
计满255次后显示会自动清零,重新计数
********************************************************/
#include "p30f6014.h"
const char Table1[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e}; //不带小数点的显示段码表,依顺序为0-F共16个
int failmemory[40];
unsigned char KeypressTimes = 0;
unsigned char KeyCounter[3];
//初始化系统程序
void InitializeSys();
//SPI输出初始化
void InitializeSPIOut();
//初始化键盘
void InitializeKeyboard();
//键盘状态的读取及判别
void DealWithKeys();
//显示计数值的格式化
void FormatKeypressTimes();
//在数码管上显示计数值
void DisplayOnLED();
//系统初始化子程序,放在程序首部
void InitializeSys()
{
SRbits.IPL = 7; //关闭所有可屏蔽中断
}
void InitializeSPIOut()
{
TRISF = TRISF&0xfebf; //RF6、RF8输出
TRISG = TRISG&0xfdff; //RG9输出
SPI1CON = 0x0379; // 字节通讯模式,CKP=1,CKE=1,FOSC/32,时钟上升沿发送数据
SPI1STATbits.SPIEN = 1; //SPI1EN=1
IFS0bits.SPI1IF = 0; // 清除SPI1IF标志
}
void InitializeKeyboard()
{
TRISD = (TRISD | 0xff00); //将RD8-RD15配置为输入,D0~D7
TRISD = (TRISD & 0xfff8); //RD0-RD2配置为输出,作138译码
}
void DealWithKeys()
{
int i;
PORTD = (PORTD&0xfff8); //选中KEYA,对S1~S8的按键次数进行累加计数
if ((PORTD&0xff00) != 0xff00) //查询是否有键按下
{
for (i=0; i<100; i++); //延时消抖
if ((PORTD&0xff00) != 0xff00)
KeypressTimes += 1; //进行累加计数
while ((PORTD&0xff00) != 0xff00); //不对一次长按按键进行多次计数
}
PORTD = ((PORTD&0xfff8)|0x0001); //选中KEYB
if ((PORTD&0xff00) != 0xff00)
{
for (i=0; i<100; i++); //延时消抖
if ((PORTD&0xff00) != 0xff00)
KeypressTimes += 1; //进行累加计数
while ((PORTD & 0xff00)!= 0xff00); //不对一次长按按键进行多次计数
}
}
void FormatKeypressTimes()
{
unsigned char i,Temp;
Temp = KeypressTimes;
for(i=0; i<3; i++) //将KeypressTimes的百、十、个位存储在数组中
{
KeyCounter[2-i] = Temp%10;
Temp /= 10;
}
}
void DisplayOnLED()
{
int i;
PORTGbits.RG9 = 0; //为锁存作准备
for(i=0; i<5; i++) //熄灭前五个数码管
{
SPI1BUF = 0xff;
while(SPI1STATbits.SPITBF == 1);
}
for(i=0; i<3; i++) //在后三个数码管上显示按键击键次数
{
SPI1BUF = Table1[KeyCounter[i]];
while(SPI1STATbits.SPITBF == 1);
}
SPI1BUF = 0xff;
while(SPI1STATbits.SPITBF == 1);
PORTGbits.RG9 = 1; //给锁存信号
}
main()
{
InitializeSys();
InitializeKeyboard();
InitializeSPIOut();
while(1)
{
DealWithKeys();
FormatKeypressTimes();
DisplayOnLED();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -