LY-51S(STC89C52R):8个共阴极数码管-程序(1)
2012-09-12 16:17阅读:
8位数码管的程序浪费了我一些时间,但是多思考不会有什么坏处,所以这部分我写的程序相对较多点儿,有些虽然看起来很相似,但为了加深理解我还是一个个的写出来,就连通用的函数头,显示函数和延时函数我也都一一写出来了。这些程序都是我亲手测试过的,不排出在调整排版时导致错误可能。
8个数码管为共阴极接法,与单片机P0口连接,段锁存位接P2^2,位锁存位接P2^3。
1:8个共阴极数码管流水灯式的分别显示0-9
#include
sbit LATCH1=P2^2;
//声明段锁存口
sbit LATCH2=P2^3;
//声明位锁存口
#define uint unsigned
int
#define uchar unsigned char
#define MAXDM 10
//宏定义一个段码最大个数
#define MAXWM 8
//宏定义位码最大个数
unsigned char code
DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//0-9的段码值
unsigned char code
WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//1-8数码管的位码值
void delay(uint );
//声明自定义函数
void main(void)
{
uchar
i,j;
while(1)
//while()主循环体,当双重for()循环结束后可直接从这里开始,不必再从main()函数开始
{
for(i=0;i位码循环主体
{
P0=WM[i];
LATCH2=1;
//打开位码锁存端
LATCH2=0;
//关闭位码锁存端
for(j=0;j嵌套在位码循环主体中的段码循环显示0-9
{
P0=DM[j];
LATCH1=1;
//打开段码锁存端
LATCH1=0;
delay(500);
//关闭段码锁存端
}
}
}
}
void delay(uint time)
//自定义延迟函数的定义
{
unsigned int i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--) ;
}
2:用函数_crol_()实现8个共阴极数码管流水显示数字8
注意:1、在LY-51S单片机中,数码管的电源是独立的,所以在实时应将J50用跳帽短接,以便连接到电源;
2、单片机上的P2.2接数码管的段锁存器的锁存控制端,P2.3接数码管的位锁存器的锁存控制端,即分别和板子上的J2B和J2A相连接.
#include
#include
#define uint unsigned
int
#define uchar unsigned
char
sbit LATCH1=P2^2;
//声明段锁存口(和J2B口相连)
sbit LATCH2=P2^3;
//声明位锁存口(和J2A口相连)
void delay(uint time);
void main(void)
{
unsigned char
ch=0xfe;
while(1)
{
LATCH2=1;
//打开为锁存
P0=ch;
//选择第一个数码管显示(由于数码管为共阴极,所以位选低电平时选通)
LATCH2=0;
LATCH1=1;
//打开段锁存
P0=0x7f;
//第一个数码管显示8
LATCH1=0;
delay(1000);
//延时越1s
ch=_crol_(ch,1);
//段码循环左移,即让第其他数码管按顺序显示数字8
}
}
void delay(uint time)
//自定义函数定义
{
unsigned int i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--) ;
}
3:8位数码管动态扫描(现象上为固定显示1-8)
注意:每个数码管都需要8位二进制数才能控制,所以8个数码管原理上应该属于并联连接方式,即同一时刻如果选定位码,那么所选定的数码管上显示的数字都是段码所标识的那一个