51单片机数码管加减
- 格式:doc
- 大小:28.50 KB
- 文档页数:5
实现的功能:按下key1键数字加1,按下key2键数字减1,按下key3键数字归零。并且满足,在不松开按键时,数字会按一定时间间隔持续递增或递减。
数码管显示程序:
void display(uchar shu)
{
uchar bai,shi,ge;
bai=shu/100;
shi=shu/10%10;
Ge=shu%10;
P2=0x7f;
P0=table[ge];
delay(5);
P2=0xbf;
P0=table[shi];
delay(5);
P2=0xdf;
P0=table[bai];
delay(5);
}
这里是利用传送函数,在传送过程中我们传送的是一个值,这个值的百、十、个位,我们在子函数中进行分解。再通过数组将段码、位码,传送到相应的I/O。
此外还要注意的一点是:这里是动态扫描,不能忘了原理,是一位一位的显示,只是太快了,看不出来,所以在每一个数码管亮之间一定要有10毫秒的延时!!!
键盘子程序:
void keyscan()
{
P1=0xff; // P1口赋初值,
key_code=P1;//将P1口的状态赋予一个变量,便于以后的检测。
if(key_code!=0xff)//如果条件满足说明有按键被按下。
{
for(i=0;i<30;i++)
display(shu);//这小段子程序有两个
作用:1、不断的扫描显示子程序。这样就会避免一种现象:按键被按下时,所有的数码管会闪烁,加了这小段程序后给人的感觉是各个数码管是独立的,互不影响,它加他的,我前面几位该不变就不变。
2、还起到延时作用。
switch(key_code)//利用switch可以是程序事半功倍,又好读,应该借鉴。
{
case 0xfe://注意格式的书写
if(shu<255)
shu++;
break;//不要忘了
case 0xfd:
if(shu>0)
shu--;
break;
case 0xfb:
shu=0;
}
key_code=0xff;//这句程序得格
外注意,容易丢,为下一次判断Key_code做准备。
}
}
这个键盘子程序的思路可以借鉴,以后得这样用。
主程序:
void main()
{
while(1)
{
display(shu);
keyscan();
}
}
键盘,显示子程序均需要不停地扫描。
这里要注意的是:由于要求中要满足,不松开按键时,数字间隔增加或
减少,所以在键盘子程序中就不能像平时一样,key是否为0,延时,是否为0,while(!key);等待按键释放。这样写永远也实现不了功能,这就是这个程序的巧妙之处,以后不要死板硬套,要根据功能去写程序。