?? key.c
字號:
#include <string.h>
#include <stdarg.h>
#include "key.h"
#include "2410addr.h"
#include "GUI.h"
#define TRUE 1
#define FALSE 0
extern int keyvalue;
extern char phone_num[30];
extern int phone_index;
extern int a[4];
static volatile int flag=0;
extern int gTimeIndex;
extern char gTimestr[20];
void __irq KB_LISR(void);
void keyinit(void);
int KeyScan(void);
void LedShow( int key,int i);
void KB_Enable(int flag);
void KBD_Entry()
{
int i;
keyinit();
KB_Enable(TRUE); //中斷使能函數(shù)
}
void swap(int b[])
{
int temp,temp1,temp2;
temp=b[0];
temp1=b[1];
temp2=b[2];
b[1]=temp;
b[2]=temp1;
b[3]=temp2;
}
void drawtimestr(char* ptimestr)
{
char tempTimeStr[6];
char timeStr[20];
char weekStr[7];
int i;
strcpy(tempTimeStr,ptimestr);
for(i=gTimeIndex;i<5;i++)
tempTimeStr[i] = '0';
sprintf(timeStr,"%c%c:%c%c",tempTimeStr[0],tempTimeStr[1],tempTimeStr[2],tempTimeStr[3]);
fillrectangle(118,120,160,138,rgb(0,0,255));
drawascii168(120,138,timeStr,rgb(255,255,0));
if(gTimeIndex>=2) i = gTimeIndex+1;
else i = gTimeIndex ;
if(i > 4) i=4;
if(gTimeIndex <4 ) line(120+i*8,122,120+(i+1)*8,122,rgb(255,0,0));
if(tempTimeStr[4] == '1') strcpy(weekStr,"星期一");
else if(tempTimeStr[4] == '2') strcpy(weekStr,"星期二");
else if(tempTimeStr[4] == '3') strcpy(weekStr,"星期三");
else if(tempTimeStr[4] == '4') strcpy(weekStr,"星期四");
else if(tempTimeStr[4] == '5') strcpy(weekStr,"星期五");
else if(tempTimeStr[4] == '6') strcpy(weekStr,"星期六");
else strcpy(weekStr,"星期日");
fillrectangle(178,120,230,140,rgb(0,0,255));
drawtext(180,138,weekStr,1,0,rgb(255,255,0));
if(gTimeIndex == 4) line(180,120,230,120,rgb(255,0,0));
}
void __irq KB_LISR(void)
{
int value,i,j;
value=KeyScan(); //掃描鍵盤
for(i=0;i<3000;i++);
if(value>9&&value <15) //忽略亂碼
{
rGPGCON = rGPGCON&~(0x300000)|(0x200000); //設置GPG10=EINT18
rGPECON=rGPECON&~(0X3FC00)|(0x15400); //GPE[5:8]=OUTPUT
rGPEUP=0x3fe0; //關閉上拉電阻
rGPEDAT=rGPEDAT&0xfe1f; //GPE[5:8]初始為低電平
rEINTPEND |=0x40000; //中斷源請求關閉
rSRCPND=0x20; //中斷源請求關閉
rINTPND=0X20;
return;
}
swap(a);
a[0]=value; //led顯示鍵值 //
keyvalue = value;
if(!(win_ID == CALL_WIN || win_ID == MESSAGE_WIN )) /*LedShow(keyvalue,i)*/;
//如果目前界面處于GPRS,則應執(zhí)行if后的語句
if(win_ID == CALL_WIN || win_ID == MESSAGE_WIN )
{
for(i=0;i<3000;i++);
//關閉顯示
for(i=0;i<4;i++) LedShow(15,i);
//添加電話號碼
if(keyvalue>=0&& keyvalue<=9)
{
if(phone_index<15)
phone_num [phone_index++] = '0'+ keyvalue;
phone_num [phone_index] ='\0'; //添加字符串結尾符
drawascii168(200,148,phone_num,rgb(255,255,0));
}
if(keyvalue == 15) //刪除電話號碼
{
if(phone_index>0)
{
drawascii168(200,148,phone_num,rgb(0,0,255));
phone_num [--phone_index] ='\0';
drawascii168(200,148,phone_num,rgb(255,255,0));
}
}
}
//如果目前界面處于設置時間窗口,則應執(zhí)行if后的語句
if(win_ID == TIME_CONFIG_WIN )
{
for(i=0;i<3000;i++);
//關閉顯示
for(i=0;i<4;i++) LedShow(15,i);
//添加電話號碼
if(keyvalue>=0&& keyvalue<=9)
{
if(gTimeIndex<5)
gTimestr [gTimeIndex++] = '0'+ keyvalue;
gTimestr [gTimeIndex] ='\0'; //添加字符串結尾符
// drawascii168(200,148,gTimestr,rgb(255,255,0));
}
if(keyvalue == 15) //刪除電話號碼
{
if(gTimeIndex>0)
{
// drawascii168(200,148,gTimestr,rgb(0,0,255));
gTimestr [--gTimeIndex] ='\0';
// drawascii168(200,148,gTimestr,rgb(255,255,0));
}
}
drawtimestr(gTimestr);
}
rGPGCON = rGPGCON&~(0x300000)|(0x200000); //設置GPG10=EINT18
rGPECON=rGPECON&~(0X3FC00)|(0x15400); //GPE[5:8]=OUTPUT
rGPEUP=0x3fe0; //關閉上拉電阻
rGPEDAT=rGPEDAT&0xfe1f; //GPE[5:8]初始為低電平
rEINTPEND |=0x40000; //中斷源請求關閉
rSRCPND=0x20; //中斷源請求關閉
rINTPND=0X20;
}
void keyinit(void)
{
rGPECON=0xfffd57ff; //GPE[5:8]=OUTPUT
rGPEUP=0x1e0; //關閉上拉電阻
rGPEDAT=rGPEDAT&0xfe1f; //GPE[5:8]初始為低電平
rGPGCON=rGPGCON&~(0x300000)|(0x200000); //設置GPG10=EINT18
rGPGUP=rGPGUP|0x400; //關閉GPG10上拉電阻
}
int KeyScan(void)
{
short a,b,c,d,e,i,j;
int temp=0;
rGPEUP=0x1e0;
rGPGCON=rGPGCON&~(0x300000)|(0x0); //設置GPG10為輸入
for(j=0;j<10;j++); //去抖動
while((rGPGDAT&(0x400))==0x400)
{
;;
}
for(j=0;j<5000;j++);
// rGPECON=0xfffc03ff;
//第一行檢測
rGPECON=0xfffc07ff; //設置GPE5=OUTPUT,GPE[6:8]=INPUT
//rGPEDAT=rGPEDAT&~(0x1e0)|0x20;
rGPEDAT=rGPEDAT&0xffdf; //設置GPE5低電平輸出,GPE[6:8]輸入
for(i=0;i<=50;i++); //延時去抖動
a=rGPEDAT&(0x100); //GPEDAT的GPE8位
b=rGPEDAT&(0x80); //GPEDAT的GPE7位
c=rGPEDAT&(0x40); //GPEDAT的GPE6位
d=rGPEDAT&(0x20); //GPEDAT的GPE5位
e=rGPGDAT&(0x400); //GPGDAT的GPG10位
if(e==0x0)
{
if(((a>>6)+(b>>6)+(c>>6))==0x7)
temp=1;
else if(((a>>6)+(b>>6)+(c>>6))==0x6)
temp=2;
else if(((a>>6)+(b>>6)+(c>>6))==0x5)
temp=3;
else if(((a>>6)+(b>>6)+(c>>6))==0x3)
temp=15;
}
else
{
//第二行檢測
rGPECON=0xfffc13ff; //設置GPE6=OUTPUT,GPE[5\7\8]=INPUT
rGPEDAT=rGPEDAT&0xffbf; //使GPE6輸出低電平
for(i=0;i<=50;i++); //延時去抖動
a=rGPEDAT&(0x100); //GPEDAT的GPE8位
b=rGPEDAT&(0x80); //GPEDAT的GPE7位
c=rGPEDAT&(0x40); //GPEDAT的GPE6位
d=rGPEDAT&(0x20); //GPEDAT的GPE5位
e=rGPGDAT&(0x400); //GPGDAT的GPG10位
if(e==0x0)
{
if(((a>>6)+(b>>6)+(d>>5))==0x6)
temp=4;
else if(((a>>6)+(b>>6)+(d>>5))==0x7)
temp=5;
else if(((a>>6)+(b>>6)+(d>>5))==0x5)
temp=6;
else if(((a>>6)+(b>>6)+(d>>5))==0x3)
temp=14;
}
else
{
//第三行檢測
rGPECON=0xfffc43ff; //設置GPE7=OUTPUT,GPE[5\6\8]=INPUT
rGPEDAT=rGPEDAT&0xff7f; //使GPE7輸出低電平
for(i=0;i<=50;i++); //延時去抖動
a=rGPEDAT&(0x100); //GPEDAT的GPE8位
b=rGPEDAT&(0x80); //GPEDAT的GPE7位
c=rGPEDAT&(0x40); //GPEDAT的GPE6位
d=rGPEDAT&(0x20); //GPEDAT的GPE5位
e=rGPGDAT&(0x400);
if(e==0x0)
{
if(((a>>6)+(c>>5)+(d>>5))==0x6)
temp=7;
else if(((a>>6)+(c>>5)+(d>>5))==0x5)
temp=8;
else if(((a>>6)+(c>>5)+(d>>5))==0x7)
temp=9;
else if(((a>>6)+(c>>5)+(d>>5))==0x3)
temp=13;
}
else
{
//第四行檢測
rGPECON=0xfffd03ff; //設置GPE8=OUTPUT,GPE[5:7]=INPUT
rGPEDAT=rGPEDAT&0xfeff; //使GPE8輸出低電平
// for(i=0;i<=50;i++); //延時去抖動
a=rGPEDAT&(0x100); //GPEDAT的GPE8位
b=rGPEDAT&(0x80); //GPEDAT的GPE7位
c=rGPEDAT&(0x40); //GPEDAT的GPE6位
d=rGPEDAT&(0x20); //GPEDAT的GPE5位
e=rGPGDAT&(0x400);
if(((b>>5)+(c>>5)+(d>>5))==0x6)
temp=10;
else if(((b>>5)+(c>>5)+(d>>5))==0x5)
temp=0;
else if(((b>>5)+(c>>5)+(d>>5))==0x3)
temp=11;
else if(((b>>5)+(c>>5)+(d>>5))==0x7)
temp=12;
}
}
}
/* rEINTPEND=0x400; //中斷源請求關閉
rSRCPND=0x20; //中斷源請求關閉
rINTPND=0X20;
rGPGCON = rGPGCON&~(0x30)|(0x20); //設置GPG2=EINT10
rGPECON=0xfffd57ff; //GPE[5:8]=OUTPUT
rGPEUP=0x1e0; //關閉上拉電阻
rGPEDAT=0x1e0; //GPE[5:8]初始為高電平
*/
for(j=0;j<10;j++);
while((rGPGDAT&(0x400))!=0x400)
{
;;
}
for(j=0;j<1000;j++);
while((rGPGDAT&(0x400))!=0x400)
{
;;
}
return temp;
}
void LedShow( int key,int i)
{
int j;
int table[16]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
//unsigned short dis_buf[3]={0x3,0x2,0x1,0x0}
rGPHCON=rGPHCON&~(0x30000)|0x10000; //設置點,不亮
rGPHUP=rGPHUP|0x100;
rGPHDAT=rGPHDAT&~(0x100)|0x0;
rGPECON=rGPECON&~(0xffc0000)|(0x5540000); //設置GPE[9:13]=OUTPUT
rGPEUP|=0x3e00;
rGPGCON=rGPGCON&~(0x30)|(0x10); //設置GPG2為OUTPUT
rGPGUP|=0x4;
rGPEDAT=rGPEDAT&~(0x3C00)|(table[15]<<10);
switch(i)
{
case 0:
rGPGDAT=rGPGDAT|(1<<2); //設置數(shù)碼管的位選GPG2=1,A
rGPEDAT=rGPEDAT|(1<<9); //設置數(shù)碼管的位選GPE9=1,B
break;
case 1:
rGPGDAT=rGPGDAT&~(1<<2); //設置數(shù)碼管的位選GPG2=0,A
rGPEDAT=rGPEDAT|(1<<9); //設置數(shù)碼管的位選GPE9=1,B
break;
case 2:
rGPGDAT=rGPGDAT|(1<<2); //設置數(shù)碼管的位選GPG2=1,A
rGPEDAT=rGPEDAT&~(1<<9); //設置數(shù)碼管的位選GPE9=0,B
break;
case 3:
rGPGDAT=rGPGDAT&~(1<<2); //設置數(shù)碼管的位選GPG2=0,A
rGPEDAT=rGPEDAT&~(1<<9); //設置數(shù)碼管的位選GPE9=0,B
break;
}
// if((key>0x0)&&(key<=0xf))
rGPEDAT=rGPEDAT&~(0x3C00)|(table[15]<<10);
for(j=0;j<50;j++);
rGPEDAT=rGPEDAT&~(0x3C00)|(table[key]<<10);
for(j=0;j<=1000;j++);
// rGPGCON=rGPGCON&~(0x30); //設置GPG2為INPUT
// rGPGUP|=0x4;
// rGPECON=rGPECON&~(0xffc0000)|(0x5540000); //設置GPE[9]=INPUT
// rGPEUP|=0x3e00;
}
void KB_Enable(int flag)
{
int temp;
if(flag == TRUE)
{
temp = rGPGCON;
rGPGCON = temp&~(0x300000)|(0x200000); //設置GPG10=EINT18
temp = rGPGUP;
rGPGUP = temp|0x400; //關閉GPG10上拉電阻
rSRCPND=0x20; //中斷源請求
rINTMSK&= ~(BIT_EINT8_23); //中斷源使能
temp=rEXTINT2;
rEXTINT2&=0xfffff8ff; //使EINT18為低電平觸發(fā)
rEINTPEND=0X40000; //外部中斷源請求
rEINTMASK=0xfbfff8; //使能外部中斷EINT18
}
else
{
rINTMSK&= BIT_EINT8_23;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -