设计一个单片机C51程序,实现功能是,1、按KEY1只有红灯亮,KEY2只有黄灯亮,KEY3只有绿灯亮。2、开始右数码管显示0,每按KEY1一次数码管显示加1,至9后再循环。先已经编好程序,第一个实现,但第二个总弄不对。感觉问题很简单,就是差一点,高手帮我看一下。
/*-------------------------------------------------------------
key.h 头文件
功能:三独立键处理函数
--------------------------------------------------------------*/
#ifndef _KEY_H_
#define _KEY_H_
#include <reg51.h>
#define uchar unsigned char
#define ENTER 0x03 //定义键号
#define UP 0x01
#define DOWN 0x02
sbit UP_key = P1^0; //键引脚
sbit DOWN_key = P1^1;
sbit ENTER_key =P1^2;
/*------------------------------------------------------------------------------------
功能:毫秒延时函数
参数:当晶振为11.0592MHz时,x为ms数,误差都为16us;x=1000为1秒
------------------------------------------------------------------------------------*/
void delayms(unsigned int x)
{
unsigned char j;
while(x--)
{
for(j=0;j<123;j++){;}
}
}
/*--------------------------------------------------------------------
功能:获取键号
返回:键号
--------------------------------------------------------------------*/
uchar KeyscanNUM(void)
{
uchar key;
UP_key=1; DOWN_key=1; ENTER_key=1;
if (UP_key==0) {delayms(10);key=UP;}
if (DOWN_key==0) {delayms(10);key=DOWN;}
if (ENTER_key==0) {delayms(10);key=ENTER;}
return key;
}
#endif
下面是主程序
#include "key.h"
sbit LED_RED=P3^0;
sbit LED_YELLOW=P3^1;
sbit LED_GREEN=P3^2;
sbit LED1=P2^7;
sbit LED0=P2^6;
uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar ledbuf[2];
uchar num;
/*---------------------------------------------------
键处理子函数
功能:按UP键红灯亮,按ENTER键黄灯亮,按DOWN键绿灯亮
----------------------------------------------------*/
void KeyProc(uchar key)
{
switch (key)
{
case UP:{LED_RED=0; LED_YELLOW=1; LED_GREEN=1; num=num+1; }break;
case DOWN:{LED_RED=1; LED_YELLOW=0; LED_GREEN=1;}break;
case ENTER:{LED_RED=1; LED_YELLOW=1; LED_GREEN=0;}break;
}
}
//*主程序
void main (void)
{
uchar key;
while (1)
{
key=KeyscanNUM();
if (key==UP||key==DOWN||key==ENTER)
{
KeyProc(key);
key=0;
}
P2=dispcode[num];
}
}
#include "key.h"
sbit LED_RED=P3^0;
sbit LED_YELLOW=P3^1;
sbit LED_GREEN=P3^2;
sbit LED1=P2^7;
sbit LED0=P2^6;
uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar ledbuf[2];
/*---------------------------------------------------
键处理子函数
功能:按UP键红灯亮,按ENTER键黄灯亮,按DOWN键绿灯亮
----------------------------------------------------*/
//*主程序
void main (void)
{
uchar num;
uchar key;
while (1)
if(UP_key==0)
{
delayms(10);
if(UP_key==0)
{
LED_RED=0; LED_YELLOW=1; LED_GREEN=1;
LED1=0; P0=dispcode[num]; LED0=1;
num++;
if(num==10) num=0;
while(!UP_key);
}
}
}