📄 keyboard.h
字号:
/********************************工程文件说明*******************************/
/*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 + -