📄 key.c
字号:
/***************************************************************
****************************************************************
****名 称: key.c 键盘处理函数 *****
**** *****
****使用的资源: 使用的是外部中断0 *****
**** 行为P1.0-P1.3,列为P1.7-P1.4 *****
**** *****
****************************************************************
****************************************************************/
#include <at89x52.h>
#include <lcd.h>
#include <at24c02.h>
#include <key.h>
#include <delayms.h>
#include <gsm-at.h>
extern void test_code(uchar n_delay,uchar n_wait);/*测试函数*/
extern uchar Nindex[]; //存放发送到SIM卡中短信返回的index
uchar idata phonenum[15]; //存放要发送对象的号码
//key_state为录入号码判断位,其值为0时表示开始录入,
//为#时表示录入完毕,为*时表示不录入。
uchar key_state = '*';
//***************************************************************:
//*功 能:4*4矩阵键盘键值 键码映射
//***************************************************************
//按键的键值
uint8_t code getKeyboardCode[] = { 0x7e, 0xbe, 0xde, 0xee, //7 8 9 A
0x7d, 0xbd, 0xdd, 0xed, //4 5 6 B
0x7b, 0xbb, 0xdb, 0xeb, //1 2 3 C
0x77, 0xb7, 0xd7, 0xe7 };//c 0 s D
//按键映射的键码
uchar code theActionCode[] = { '7', '8', '9', 'A', //A作为设定号码的键值
'4', '5', '6', 'B', //B作为初始化GSM的键值
'1', '2', '3', 'C', //C作为查看目标号码的键值
'c', '0', 's', 'D'}; //c作为取消;s作为确定;D写信息到SIM卡
//***************************************************************
//*名 称:按键扫描
//*功 能:
//*返 回 值:成功按键则返回该按键映射的键码,失败返回0xff
//*备 注:
//***************************************************************
uint8_t KeyboardScan()
{
uint8_t sender;
uint8_t counter;
delayms_10ms();
delayms_10ms();
sender = (0xf0 & keyboardCode);//(0x0f & keyboardCode);
if(sender ==0xf0)//0x0f)
goto invall;
keyboardCode = 0x0f;//0xf0;
_nop_();
sender |= (0x0f & keyboardCode);//(0xf0 & keyboardCode);
keyboardCode = 0xf0;//0x0f;
for(counter=0; counter<16; counter++)
{
if(sender == getKeyboardCode[counter])
return theActionCode[counter];
}
invall:
return 0xff;
}
//***************************************************************
//*名 称:矩阵键盘检测
//*功 能:把按键对应的键码读取到key_value中。
//*返 回 值:无返回值
//*备 注:使用外部中断0
//***************************************************************
void ex0_interrupt() interrupt 0
{
uchar key_value;
EX0 = 0;
key_value = KeyboardScan();
del_key(key_value);
EX0 = 1;
return;
}
//***************************************************************
//*名 称:外部中断0初始化 键盘
//*功 能:初始化外部中断,及相关的全局变量的初始化
//*备 注:
//***************************************************************
void init_interrupt()
{
//TCON = 0x01;
IT0 = 1;
EA = 1;
EX0 = 1;
keyboardCode = 0xf0;//0x0f;
}
//***************************************************************
//*名 称:键盘处理
//*功 能:根据各个按键的功能执行相应的操作
//*形 参:
//*返 回 值:
//*备 注:
//***************************************************************
void del_key(uchar key_value)
{
uchar i,n_addr=0x0;
// LCD_clear(); //LCD清屏函数
if(key_value>=48 && key_value<=57) //'0'=<key_value<='9'
{
if(key_state>=0 && key_state<13)
{
test_code(1,0);//响铃100ms提示
LCD_write_char(key_value);
phonenum[key_state] = '\0';
phonenum[key_state] = key_value;//将键码存入phonenum
key_state++;
}
}
else if(key_value=='A') //A 设定号码
{
LCD_clear(); //LCD清屏函数
LCD_write_String(0,0,"Set Phone no: ");
for(i=0;i<15;i++) //清空数组
phonenum[i]='\0';
key_state = 0; //开始录入号码标志位
}
else if(key_value=='B') //B 初始化GSM
{
LCD_clear(); //LCD清屏函数
LCD_write_String(0,1,"Reset GSM!");
while(!connect_gsm()); //发送联机指令
LCD_write_String(0,2,"connect_gsm");
init_gsm(); //禁止回显,设置为pdu模式
LCD_write_String(0,3,"init_gsm");
while(!connect_gsmnet()); //获取网络注册情况
LCD_write_String(0,4,"connect_gsmnet");
init_sim(); //不接受广播短信
LCD_clear(); //LCD清屏函数
LCD_write_String(0,1,"init_sim");
LCD_write_String(0,3,"Running!");
delayms_1000ms();
LCD_clear(); //LCD清屏函数
}
else if(key_value=='C') //C 查看目标号码
{
LCD_clear(); //LCD清屏函数
LCD_write_String(0,0,"Destination phone:");
n_addr=0x0;
for(i=0;i<=13;i++)
{
I2C_On(I2C_SrRECV, 0xA0, n_addr++, &phonenum[i], 1);//读n_addr地址内容到phonenum
}
LCD_write_String(0,2,phonenum);
/*
//读取短信的index号码到Nindex
for(i=0,n_addr=0x0;i<4;i++)
I2C_On(I2C_SrRECV, 0x18, n_addr++, &Nindex[i], 1);//读0x18+n_addr地址到Nindex
Nindex[4] = '\0';
LCD_write_String(0,4,"Nindex:");
for(i=0;i<4;i++)
LCD_write_char(Nindex[i]+48);
*/
delayms_1000ms();delayms_1000ms();delayms_1000ms();
delayms_1000ms();delayms_1000ms();
LCD_clear(); //LCD清屏函数
}
else if(key_value=='D') //D 删除SIM所有短信,并将要发送的信息写入SIM卡
{
LCD_clear(); //LCD清屏函数
LCD_write_String(0,1,"Delete all msg!");
while( !init_Send_sms_sim(phonenum) );//初始化将所有要发送的短信写到SIM卡
LCD_write_String(0,2,"Write and Delete OK!");
delayms_1000ms();
LCD_clear(); //LCD清屏函数
return;
}
else if(key_value=='s') //s 确定保存
{
if(key_state >= 12)
{
LCD_clear(); //LCD清屏函数
LCD_write_String(0,0,phonenum);
LCD_write_String(2,2,"Saving...");
n_addr=0x0;
for(i=0;i<13;i++)
{
I2C_On(I2C_SEND, 0xA0, n_addr++, &phonenum[i], 1);//写phonenum内容到n_addr地址
delayms_10ms();
}
LCD_write_String(2,11,"...");
n_addr=0x0;
for(i=0;i<13;i++)
I2C_On(I2C_SrRECV, 0xA0, n_addr++, &phonenum[i], 1);//读n_addr地址内容到phonenum
LCD_write_String(0,3,phonenum);//
LCD_write_String(4,4,"OK!");
key_state = '#'; //完成输入号码标志
}
else
{
LCD_write_String(0,3,"Length is wrong!");
key_state = 0; //重新输入号码标志
LCD_write_String(0,5,"input again");
}
delayms_1000ms();
delayms_1000ms();
LCD_clear(); //LCD清屏函数
}
else if(key_value=='c') //c 取消返回
{
if(key_state<=12) //在录入号码状态为退格键作用
key_state--;
else
{
LCD_write_String(0,3,"Cancel!");
key_state = '*'; //停止录入号码标志
return;
}
}
}
//***************************************************************
//*名 称:键盘处理跳出
//*功 能:进入录入号码后,等到录入号码成功或者取消录入号码,则
//* :继续之后的操作。否则继续等待
//***************************************************************
void key_out()
{
uchar key_value;
// if(key_state =='*' || key_state == '#')
// return;
while(key_state >=0 && key_state <= 12)
{
if(key_state == 12)
{
do
{
key_value = KeyboardScan();
}
while(key_value=='s');
}
if(key_state =='*' || key_state == '#')
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -