标题: 按下按键响30次 [打印本页]

作者: liuyang    时间: 2012-5-29 18:41
标题: 按下按键响30次
/*
必要操作:连接左上角3个跳线
*/
#include <AT89X52.H>     //包含头文件
#define led P0       //定义LED口
#define shuma P0      //定义数码管数据口
sbit LED_0=P1^0;      //定义4个控制脚
sbit LED_1=P1^1;
sbit LED_2=P1^2;
sbit LED_3=P1^3;
sbit buz=P3^4;       //定义蜂鸣器所在口

unsigned char flag;      //定义测试部分标志
/*=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
             0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
            //共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F
void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);
void Delay(unsigned long i)    //延时函数
{
 while(i--);
}
void delayx(unsigned int x)     //延时函数,有效效果为数码管不闪烁
{
   unsigned int i;
   for(i=0;i<x;i++);
}
void main(void)
{
 unsigned char d;     //定义状态变量d
 unsigned int i;
 flag=1;
 led=0xff;       //LED全灭
 buz=1;
 for(;;)
 {

  if(flag==1)
  {
   //蜂鸣器响1次,进入第一测试
   Delay(1000);
   buz=0;
   Delay(1000);
   buz=1;
   d=0X01;       //d的初始值即灯的初试状态
   while(d!=0)      //实现8次左移,如果d中唯一的位1移动出范围,则重新赋值开始
   {
    led=~d;      //反向输出点亮
    Delay(5000);    //延时
    d<<=1;      //左移动一位
    Delay(5000);    //延时
   }        //当左移到头则从for(;;)下面重新开始,循环左移效果
   flag++;       //LED测试完毕,开始测试数码管
   led=0;
  }

  if(flag==2)
  {
   //蜂鸣器响2次,进入第二测试
   Delay(1000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(1000);
   buz=0;
   Delay(1000);
   buz=1;
   d=0x01;
   while(d!=0)      //实现8次左移,如果d中唯一的位1移动出范围,则重新赋值开始
   {
    LED_0=0;LED_1=1;LED_2=1;LED_3=1;
    P0=P2;
    P0=~d;      //反向输出点亮
    Delay(1500);    //延时
    d<<=1;      //左移动一位
    Delay(1500);    //延时
   }
   d=0x01;
   while(d!=0)      //实现8次左移,如果d中唯一的位1移动出范围,则重新赋值开始
   {
    P0=P2;
    LED_0=1;LED_1=0;LED_2=1;LED_3=1;
    P0=~d;      //反向输出点亮
    Delay(1500);    //延时
    d<<=1;      //左移动一位
    Delay(1500);    //延时
   }
   d=0x01;
   while(d!=0)      //实现8次左移,如果d中唯一的位1移动出范围,则重新赋值开始
   {
    P0=P2;
    LED_0=1;LED_1=1;LED_2=0;LED_3=1;
    P0=~d;      //反向输出点亮
    Delay(1500);    //延时
    d<<=1;      //左移动一位
    Delay(1500);    //延时
   }
   d=0x01;
   while(d!=0)      //实现8次左移,如果d中唯一的位1移动出范围,则重新赋值开始
   {
    P2=P3;
    LED_0=1;LED_1=1;LED_2=1;LED_3=0;
    P0=~d;      //反向输出点亮
    Delay(1500);    //延时
    d<<=1;      //左移动一位
    Delay(1500);    //延时
   }
   flag++;
  }

  if(flag==3)
  {
   //蜂鸣器响3次,进入第三测试
   Delay(1000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(1000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(1000);
   buz=0;
   Delay(1000);
   buz=1;
   for(i=0;i<300;i++)    //数码管显示1234持续一段时间
   {
    P2=P3;
    display(1,2,3,4);
   }
   flag++;
  }
  if(flag==4)       //蜂鸣器效果
  {
   buz=0;
   Delay(1000);
   buz=1;
   Delay(3000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(3000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(3000);
   buz=0;
   Delay(8000);
   buz=1;
   Delay(1000);
   buz=0;
   Delay(8000);
   buz=1;
   Delay(8000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(3000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(3000);
   buz=0;
   Delay(1000);
   buz=1;
   Delay(10000);
   flag=1;
  }
 }
}

void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
{
   shuma=a[d1]; //选中第一位,发送第一位段码
   LED_0=0;  //第一位显示
   delayx(100);  //延时显示
   LED_0=1;  //第一位关显示

   shuma=a[d2]; //选中第二位,发送第二位段码,以下原理同上
   LED_1=0;
   delayx(100);
   LED_1=1;

   shuma=a[d3]; //选中第三位,发送第三位段码,以下原理同上
   LED_2=0;
   delayx(100);
   LED_2=1;

   shuma=a[d4]; //选中第四位,发送第四位段码,以下原理同上
   LED_3=0;
   delayx(100);
   LED_3=1;
}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1