51单片机,帮忙写个c语言程序

2024-11-25 04:42:06
推荐回答(1个)
回答1:

//好像是这个头文件 好久没玩51了
#include
//------------宏定义---------------//
#define uchar unsigned char
#define uint unsigned int
#define BUTTON1 1 //按键1
#define BUTTON2 2 //按键2
//-----------变量-----------//
uchar Counter = 0; //统计按键次数
/*-------管脚定义 --------//
记得是sbit P13 = P1^3;
忘了,你自己定义吧,我直接写程序
*/
//-------------延时---------------//
void Delay(uchar x)
{
uchar i,j;
for(i = 0; i++; i < x)
for(j = 0; j++; j < 200)
}
//------------按键扫描------------//
uchar ButtonScan (void)
{
uchar ButtonNum = 0;
if(P13 == 0)
{
/*延时防止按键抖动,如果你的晶振是12M的话,
如果是其他的你只要让延时在30ms就可以了*/
Delay(150);
if(P13 == 0)
while(!P13); /*等待按键松开*/
ButtonNum = BUTTON1;
}
if(P14 == 0)
{
Delay(150);
if(P14 == 0)
while(!P14); /*等待按键松开*/
ButtonNum = BUTTON2;
}
return ButtonNum;
}
//----------按键判断-------------//
void ButtonJugde (void)
{
switch(ButtonScan())
{
case 1: //增加
if (Counter != 40)
Counter++;
break;
case 2: //减小
if (Counter != 0)
Counter--;
break;
default: break;
}
}
//---------LED点亮处理--------//
uchar LED (void)
{
/*我这里把你所说的“一号灯”理解为P2.0所对应的二极管,
“二号灯”理解为P2.1所对应的二极管。。。一次类推
根据你的实际电路情况调整*/
uchar LedEnable;
if((Counter > 0) && (Counter <= 5))
{
/*我理解你的二极管是接地的,然后高电平点亮
根据你的实际电路情况调整*/
LedEnable = 0x01;
}
if((Counter > 5) && (Counter <= 10))
{
LedEnable = 0x03;
}
if((Counter > 10) && (Counter <= 15))
{
LedEnable = 0x07;
}
if((Counter > 15) && (Counter <= 20))
{
LedEnable = 0x0f;
}
if((Counter > 20) && (Counter <= 25))
{
LedEnable = 0x01f;
}
if((Counter > 25) && (Counter <= 30))
{
LedEnable = 0x3f;
}
if((Counter > 30) && (Counter <= 35))
{
LedEnable = 0x7f;
}
if((Counter > 35) && (Counter <= 40))
{
LedEnable = 0xff;
}
return LedEnable;
}
//--------------主函数------------------//
void main(void)
{
while(1)
{
ButtonJugde (); //按键扫描
P2 = LED(); //点亮二极管
}
}
免责声明:
以上程序为本人(chen bolin)所写,但是未通过本人验证。
任何人可以使用或修改本代码,包括商业用途。本人不承担任何责任。
具体请遵守GPL协议。

我没有编译,你自己编译看看吧,别忘了把管脚定义补全了。应该可以实现的。如果有什么不明白的可以到我的主页留言。