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

📄 keyboard.h

📁 这个文档程序主要应用了单片机的串行通讯部分
💻 H
📖 第 1 页 / 共 2 页
字号:
/********************************工程文件说明*******************************/
/*FileName:keyboard.h													   */
/*Author:烛光 															   */
/*Version:v1.0															   */
/*Data:2008年07月11日													   */
/*Description:工程键盘程序文件,包含键盘机制。							   */
/*Function List:														   */
/*    1.key_manager  键盘程序,键盘机制									   */
/*	  2.key_get_pin  键盘I/O脚电位查询									   */
/*	  3.key_get_code  得到按键代码										   */
/*	  4.……															   */
/*History:																   */
/*	  3.烛光  2008.09.13  v1.0  初步完成设计							   */
/*	  2.烛光  2008.09.13  v1.0  初步完成设计							   */
/*	  1.烛光  2008.07.11  v0.0  开始设计								   */
/*Copyright (c) 2008 烛光 All Rights Reserved							   */
/***************************************************************************/

#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__

/***********************************硬件接口说明****************************/
/*
1、key_one--P2^6
2、key_two--P2^7
*/
/************************************符号定义*******************************/
#define keyport P2

sbit key_one=P2^6;
sbit key_two=P2^7;

/************************************变量定义*******************************/
bit keyboardf=1;

uchar keycode=0;//初始值0表示无按键

extern bit tiaoshi;
extern bit scrfreshf;
extern bit newnewsf;
extern bit newnewsf0;
extern bit newnewsf1;
extern bit newnewsf2;
extern bit oldnewsf;
extern bit oldnewsf0;
extern bit oldnewsf1;
extern bit oldnewsf2;
extern bit statefinish;
extern bit mlimitf;
extern bit newsoverf;
extern bit gprscarryf;
extern bit gprslostf;
extern bit contraf;

extern uchar state;
extern uchar laststate;
extern uchar second;
extern uchar minute;
extern uchar hour;
extern uchar minutecopy;
extern uchar gprssendtime;
extern uchar gprscode;
extern uchar gprsturner;
extern uchar gprsharth;
extern uchar idata zclsend[];
extern uchar idata gprssend[];
extern uchar idata gprsres[];

/************************************函数声明*******************************/
extern void storenews(void);
extern void loadnews(uchar m);
extern void clrscr(uchar scr);
extern void serl_snd_string(uchar *str);
extern uchar eep_read_byte(uchar eepaddrh,uchar eepaddrl);
extern void lcd_prt_letter(uchar position,uchar lnumber,uchar contra);
extern void lcd_prt_char(uchar position,uchar cnumber);

/***************************************************************************/
///////////////////////////////////键盘服务程序//////////////////////////////
/***************************************************************************/
/**********************************查询针脚状态*****************************/
void key_get_pin(uchar data *ptr1,uchar data *ptr2,uchar data *ptr3)
{
	key_two=0;
	key_one=1;	
	_nop_();
	*ptr1=(0xc0&keyport);
	key_two=1;
	key_one=0;	
	_nop_();
	*ptr2=(0xc0&keyport);
	key_two=1;
	key_one=1;	
	_nop_();
	*ptr3=(0xc0&keyport);
}
/**********************************得到按键代码*****************************/
void key_get_code(void)//未完成,,
{
	uchar data keycode1,keycode2,keycode3,keycode4,keycode5,keycode6;
	key_get_pin(&keycode1,&keycode2,&keycode3);
	if(keycode1==0x40&&keycode2==0x80&&keycode3==0xc0)keycode=0x00;//无按键
	else//有按键,,消抖后采集第二次
	{
		delay_nms(30);//消除抖动,,时间长了一点,,但更稳定
		key_get_pin(&keycode4,&keycode5,&keycode6);//第二次采集
		if(keycode1==keycode4&&keycode2==keycode5&&keycode3==keycode6)//两次采集结果一样
		{
			if     (keycode1==0x00&&keycode2==0x00&&keycode3==0x00)keycode=0x01;
			else if(keycode1==0x40&&keycode2==0x00&&keycode3==0x40)keycode=0x02;
			else if(keycode1==0x00&&keycode2==0x00&&keycode3==0xc0)keycode=0x03;
			else if(keycode1==0x00&&keycode2==0x80&&keycode3==0x80)keycode=0x04;
			else keycode=0x00;
			//等待按键释放
			do key_get_pin(&keycode1,&keycode2,&keycode3);
			while(keycode1!=0x40||keycode2!=0x80||keycode3!=0xc0);
		}
	}
}
/**********************************修改GPRS参数*****************************/
void gprsresadd(uchar idata *ptr1,uchar idata *ptr2)
{
	uint data num;
	num=*ptr1*256+*ptr2;
	switch(gprsturner)
	{
		//
		case 56:;
		case 68:if(num<1800)num+=200;else num-=1800;break;
		case 33:;		
		case 57:;
		case 69:if(num%200<180)num+=20;else num-=180;break;
		case 34:;		
		case 58:;
		case 70:if(num%20<18)num+=2;else num-=18;break;
		case 35:;		
		case 59:;
		case 71:if(num%2<1)num+=1;else num-=1;break;
		//
		case 106:if(num<36864)num+=4096;else num-=36864;break;
		case 107:if(num%4096<2304)num+=256;else num-=2304;break;
		case 108:if(num%256<144)num+=16;else num-=144;break;        
		case 109:if(num%16<9)num+=1;else num-=9;break;
		//
		case 156:;
		case 168:if(num<9000)num+=1000;else num-=9000;break;		
		case 157:;
		case 169:if(num%1000<900)num+=100;else num-=900;break;		
		case 158:;
		case 170:if(num%100<90)num+=10;else num-=90;break;		
		case 159:;
		case 171:if(num%10<9)num+=1;else num-=9;break;
		//
		case 130:;
		case 134:;
		case 138:;
		case 142:if(num>=200)num-=200;else if(num<=155)num+=100;else num=255;break;
		case 131:;
		case 135:;
		case 139:;
		case 143:if((num<200&&num%100<90)||(num>=200&&num%100<=45))num+=10;else if(num>=200&&num%100>45&&num!=255)num=255;else if(num<200&&num%100>=90)num-=90;else num-=50;break;
		case 132:;
		case 136:;
		case 140:;
		case 144:if((num<250&&num%10<9)||(num>=250&&num%10<5))num+=1;else if(num<250&&num%10>=9)num-=9;else num-=5;break;
		default:tiaoshi=1;break;
	}
	*ptr1=num/256;
	*ptr2=num%256;
}
/**********************************修改CDMA参数*****************************/
void cdmaresadd(uchar idata *ptr1,uchar idata *ptr2)
{
	uint data num;
	num=*ptr1*256+*ptr2;
	switch(gprsturner)
	{
		//
		case 6:if(num<36864)num+=4096;else num-=36864;break;
		case 7:if(num%4096<2304)num+=256;else num-=2304;break;
		case 8:if(num%256<144)num+=16;else num-=144;break;        
		case 9:if(num%16<9)num+=1;else num-=9;break;
		//
		case 30:;
		case 34:;
		case 38:;
		case 42:if(num>=200)num-=200;else if(num<=155)num+=100;else num=255;break;
		case 31:;
		case 35:;
		case 39:;
		case 43:if((num<200&&num%100<90)||(num>=200&&num%100<=45))num+=10;else if(num>=200&&num%100>45&&num!=255)num=255;else if(num<200&&num%100>=90)num-=90;else num-=50;break;
		case 32:;
		case 36:;
		case 40:;
		case 44:if((num<250&&num%10<9)||(num>=250&&num%10<5))num+=1;else if(num<250&&num%10>=9)num-=9;else num-=5;break;
		//
		//
		case 56:;
		case 68:if(num<9000)num+=1000;else num-=9000;break;		
		case 57:;
		case 69:if(num%1000<900)num+=100;else num-=900;break;		
		case 58:;
		case 70:if(num%100<90)num+=10;else num-=90;break;		
		case 59:;
		case 71:if(num%10<9)num+=1;else num-=9;break;
		//
		//
		case 133:if(num%200<180)num+=20;else num-=180;break;
		case 134:if(num%20<18)num+=2;else num-=18;break;
		case 135:if(num%2<1)num+=1;else num-=1;break;		
		default:tiaoshi=1;break; 
	}
	*ptr1=num/256;
	*ptr2=num%256;
}
/**********************************形成GPRS命令*****************************/
void gprsload(void)
{
	uchar idata *ptr;//参数起始地址
	uchar length;//参数长度
	uchar fg;//指令是否包含长度信息
	uchar i,j,x=0x00;

	if     (gprsturner>=8&&gprsturner<=18)
	{
		gprssend[5]=0x3b;//写命令码
		ptr=&gprsres[23];//设置源起始地址
		length=11;//设置参数长度
		fg=0;//设置指令是否包含长度信息
	 }
	else if(gprsturner>=32&&gprsturner<=35)
	{
		gprssend[5]=0x33;//写命令码
		ptr=&gprsres[14];//设置源起始地址
		length=1;//设置参数长度
		fg=0;//设置指令是否包含长度信息
	 }
	else if(gprsturner>=42&&gprsturner<=46)
	{
		gprssend[5]=0x35;//写命令码
		ptr=&gprsres[43];//设置源起始地址
		length=gprsres[42];//设置参数长度
		fg=1;//设置指令是否包含长度信息
	 }
	else if(gprsturner>=56&&gprsturner<=59)
	{
		gprssend[5]=0x40;//写命令码
		ptr=&gprsres[34];//设置源起始地址
		length=2;//设置参数长度
		fg=0;//设置指令是否包含长度信息
	 }
	else if(gprsturner>=68&&gprsturner<=71)
	{
		gprssend[5]=0x41;//写命令码
		ptr=&gprsres[36];//设置源起始地址
		length=2;//设置参数长度
		fg=0;//设置指令是否包含长度信息
	 }
	else if(gprsturner>=106&&gprsturner<=171)
	{
		gprssend[5]=0x31;//写命令码
		ptr=&gprsres[0];//设置源起始地址
		length=10;//设置参数长度
		fg=0;//设置指令是否包含长度信息
	 }

	 else tiaoshi=1;
		  
	if(fg)gprssend[6]=length;//写参数长度
	for(i=0;i<length;i++,ptr++)//写参数
	{
		if((gprsturner>=106&&gprsturner<=171)&&i>5)gprssend[i+fg+6]=*(ptr+4);
		else gprssend[i+fg+6]=*ptr;
	}
	for(j=0;j<i+fg+6;j++)x^=gprssend[j];//计算校验码
	gprssend[i+fg+6]=x;
	if(fg){gprssend[i+fg+7]=0x00;i++;}//不知道为什么,,非要多一个0x00,,难过
	gprssend[i+fg+7]=0xee;//设置结束符
	gprssend[i+fg+8]=0x11;
	gprssend[i+fg+9]=0xee;
}
/**********************************形成CDMA命令*****************************/
void cdmaload(void)
{
	uchar idata *ptr;//参数起始地址
	//uchar length;//参数长度
	uchar i,j,x=0x00;
	
	if(gprsturner>=6&&gprsturner<=71)
	{
		gprssend[5]=0x31;//写命令码
		ptr=&gprsres[0];//设置源起始地址
		//length=10;//设置参数长度
		for(i=0;i<10;i++,ptr++)//写参数
		{
			gprssend[i+6]=*ptr;
		}
		for(j=0;j<i+6;j++)x^=gprssend[j];//计算校验码
		gprssend[i+6]=x;	
		//不知道为什么,,多加两个0,,难过
		gprssend[i+7]=0x00;
		gprssend[i+8]=0x00;
		gprssend[i+9]=0xab;//设置结束符
		gprssend[i+10]=0xcd;
		gprssend[i+11]=0xef;		
	 }
	else if(gprsturner>=132&&gprsturner<=135)
	{
		gprssend[5]=0x33;//写命令码
		gprssend[6]=gprsres[14];//
		gprssend[7]=gprsres[15];//
		for(j=0;j<8;j++)x^=gprssend[j];//计算校验码
		gprssend[8]=x;
		gprssend[9]=0xab;//设置结束符
		gprssend[10]=0xcd;
		gprssend[11]=0xef;
	 }
	 else tiaoshi=1;
		  
	
}
/***************************************************************************/
/////////////////////////////////////键盘程序////////////////////////////////
/***************************************************************************/
/************************************键盘机制*******************************/
void key_manager(void)
{
	//uchar i;
	key_get_code();
	//if(keycode){lcd_prt_letter(0,keycode,1);keycode=0;}
	if(keycode)
	{
		minutecopy=minute;//同步时间标志
/*1111111111111111111111111111111111111111111111111111111111111111111111111*/
		if(keycode==0x01)//I.按键1
		{
			switch(state)
			{
				case 0x00:
					if(oldnewsf0||oldnewsf1||oldnewsf2)
					{	

⌨️ 快捷键说明

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