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

📄 key.c

📁 基于AT89S52的GSM安防系统
💻 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 + -