标题: 按下按键响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 |