十进制步进加减计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);
}
}