一、显示小数
具体任务:
尝试在数码管上显示带有小数点的数字,例如3.14
代码:
#include<reg52.h>
//位定义数码管
sbit SegmentG1=P2^3;
sbit SegmentG2=P2^2;
sbit SegmentG3=P2^1;
sbit SegmentG4=P2^0;
//定义数码管显示数字
static unsigned char s_arrNumber[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
//延时函数
static void DelayNms(int nms)
{
unsigned int i,j;
for(i=0;i<nms;i++)
{
for(j=0;j<123;j++)
{
}
}
}
//主函数
void main()
{
while(1)
{
P0=s_arrNumber[3]&0x0c;//显示3.
SegmentG1=0; //打开数码管1
DelayNms(5); //延时5ms
SegmentG1=1; //关闭数码管1
P0=s_arrNumber[1]; //显示1
SegmentG2=0; //打开数码管2
DelayNms(5); //延时5ms
SegmentG2=1; //关闭数码管2
P0=s_arrNumber[4]; //显示4
SegmentG3=0; //打开数码管3
DelayNms(5); //延时5ms
SegmentG3=1; //关闭数码管3
P0=s_arrNumber[1]; //显示1
SegmentG4=0; //打开数码管4
DelayNms(5); //延时5ms
SegmentG4=1; //关闭数码管4
}
}
二、按键计数器
具体任务:
判断KEY1按下,每次按下按键后记录按动次数加1,并且能在数码管上显示,能够从0计数至99。
代码:
(三种方案)
#include <reg52.h>
//位定义数码管
sbit SegmentG3 = P2^1;
sbit SegmentG4 = P2^0;
//位定义按键
sbit KEY1 = P3^2;
//定义数组0~9
static unsigned char s_arrNumber[] ={0x03, 0x9F, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};
//延时函数
static void DelayNms(int nms)
{
unsigned int i,j;
for(i=0;i<nms;i++)
{
for(j=0;j<123;j++)
{
}
}
}
//主函数
void main()
{
unsigned int i,j = 0;//定义要用到的变量
while(1)
{
//定义初始显示的数字00
P0 = s_arrNumber[i];//显示数字0
SegmentG4 = 0; //打开数码管4
DelayNms(5); //延时5ms
SegmentG4 = 1; //关闭数码管4
P0 = s_arrNumber[j];//显示数字0
SegmentG3 = 0; //打开数码管3
DelayNms(5); //延时5ms
SegmentG3 = 1; //关闭数码管3
//按键检测消抖
if(0==KEY1) //若1被按下
{
DelayNms(50); //等5ms
if(0==KEY1) //若再次检测到1被按下
{
//个位增加任务
i++;
if(i<10)//个位不超过10
{
//数码管4打开显示不断增加的数字i,持续5ms关闭
P0 = s_arrNumber[i];
SegmentG4 = 0;
DelayNms(5);
SegmentG4 = 1;
//数码管3打开显示j(初始为0,后续看十位增加任务里是几就保持几),持续5ms关闭
P0 = s_arrNumber[j];
SegmentG3 = 0;
DelayNms(5);
SegmentG3 = 1;
}
else
{
//十位增加任务
i=0;
j++;
if(j<10)//十位不超过10
{
//数码管4打开显示i=0,持续5ms关闭
P0 = s_arrNumber[i];
SegmentG4 = 0;
DelayNms(5);
SegmentG4 = 1;
//数码管3打开将十位数j增加1,持续5ms关闭
P0 = s_arrNumber[j];
SegmentG3 = 0;
DelayNms(5);
SegmentG3 = 1;
//十位增加1后跳转至个位增加任务(因为条件符合i<10),如此循环
}
else//十位超过10,即超出了99计数范围,则重新执行任务(显示00)
{
i,j = 0;
P0 = s_arrNumber[i];
SegmentG4 = 0;
DelayNms(5);
SegmentG4 = 1;
P0 = s_arrNumber[j];
SegmentG3 = 0;
DelayNms(5);
SegmentG3 = 1;
}
}
while(0==KEY1)//等待KEY1弹起
{
}
}
}
}
}
//方案2
void main()
{
unsigned int n = 0;
unsigned int m = 0;
unsigned int l = 0;
while(1)
{
if(KEY1 == 0)
{
DelayNms(100);
n++;
}
m = n % 10;
l = n / 10;
P0 = s_arrNumber[m];
SegmentG4 = 0;
DelayNms(5);
SegmentG4 = 1;
P0 = s_arrNumber[l];
SegmentG3 = 0;
DelayNms(5);
SegmentG3 = 1;
}
}
//方案3
i++;
if(10==i)
{
i=0;
j++;
}
else if(10==j)
{
j=0;
k++;
}