十进制步进加减计数器

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

设计任务和设计要求:

3.1任务:设计并制作一个两位十进制步进步进计数器,要求从0到80步进计数

3.2要求:A.能从0到80步进计数,要求计数准确

B .可加可减,加到80时锁定,减到0时也会锁定

C.能手动复位

#include

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9段码

sbit keyadd=P3^0; //加按键

sbit keyminus=P3^1; //减按键

sbit keyreset=P3^2; //复位按键

uchar num=0,num1,flag1,flag2=0,flag3;//num、num1的值就是数码管显示的值。

//flag1控制加锁定,flag2控制减锁定,flag3控制减时0出现的情况。

uchar num_buffer[]={0,0};//时、分的中间变量

void delay(uint xms)//延时

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

/*因为有两位数码管,采用动态显示的方法显示,先让一位点亮数秒,关闭,消影,再点亮第二位*/

void display(uchar num1)//数码管显示

{

uchar shi,ge;//shi、ge的值就是数码管十位、个位的值

shi=num1/10;

ge=num1%10;

P2=0xfe;//动态显示

P0=table[ge];

delay(1);//显示持续大约1ms

P0=0xff;//消影

P2=0xfd;

P0=table[shi];

delay(1);

P0=0xff;

}

/*控制的情况加减各有两种:加①按加减前没有按过减键②按加键前按过减键

减①按减键前没有按过加键②按减键前按过加键

*/

void keyscan()//键扫描

{

if(keyadd==0)//按下加按键

{

delay(10);//去抖

if(keyadd==0)

{

if(flag1==1)

num=80;

if(flag2==1)

num=0;//加减锁定

else if(num==99)

num=0;

else if(num!=80)

num++;

else flag1=1;//如果是加到80就锁定

while(!keyadd);//松开按键后开始执行加操作

}

}

if(keyminus==0)//按下减按键

{

delay(10);

if(keyminus==0)

{

if(flag2==1)

num=0;

if(flag1==1)

num=80;

else if(flag3==0 &&num==0)//当按减键前数值为0时不锁定

{

num=99;

flag3=1;

}

else if(num!=0)

{

flag3=2;//当按减键前数值不为0时减到0锁定

num--;

if(flag3==1 && num==0)

flag2=1;

if(flag3==2 && num==0)

flag2=1;

}

while(!keyminus);

}

}

if(keyreset==0)//按下复位

{

delay(10);

if(keyreset==0)

{

num=0;

flag2=0;

flag1=0;

flag3=0;//去除锁定标志

while(!keyreset);

}

}

}

void main()

{

P2=0xff;

P0=0xff;

P0=0xc0;

while(1)//不断地进行键扫描和显示

{

keyscan();

display(num);

}

}

相关文档
最新文档