#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).
|