?? 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 + -