51单片机数码管加减

  • 格式:doc
  • 大小:28.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现的功能:按下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);等待按键释放。这样写永远也实现不了功能,这就是这个程序的巧妙之处,以后不要死板硬套,要根据功能去写程序。