|
发表于 2014-1-8 22:33:40
|
显示全部楼层
单片机,是硬软相结合的东西,必须知道你控制或驱动的是什么,
根据楼主代码,我大该说一下
#include<reg51.h> //头文件
#define SHOW P0 //宏定义,即替代名
sbit btnStart = P1^0; //位定义
sbit btnStop = P1^7;
sbit btnP = P1^1;
sbit btnR = P1^2;
sbit btnN = P1^3;
sbit btnD = P1^4;
sbit lwP = P2^0; //位定义
sbit lwN = P3^4;
sbit rwP = P2^1;
sbit rwN = P3^5;
int fStart = 0; //变量定义 并赋值
int fP = 0;
int fR = 0;
int fN = 0;
int fD = 0;
int segP = 0x8c; //变量定义 并赋值
int segR = 0x88;
int segN = 0xc8;
int segD = 0xa1;
void gearP(); //某功能函数声明
void gearR(); //某功能函数声明
void gearN(); //某功能函数声明
void gearD(); //某功能函数声明
void initial(); //初始化函数声明
void delay(int time); //延时函数,带参
void main()
{
initial(); //初始化
while(1) //原地真循环
{
if(btnStart == 0) //如果I/O P10脚为 低电平
{
while(btnStart == 0) // 则等待 P10脚为 高电平
{
;
}
fStart = 1; //如果I/O P10脚为 高电平 ,则 fStart 变量 赋值为1
}
if(btnStop == 0) //如果I/O P17脚为 低电平
{
while(btnStop == 0) // 则等待 P17脚为 高电平
{
;
}
fStart = 0; //如果I/O P17脚为 高电平 ,则 fStart 变量清零
}
/*上面变量 fStart 应该是当作一个标号变量在使用 */
if(fStart == 1) //如果 fStart 变量 值为1 则说明I/O P10脚为 低电平 ;将执行以下内容 (也说明I/O P10脚为低电平此步才能进入)
{
if(btnP == 0) //如果P11脚为低电平,
{
while(btnP == 0) //等待P11脚为高电平 (即低电平原地空循环,高电平跳出循环)
{
;
}
//当P11脚变高电平后
fP = 1; // fP变量赋值1
fR = 0; // fR变量赋值0
fN = 0; // fN变量赋值0
fD = 0; // FD变量赋值0
}
if(btnR == 0) // 如果P12脚为低电平,
{
while(btnR == 0) // 同上
{
;
}
fP = 0; //同上,仅值不一样
fR = 1;
fN = 0;
fD = 0;
}
if(btnN == 0) //如果P13脚为低电平,
{
while(btnN == 0) //同上
{
;
}
fP = 0;
fR = 0;
fN = 1;
fD = 0;
}
if(btnD == 0) //如果P14脚为低电平,
{
while(btnD == 0) //同上
{
;
}
fP = 0; //同上
fR = 0;
fN = 0;
fD = 1;
}
/* 上面目前表明 经过P10脚的判断后,假如是接的按键-(P11,P12,P13,P14)为输入脚,判断后每个脚对应 修改内部变量*/
/* 下面就应该判断相对按键按下的处理过程*/
if(fP == 1) // 如果fP 为1
{
gearP(); // 则调用这个函数
}
if(fR == 1) // 如果fR 为1
{
gearR(); // 则调用这个函数
}
if(fN == 1) // 如果fN 为1
{
gearN(); // 则调用这个函数
}
if(fD == 1) // 如果fD 为1
{
gearD(); //则调用这个函数
}
}
else //否则 将执行初始化
{
initial();
}
}
}
void gearP() //子函数gearP
{
SHOW = segP; // 将初始值赋给P0并口输出
lwP = 1; // 对P20口置高
lwN = 1; // 对P24口置高
rwP = 1; // 对P21口置高
rwN = 1; // 对P25口置高
}
void gearR() //同上
{
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20); //延时子函数
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);
}
void gearN()
{
SHOW = segN;
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
}
void gearD()
{
SHOW = segD;
lwP = 1;
lwN = 0;
rwP = 1;
rwN = 0;
}
void initial()
{
fStart = 0;
fP = 0;
fR = 0;
fN = 0;
fD = 0;
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
}
void delay(int time)
{
int i,j;
for(i=0;i<time;i++)
{
for(j=0;j<120;j++)
{
;
}
}
}
/*下面这段没在main函数里,也没在子函数里,格式有问题 ,这里是想初始化定义吗?还是复制代码的时候没完全,
如果是在某个子函数中 {} */
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);这段 为什么后面延时一定要加 //delay(20) 20表示延时的周期 当然没个都要赋形参
//如果你是指,变量赋值后为什么要加delay(20) 那是因为须等待其他模块的程序调用这几个变量的值
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);不是有delay(20);了吗 |
|