①数码管显示1-9的自加
②数码管显示1-99的自加
③数码管滚动显示11位的电话号码
/****************************************************************************************************/
#include <reg51.h>
#define DatePort P1
#define MAXCOUNT 40
sbit Seg_Latch = P2^2; //段锁存
sbit Bit_Latch = P2^3; //位锁存
unsigned char code seg_ca[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极段码
unsigned char code seg_cc[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极段码
unsigned char code bit_seg_ca[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code my_tele_seg_code[11] = {0x06,0x4f,0x5b,0x7d,0x3f,0x7f,0x7f,0x07,0x7f,0x6f,0x06};//电话表
unsigned char display_Num[8];
void display(unsigned char FirstBit,unsigned char Lenth );
void display_mytele(unsigned char FirstBit,unsigned char Lenth,unsigned char seg_code_first);
void DelayUs2x(unsigned char t)
{
while(t--);
}
void DelayMs(unsigned int t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void main()
{
unsigned char i = 0;
unsigned char j = 0;
unsigned int temp = 0;
unsigned char x = 0; //个位
unsigned char y = 0; //十位
unsigned int Num = 0;
unsigned int a = 0;
/**********************************************
0~9 自增
**********************************************/
/* P0 = 0x00;
while(1)
{
for(i = 0; i < 10 ; i++)
{
P0 = seg_cc[i];
DelayMs(100);
}
}*/
/***********************************************
0~99 自增
***********************************************/
/* P0 = 0x00;
while(1)
{
x++;
if(x == 10)//累加,往下运行,就是刷新,不会卡住
{
y++;
x = 0;
}
if(y == 50)
{
y = 0;
Num++;
}//用if循环的目的是不断地刷新数字,如果用delay则停止,不能使人眼及时捕捉到数字
// DelayMs(100);//延时,不往下运行,不是我想要的
if(Num == 99)
Num = 0;
display_Num[0] = Num/10;
display_Num[1] = Num%10;
display(0,2);
}*/
/***************************************************************
只要改#define MAXNUM 就能实现任意数的累加
***************************************************************/
/* P0 = 0x00;
temp = MAXCOUNT;
while(temp /= 10)
i++;
i++;
j = i;//判断共有多少位需要显示
while(1)
{
x++;
if(x == 200)//累加,往下运行,就是刷新,不会卡住
{
Num++;
x = 0;
if(Num == MAXCOUNT+1)
{
Num = 0;
}
}
// DelayMs(100);//延时,不往下运行,不是我想要的
a = Num;
i = j;
while(i != -1)
{
display_Num[--i] = a%10;//bit0为个位
a/=10;
}
display(0,j);
}*/
/******************************************************************
滚动数码管,显示电话号码
******************************************************************/
while(1)
{
x++;
if(x == 100)//累加,往下运行,就是刷新,不会卡住
{
i++;
x = 0;
}
if(i <= 7)
{
DelayUs2x(200);
display_mytele(7-i,i+1,0);//未填满数码管至填满数码管
}
else if(i>7 && i<=10)
{
display_mytele(0,8,i-7);//填满数码管但电话号码还未全部显示
}
else if(i>10 && i <= 18)
{
DelayUs2x(200);
display_mytele(0,18-i,i-7);//电话号码全部演示至最后一位移除数码管
}
else
{
i = 0;
}
}
}
void display_mytele(unsigned char FirstBit,unsigned char Lenth,unsigned char seg_code_first)//seg_code_first显示的段码的第一位位
{
unsigned char a = 0;
unsigned char z = seg_code_first;
for(a = FirstBit ; a < FirstBit+Lenth ; a++)
{
DatePort = 0;
Seg_Latch = 1; //开门
Seg_Latch = 0; //关门
DatePort = bit_seg_ca[a];
Bit_Latch = 1; //开门
Bit_Latch = 0; //关门
DatePort = my_tele_seg_code[z++];
Seg_Latch = 1; //开门
Seg_Latch = 0; //关门
DelayUs2x(100);
}
}
void display(unsigned char FirstBit,unsigned char Lenth)//常用的显示函数
{
unsigned char a;
for(a = FirstBit ; a < FirstBit+Lenth ; a++)
{
DatePort = 0;
Seg_Latch = 1; //开门
Seg_Latch = 0; //关门
DatePort = bit_seg_ca[a];
Bit_Latch = 1; //开门
Bit_Latch = 0; //关门
DatePort = seg_ca[display_Num[a]];
Seg_Latch = 1; //开门
Seg_Latch = 0; //关门
DelayUs2x(100);
}
}
对于电话号码的滚动,我们开始是用分为4类情况处理,但其实还有更简单的方法,就是在电话号码前留7位0,电话号码后留7位0,共25位进行循环左移。具体实现这里就不实现了。