设为首页 - 加入收藏 - 网站地图 我爱嵌入式(www.52embed.com),专注嵌入式开发技术!
当前位置:主页 > 嵌入式软件 > 正文

C8051F020单片机按键源码

时间:2015-05-11 21:11 来源:网络 作者:网络 阅读:
//-----------------------------------------------------------------------------
//程序描述:
//  这个程序扫描:KEY1...KEY4,返回按相应的按键字符:'1','2','3','4'
//  并在LCD上显示出来(注:J18要短接给LCD供电).
//作者:ZDP
//时间:2005-11-30
//版本:V1.0
//-----------------------------------------------------------------------------
 
#include <c8051f020.h>                    // SFR declarations
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
unsigned long x;
 
void LCD_Init(void)
{
   P2 = 0X80;
   for(x=0;x<1000;x++);
   //P7 = 0x30; /*一行显示*/
   P3 = 0x38; /*两行显示*/
   P2 = 0X00;//0x08;
   P2 = 0X80;//0x09; 
   for(x=0;x<1000;x++);
   P3 = 0x0e;
   P2 = 0x00;
   P2 = 0x80;
   for(x=0;x<1000;x++);
   P3=  0x06;
   P2 = 0x00;
   P2 = 0x80;
   for(x=0;x<5000;x++);
   P3 = 0x01;
   P2 = 0x00;
   P2 = 0x80; 
   for(x=0;x<5000;x++);
}
void delay(void)
{
int a=1000;
while(a!=0)
{
a--;
}
 }
/*----------------------------------------------------*/
//按键连接到p2.0、p2.1、p2.2、P2.3,均为开漏输出
unsigned char key_in(void)
{
P2=0xff;
if(key1==0)
{
key1=1;
delay();//延时
if(key1==0)
{
while(key1==0);
return(0x31);//返回字符"1"表示按键SW1按下
}
}
 
if(key2==0)
{
key2=1;
delay();//延时
if(key2==0)
{
while(key2==0);
return(0x32);//返回字符"3"表示按键SW1按下
}
}
 
if(key3==0)
{
key3=1;
delay();//延时
if(key3==0)
{
while(key3==0);
return(0x33);//返回字符"3"表示按键SW1按下
}
}
 
if(key4==0)
{
key4=1;
delay();//延时
if(key4==0)
{
while(key4==0);
return(0x34);//返回字符"4"表示按键SW1按下
}
}
return(0);//返回0,表示没有按键按下
}
 
 
void main(void) 
{
unsigned char data1;
WDTCN = 0xde;                          // 关闭WDT
WDTCN = 0xad;
    XBR2  = 0x40;   //启用交叉开关
while(1)
{
data1=key_in(); //读按键
if(data1!=0) //有按键按下,显示对应的按键
{
LCD_Init();                     //LCD初始化
P2  = 0xA0;                     //准备送数据
for(x=0;x<1000;x++);
P3 = data1; //写数据到端口
P2 = 0X20;
P2 = 0XA0; //控制LCD
for(x=0;x<1000;x++);
}
}
 
}
 
 
 

(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。