C语言查询按键控制8个流水灯
一.仿真电路图
注意发光二极管的方向以及接的电阻的大小。
二.C语言代码
/****************************************************************************&
&函数功能:用AT89C51实现左右开花和左移右移的流水灯,以及一个数码管显示 &
&端口说明:P0口控制数码管显示,P1口控制八个发光二极管,P3.0和P3.1控制两个按键(3.1没用到)&
*****************************************************************************/
#include"AT89X51.h" //头文件包含声明,以下程序中的端口P0、P1、P3_0和P3_1等的说明都包含在该文件中
unsigned char denmabiao[]={0xe7,0xdb,0xbd,0x7e}; //左右开花流水灯码表
/*******延时函数******/
void delay(void)
{
unsigned int i,j;
for(i=0;i<50;i++) //双重循环实现延时,循环时间的长短可以通过修改50或2000的值来改变
for(j=0;j<2000;j++);
}
/*******开花流水灯*******/
void kaihua(void)
{
unsigned char i; //定义循环变量
for(i=0;i<4;i++) //循环语句,通过查表实现开花流水灯
{
P1=denmabiao[i]; //将相应的表值送到P1口
delay(); //延时
}
}
/*注意*——左移和右移并不是绝对的,硬件中灯的摆放不同,移的方向也会不同***/
/******右移流水灯******/
void right(void)
{
unsigned char data i; //定义循环变量
unsigned char a;
a=0x7f; //右边第一个灯亮 01111111
for(i=0;i<8;i++) //从右边起,第二个到第八个灯亮
{
P1=a;
delay(); //适当延时?
a=(a>>1)+0x80; //向右移一位再与0x80位于,以保证每次只有一个灯被点亮 00111111+10000000=10111111
}
}
/****左移流水灯****/
void left(void)
{
unsigned char data i; //变量定义
unsigned char a;
a=0xfe; //左边第一个灯亮
for(i=0;i<8;i++) //从左边起,第二个到第八个灯亮
{
P1=a;
delay(); //适当延时,以避免乱码
a=(a<<1)|0x01; //向左移一位再与0x01位于,以保证每次只有一个灯被点亮
}
}
/******主函数*****/
void main(void)
{
char x=0;
while(1) //无限循环,以保证只要一上电,系统一直运行0.1.2
{
if(P3_0==0)
{
x=x+1;
while(!P3_0);
if(x==3)
x=0;
}
if(x==0)
kaihua();
else if(x==1)
left();
else
right();
}
}
使用的工具:keil c 、proteus