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