文档库 最新最全的文档下载
当前位置:文档库 › 4乘4键盘液晶显示程序

4乘4键盘液晶显示程序

#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
byte mm;
void key_int(void)
{

PTGPE=0b00010000; //允许PTG4内部输入上拉电阻
PTDPE=0b10001100; //PTD7,3,2内部输入上拉电阻
PTGDD=0b11101111; //11101111,PTG4为输入
PTDDD=0b01110011; //01110011,PTD7,3,2为输入
KBI1PE=0b11110000; //KBI4-7为KBI,0-3为I/O口
KBI1SC=0b00000110; //清标志,允许硬件中断
}

byte KBScan1(void)
{
byte line,i,tmp,tmp1,tmp2;
line=0b11111110; //使第一根行线为0(低电平)
for (i = 1; i <= 4; i++) //最多将扫描4根行线
{
//当前扫描的一行,输出低电平
PTGD = line; //输出开始扫描

asm("NOP");
asm("NOP");
//读取键盘口数据寄存器
tmp1 = PTDD; //输入扫描结果
tmp2 = PTGD;
//整合扫描结果,即键盘输入引脚的4位
tmp = (tmp1 & 0x80);
tmp1 &= 0x0C;
tmp1 = (tmp1<<3);
tmp |= tmp1;
tmp |= (tmp2 & 0x1f);
//通过观察4根列线中是否出现低电平来判断当前行有无按键
if ((tmp & 0xF0) != 0xF0)//当前行有键按下
{
break; //退出循环不再扫描
}
else //当前行无按键,准备扫描下一行
line = (line << 1) | 0x01;
}
if (i == 5) //无按键,以后将返回0xFF
tmp = 0xFF;
return (tmp);
}

//键盘定义表
const byte KBtable[] =

{
0xEE,15,0xDE,11,0xBE,10,0x7E,0,
0xED,14,0xDD,3,0xBD,2,0x7D,1,
0xEB,13,0xDB,6,0xBB,5,0x7B,4,
0xE7,12,0xD7,9,0xB7,8,0x77,7,
0x00
};
//显示码表 (共阴极)
const byte Dtable[16] =
// 0 1 2 3 4 5 6 7 8 9
{0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5e,0x79,0X71};


//-------------------------------------------------------------------------*
//函数名: KBDef *
//功 能: 键值转为定义值 *
//参 数: value:键值 *
//返 回: 键定义值 *
//说 明: 无 *
//-------------------------------------------------------------------------*
byte KBDef(byte valve)
{
byte KeyPress; //键定义值
byte i;
i = 0;
KeyPress = 0xff;
while (KBtable[i] != 0x00) //在键盘定义表中搜索欲转换的键值,直至表尾
{
if(KBtable[i] == valve) //在表中找到相应的键值
{
KeyPress = KBtable[i+1];//取出对应的键定义值
b

reak;
}
i += 2; //指向下一个键值,继续判断
}
return KeyPress;
}

///////////////////////////////////////////

void main(void)
{
while(1){

EnableInterrupts;
SOPT = 0b01100000; //$70 System Options Register(write once)
key_int();
PTBDD=0XFF;
PTBD=0X00;

/* include your code here */

for(;;) {

//PTBD=Dtable[mm];
//__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
}


interrupt VectorNumber_Vkeyboard1 void isrKeyBoard(void) {

byte value,key;
KBI1SC_KBACK=1;
DisableInterrupts;

PTDD=0X01;
value=KBScan1();
key=KBDef(value);
PTBD= Dtable[key];
key_int();

EnableInterrupts;


}



相关文档
相关文档 最新文档