#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这个数在数码管上显示出来。
}
}
外加一个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那个保存数据的程序到计数器程序里,就之前那个程序
来自:求助得到的回答