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

📄 keyscounter.c

📁 《dsPIC通用数字信号控制器原理及应用》源码
💻 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 + -