想在计数器里加多一个按键控制一个LED灯闪烁的功能,按一下按键灯就闪烁,再按一下灯就灭

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k6 = P1^6; //按键k6连接到了单片机的P1.6引脚
sbit k7 = P1^7; //按键k7连接到了单片机的P1.7引脚
uchar Table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段码。
uchar qianwanwei,baiwanwei,shiwanwei,wanwei,qianwei,baiwei,shiwei,gewei;//定义8个变量用于存放计数值count的各个位
uint count=0;//初始计数值
uint i=0;//定义一个全局变量i,当想把count分成千万,百万,十万,万,千、百、十、个位是用来临时存储count数据用
//********一下声明三个函数***************/
void display(void); //显示函数
void process(uint i); //数据处理函数,负责做除法运算,将计数器里的数分成千万,百万,十万,万,千,百,十,个
void key(void); // 按键函数,用于检测是否有按键按下,如果有就相应的加或减计数器里的数
/*****************************延时子程序********************************/
void delayms(uchar ms)
{ uchar i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
/*****************************显示函数**********************************/
void display(void) //动态显示函数,参数P为待显示的数组名
{
P2=0x7f; //打开P2.7位控制的数码管?
P0=Table[qianwanwei]; //取千万位在Table数组中所对应的显示段码送P0口
delayms(1);
P2=0xbf; //打开P2.6位控制的数码管
P0=Table[baiwanwei]; //取百万位在Table数组中所对应的显示段码送P0口
delayms(1);
P2=0xdf; //打开P2.5位控制的数码管
P0=Table[shiwanwei]; //取十万位在Table数组中所对应的显示段码送P0口
delayms(1);
P2=0xef; //打开P2.4位控制的数码管
P0=Table[wanwei]; //取万位在Table数组中所对应的显示段码送P0口
delayms(1);
P2=0xf7; //打开P2.3位控制的数码管。
{
count=0; //给计数器count赋初始值0

while(1) //主函数是由while构成的死循环,不停的执行下面三个函数
{
key(); //按键扫描处理函数,查看是否有键按下并做相应的处理。
process(); //计数值处理函数,将count分出千位、百位、十位、个位。
display(); //计数值显示函数,将count这个数在数码管上显示出来。
}
}

你这有两个按键,k6,k7,用哪个。
你这程序怎么也是数码管显示的,你这不是有显示程序吗,上一个提问的6个按键,怎么不会呢?
你这程序是从哪抄来的吗,也不全啊,缺很多行啊。
主程序呢,在哪里,也没有main()。这都是什么哪?????

那个LED灯在哪呀,也没有啊。这也是用在你的学习板上的程序吗?
你学习板上有LED灯吗,接在哪个脚啦,怎么接的,又不说明,等写完了程序又不行了。
这肯定又不能与你的学习板相符,这程序又没有办法写。追问

外加一个K5按键在P1^5,LED在P3^0位上,

追答

往哪:“再外加一个按键和一个灯进去的”?

加完了,你的学习板上也没有,又不行了。
你这些程序也不对呀,缺很多很多呀。
key(); 这个程序没有
process(); 这个程序也没有
display(); 这个程序还不全
你这提问也不诚心,没时间理你。

追问

麻烦你帮我写一个你自己的程序吧,你写的与我的不一样,这样你的程序就容易加进这些

追答

程序如下,需要根据你的学习板修改。

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit k0 = P3^7;  //另加一个按键在P3.7引脚,根据你学习板再改吧

sbit light=P3^2; //另加一个LED灯在P3.2引脚,根据你学习板再改吧

bit  blink;      //闪烁标志位,=1时LED灯闪烁,=0时LED灯灭

//****延时子程序****//这是原来的延时子程序没有变

void delayms(uchar ms)

{ uchar i;

while(ms--)

{

for(i = 0; i < 120; i++);//如果闪烁的快慢不合适,可修改这个120的值

}

}

main()

{

light=1; //开机先灭LED灯,输出0时亮,接法见仿真图

while(1)

{

//在这里写你原来的那些程序


if(blink)

{

light=!light;

delayms(200); //根据闪烁的快慢改这个括号内的参数

}

if(k0==0)

{

blink=!blink;

while(k0==0);

}

//闪烁程序结束

}

}

仿真图如下

追问

程序太多只能用图片了,这个是之前没改时的

追答

你说过的:

这样你的程序就容易加进这些,你自己加进你的程序吧。这图片看清楚。再说了,看图片,还得我自己现敲程序,太费劲了,你也太坑人了吧!

追问

我也想上传程序的,但老说字太多,只能用图片啊

我加进去了你写给我的程序,但按到那个k0键时灯会闪烁,不过数码管显示的数字也跟着闪烁

追答

知道原因了,主程序这样改。

main()
{
uchar k;
light=1; //开机先灭LED灯,输出0时亮,接法见仿真图
while(1)
{
//在这里写你原来的那些程序,原来的显示子程序照常写

if(blink)
{
light=!light;
for(k=50;k>0;k--)//根据闪烁的快慢改k=50这个值
display(); //这是原来程序中的显示子程序,放在这里
}
if(k0==0)
{
blink=!blink;
if(!blink)light=1;//LED灯灭
while(k0==0);
}
//闪烁程序结束
}
}

追问

现在是可以用了,不过还有一个问题,灯不闪烁时,我按加减键反应速度是很快的,每按一下都显示都会加或减,但按了K0键灯闪之后,按加减键反应迟顿了,按好多下显示才变化一下

追答

这是肯定的,因为闪烁时,
if(blink)
{
light=!light;
for(k=50;k>0;k--)//根据闪烁的快慢改k=50这个值
display(); //这是原来程序中的显示子程序,放在这里
}
要在这里延时的,循环调显示子程序,不再检查按键了。
解决办法:
一是尽量加快闪烁速度,即k=50的值小点。
二是按键的时间要稍长点,不要按一下就松了,按住后不松,当计数变化了再松。
这本来就不应该合在一起的程序,非要合在一起,就会有些问题。
最好的方法是用定时器,但是,又麻烦,复杂了。
就这样,你慢慢学习编程吧,等到能独立完成程序就可以自己修改了。

追问

好吧,还是要谢谢你,下次有问题再来请教你

如果在计数器那里再加一个24c02存储芯片用来保存断电后,之前最后一次计数到哪里,再上电都还在。麻烦帮我加进去24c02那个保存数据的程序到计数器程序里,就之前那个程序

来自:求助得到的回答
温馨提示:内容为网友见解,仅供参考
无其他回答