13:数码管循环显示0.0-9.9
注意:1.float和double为无符号型变量,不能用unsigned修饰,因为他们的存放和运算是按整数部分和小数部分分
开的;
2.浮点型常量无法求余,要对其求余必须想办法转换为整型或可采用类型强制转换方法
#include
sbit LATCH1=P2^2; //声明段锁存口
sbit LATCH2=P2^3; //声明位锁存口
#define MAXDM 10 //段码最大个数
#define MAXWM 8 //位码最大个数
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
uchar code
DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//0-9的段码值
uchar code
DM_POINT[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//0.-9.的段码值
uchar code WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//1-8数码管的位码值
void delay(uint ); //自定义延时函数声明
void display(uchar ,uchar );
//自定义显示函数声明
uchar temp[MAXDM]; //临时数组声明
void main(void)
{
float num=0.0;
//注意浮点型是无符号型的,不能用unsigned修饰
uint ct=0,t;
while(1)
{
ct++;
if(ct==50)
{
ct=0;
num=((num*10)+1)/10.0; //小数增加0.1
if(num>9.9)
num=0.0;
}
t=num*10; //先将浮点型转换成整数型再用作数组索引的计算
temp[0]=DM_POINT[t/10];
temp[1]=DM[t];
display(0,2);
}
}
void display(uchar site,uchar digit)
{
uchar
dex;
for(dex=0;dex
{
LATCH1=1; //清除数字变化对未点亮数码管产生交替重影
P0=0;
LATCH1=0;
LATCH2=1; //锁存要显示的位码
P0=WM[dex+site];
LATCH2=0;
LATCH1=1; //锁存要显示的段码
P0=temp[dex];
LATCH1=0;
delay(3); //延时一小段时间,太长数字会闪烁,太短会重影
}
}
void delay(uint time)
{
uint i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}
14:改进后的循环显示0.0-9.9
在程序13中,方法过于笨拙,其实要实现在任意数字后面加小时点只需要同16进制0x80进行或运算(运算符为"|")即可实现。其实只要会了动态扫面和将段码数组索引与显示数巧妙结合的方法,累加,累减和消失点显示非常方便
#include
sbit LATCH1=P2^2; //声明段锁存口
sbit LATCH2=P2^3; //声明位锁存口
#define MAXDM 10 //段码最大个数
#define MAXWM 8 //位码最大个数
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
uchar code
DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的段码值
uchar code WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//1-8数码管的位码值
void delay(uint ); //自定义延时函数声明
void display(uchar ,uchar );
//自定义显示函数声明
uchar temp[MAXDM]; //临时数组声明
void main(void)
{
uint ct=0,num=99;
while(1)
{
ct++;
if(ct==50)
{
ct=0;
num++;
if(num==100)
num=0;
}
temp[0]=DM[num/10]|0x80;
temp[1]=DM[num];
display(0,2);
}
}
void display(uchar site,uchar digit)
{
uchar dex;
for(dex=0;dex
{
LATCH1=1; //清除数字变化对未点亮数码管产生交替重影
P0=0;
LATCH1=0;
LATCH2=1; //锁存要显示的位码
P0=WM[dex+site];
LATCH2=0;
LATCH1=1; //锁存要显示的段码
P0=temp[dex];
LATCH1=0;
delay(3); //延时一小段时间,太长数字会闪烁,太短会重影
}
}
void delay(uint time)
{
uint i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}
15:数码管消隐递增0-99
消隐也可通过判断数字的大小来实现,如num<10,那么个位以上全消隐.
#include
sbit LATCH1=P2^2; //声明段锁存口
sbit LATCH2=P2^3; //声明位锁存口
#define MAXDM 10 //段码最大个数
#define MAXWM 8 //位码最大个数
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
uchar code
DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的段码值
uchar code WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}