#include <reg52.h> //主函数
#define uint unsigned int //宏定义
#define uchar unsigned char
//#define data P0 //数据口
//sbit LCD_RS =P2^7; //并行数据命令选择控制
//sbit LCD_RW =P2^6; //并行读写控制
//sbit LCD_EN =P2^5; //并行使能信号
//sbit LCD_PSB=P2^4; //并行串行选择
int keyscan();
uint key_keys; //定义按键值
void delayms(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--);
for(j=110;j>0;j--);
}
/**********主函数**********/
void main()
{
while(1)
{
key_keys=keyscan();
}
}
/******按键控制函数******/
int keyscan()
{
uchar temp;
static keys; //keys定义成为一个静态全局变量
P1=0xfe; //(写)1111 1110将第一行线置低电平,其余行线全为高电平
temp=P1; //(读)将P3口当前的状态赋给临时变量temp
temp=temp&0xf0; //判断temp的高四位是否有0
if(temp!=0xf0) //说明有第一行的按键被按下
{
delayms(5); //按键去抖延时
temp=P1; //进行再一次判断
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee : keys=1;break; //1110 1110
case 0xde : keys=2;break; //1101 1110
case 0xbe : keys=3;break; //1011 1110
case 0x7e : keys=4;break; //0111 1110
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd; //1111 1101将第二行线置低电平,其余行线全为高电平
temp=P1; //将P3口当前的状态赋给临时变量temp
temp=temp&0xf0; //判断temp的高四位是否有0
if(temp!=0xf0) //说明有第一行的按键被按下
{
delayms(5); //按键去抖延时
temp=P1; //进行再一次判断
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed : keys=5;break; //1110 1101
case 0xdd : keys=6;break; //1101 1101
case 0xbd : keys=7;break; //1011 1101
case 0x7d : keys=8;break; //0111 1101
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb; //1111 1011将第三行线置低电平,其余行线全为高电平
temp=P1; //将P3口当前的状态赋给临时变量temp
temp=temp&0xf0; //判断temp的高四位是否有0
if(temp!=0xf0) //说明有第一行的按键被按下
{
delayms(5); //按键去抖延时
temp=P1; //进行再一次判断
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed : keys=9;break; //1110 1011
case 0xdd : keys=0;break; //1101 1011
// case 0xbd : key==;break;
// case 0x7d : write_data(0x01);break; //0111 1101
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
return keys;
}
// P1=0xf7; //1111 0111将第四行线置低电平,其余行线全为高电平
// temp=P1; //将P3口当前的状态赋给临时变量temp
// temp=temp&0xf0; //判断temp的高四位是否有0
// if(temp!=0xf0) //说明有第一行的按键被按下
// {
// delayms(10); //按键去抖延时
// temp=P1; //进行再一次判断
// temp=temp&0xf0;
// if(temp!=0xf0)
// {
// temp=P1;
// switch(temp)
// {
// case 0xe7 : key=+;break;
// case 0xd7 : key=-;break;
// case 0x77 : key=/;break;
// case 0xb7 : key=*;break;
// }
// while(temp!=0xf0)
// {
// temp=P1;
// temp=temp&0xf0;
// }
// }
// }
}
//void yunshuang()
//{
//
//
//
//}
///*写指令数据到LCD*/
///*RS=H,RW=L,E=高脉冲,D0-D7=指令码*/
//void write_cmd(uchar cmd)
//{
// LCD_RS=0; //写
// LCD_RW=0; //指令
// LCD_EN=0; //选中数据
// P1=cmd;
// delayms(5);
// LCD_EN=1; //写入数据
// delayms(5);
// LCD_EN=0;
//}
///*写显示数据到LCD*/
///*RS=H,RW=L,E=高脉冲,D0-D7=数据*/
//void write_dat(uchar dat)
//{
// LCD_RS=1; //写
// LCD_RW=0; //数据
// LCD_EN=0; //选中数据
// P1=dat;
// delayms(5);
// LCD_EN=1; //写入数据
// delayms(5);
// LCD_EN=0;
//}
//
//
Build target '计算机'
compiling main.c...
MAIN.C(140): warning C291: not every exit path returns a value
linking...
Program Size: data=14.0 xdata=0 code=323
creating hex file from "计算机"...
"计算机" - 0 Error(s), 1 Warning(s).
|