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

📄 main.c

📁 这是我做课程设计时自己做的,用摩托罗位的飞思卡尔单片机做的,包括了对键盘复键的处理
💻 C
字号:
                        /*-------------------键盘实验--------------------------*
*文 件 名:Keyboard.c                                   *
*硬件连接:PTA.7-4接键盘4根列线,PTA.3-0接键盘4根行线    *
*程序描述:按下键盘按键,串口发送对应的键值              *
*目    的:键盘扫描,键盘中断,键值识别,键盘编码       *
*注    意:如果键盘插在实验板上排插孔,无须连线,若插在下 *
*         排插孔,需手工接线                            *
*-------《嵌入式应用技术基础教程》教学实例------------*/
/*[头文件]*/
#include "GP32C.H"
#include "KB.h"               //键盘中断头文件
#include "KeyBoard_define.h"
#define MCLK 2457600


char Play_Sound(unsigned char key);
void PWMInit(unsigned int Period);
void Key_handle(unsigned char key);
extern void lcdshow(unsigned char str[]);
extern unsigned char KB_Scan(void);

unsigned char LCD_buff_fresh=0,LCD_buff1=0;


const unsigned char Key_show[21][32]={
	"1 is pressed    f=523Hz         ",
	"2 is pressed    f=558Hz         ",
	"3 is pressed    f=660Hz         ",
	"4 is pressed    f=698Hz         ",
	"5 is pressed    f=784Hz         ",
	"6 is pressed    f=880Hz         ",
	"7 is pressed    f=988Hz         ",
	"L1 is pressed   f=262Hz         ",
	"L2 is pressed   f=294Hz         ",
	"L3 is pressed   f=330Hz         ",
	"L4 is pressed   f=349Hz         ",
	"L5 is pressed   f=392Hz         ",
	"L6 is pressed   f=440Hz         ",
	"L7 is pressed   f=494Hz         ",
	"H1 is pressed   f=1046Hz        ",
	"H2 is pressed   f=1175Hz        ",
	"H3 is pressed   f=1318Hz        ",
	"H4 is pressed   f=1397Hz        ",
	"H5 is pressed   f=1568Hz        ",
	"H6 is pressed   f=1760Hz        ",
	"H7 is pressed   f=1976Hz        "
};


/*[主程序]*/
void main()
{  
	 unsigned char key_value;
     asm("SEI");              //关总中断
     KB_Init();
	   //INTKBSCR&= ~(1<<IntBit); //开放键盘中断(IMASKk=1)
     //asm("CLI");              //开总中断
     //主循环
     while(1)
     {
     	key_value=KB_Scan();
     	Play_Sound(key_value);
     } 
}

char Play_Sound(unsigned char key)
{
    char backup_DDRD;
	if(key==0xff)
	{
		unsigned char LCD_buff[32]="No valid key is be press!       ";
		T1SC=0x38;  
		T1SC0=0b00100010;
	    T1SC|= 0b00100000;   //stop Timer
		LCD_buff_fresh++;	
		if(LCD_buff_fresh%255==0)
		{
			lcdshow((unsigned char *)LCD_buff);
		} 
		LCD_buff1=1;
		return 1;   //do something and return!!!
	}
	
	else
	{
    	switch(key)   //do something and return
		{
			case '1':Key_handle('1');break;
			case '2':Key_handle('2');break;
			case '3':Key_handle('3');break;
			case '4':Key_handle('4');break;
			case '5':Key_handle('5');break;
			case '6':Key_handle('6');break;
			case '7':Key_handle('7');break;
			case L1:Key_handle(L1);break;
			case L2:Key_handle(L2);break;
			case L3:Key_handle(L3);break;
			case L4:Key_handle(L4);break;
			case L5:Key_handle(L5);break;
			case L6:Key_handle(L6);break;
			case L7:Key_handle(L7);break;
			case H1:Key_handle(H1);break;
			case H2:Key_handle(H2);break;
			case H3:Key_handle(H3);break;
			case H4:Key_handle(H4);break;
			case H5:Key_handle(H5);break;
			case H6:Key_handle(H6);break;
			case H7:Key_handle(H7);break;
			default: ;break;
		}
		LCD_buff_fresh=1;
		return 1;
	}
}

void PWMInit(unsigned int Period)
{    
    unsigned int Temp=Period/2;
    //不允许溢出中断,不启动计数,分频因子=1,置位TSTOP,TRST
    T1SC = 0x30;        
    //[设置PWM周期]
    T1MODH = (Temp>>8);     
    T1MODL = Period;      
    //[初始化设置PWM脉宽为0]
    T1CH0H = Period/4;
    T1CH0L = Period/4;
    //设为PWM模式,不允许输出比较中断,输出低电平,不带缓冲
    T1SC0  = 0x1E;      
    //允许定时器1计数寄存器计数           
    T1SC  &= 0xDF;      
}    

void Key_handle(unsigned char key)
{
      if(LCD_buff1)
      {
      	switch(key)   //do something and return
		{
			case '1':{PWMInit(4699);lcdshow((unsigned char *)Key_show[1]);}break;
			case '2':{PWMInit(4404);lcdshow((unsigned char *)Key_show[2]);}break;
			case '3':{PWMInit(3723);lcdshow((unsigned char *)Key_show[3]);}break;
			case '4':{PWMInit(3520);lcdshow((unsigned char *)Key_show[4]);}break;
			case '5':{PWMInit(3134);lcdshow((unsigned char *)Key_show[5]);}break;
			case '6':{PWMInit(2792);lcdshow((unsigned char *)Key_show[6]);}break;
			case '7':{PWMInit(2487);lcdshow((unsigned char *)Key_show[7]);}break;
			case L1:{PWMInit(9380);lcdshow((unsigned char *)Key_show[8]);}break;
			case L2:{PWMInit(8359);lcdshow((unsigned char *)Key_show[9]);}break;
			case L3:{PWMInit(7447);lcdshow((unsigned char *)Key_show[10]);}break;
			case L4:{PWMInit(7041);lcdshow((unsigned char *)Key_show[11]);}break;
			case L5:{PWMInit(6269);lcdshow((unsigned char *)Key_show[12]);}break;
			case L6:{PWMInit(5585);lcdshow((unsigned char *)Key_show[13]);}break;
			case L7:{PWMInit(4974);lcdshow((unsigned char *)Key_show[14]);}break;
			case H1:{PWMInit(2349);lcdshow((unsigned char *)Key_show[15]);}break;
			case H2:{PWMInit(2091);lcdshow((unsigned char *)Key_show[16]);}break;
			case H3:{PWMInit(1864);lcdshow((unsigned char *)Key_show[17]);}break;
			case H4:{PWMInit(1756);lcdshow((unsigned char *)Key_show[18]);}break;
			case H5:{PWMInit(1567);lcdshow((unsigned char *)Key_show[19]);}break;
			case H6:{PWMInit(1396);lcdshow((unsigned char *)Key_show[20]);}break;
			case H7:{PWMInit(1243);lcdshow((unsigned char *)Key_show[21]);}break;
			default: ;break;
		}
      	LCD_buff1=0;
		}
}

⌨️ 快捷键说明

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