在德飞莱的系统中,数码管的解法是这样接的:
段锁存器:使能端(低电平有效)
c = 0时,锁存;
c = 1时,传送数据;
段选和位选的操作:
sbit bit_sel = P2^0;//位选
sbit seg_sel = P2^1;//段选
unsigned char segdata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极0~f
unsigned char coode[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//控制位选
先操作段码,再作位码。
//消重影
SEGPORT = 0xff;
bit_sel = 1;
bit_sel = 0;
SEGPORT = 0x0;
seg_sel = 1;
seg_sel = 0;
//对数字的刷新
SEGPORT = coode[i];
bit_sel = 1;
bit_sel = 0;
SEGPORT = outdata[i];
seg_sel = 1;
seg_sel = 0;
在没有中断的程序的情况下,写入以下程序,实现数码管计数:
#include <reg52.h>
#include "./delay/delay.h"
#define SEGPORT P1
sbit bit_sel = P2^0;
sbit seg_sel = P2^1;
unsigned char segdata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char coode[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char outdata[8] = {0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f};
unsigned char second = 0;
unsigned char minute = 0;
unsigned char hour = 0;
void hour_seg()
{
hour++;
while(hour > 23)
{
hour = 0;
}
outdata[0] = segdata[hour/10];
outdata[1] = segdata[hour%10];
}
void minute_seg()
{
minute++;
while(minute > 59)
{
minute = 0;
hour_seg();
}
outdata[3] = segdata[minute/10];
outdata[4] = segdata[minute%10];
}
void second_seg()
{
second++;
while(second > 59)
{
second = 0;
minute_seg();
}
outdata[6] = segdata[second/10];
outdata[7] = segdata[second%10];
}
void main()
{
unsigned char i,j;
while(1)
{
for(j = 0;j<120;j++)
{
for(i = 0; i < 8; i++)
{
SEGPORT = 0xff;
bit_sel = 1;
bit_sel = 0;
SEGPORT = 0x0;
seg_sel = 1;
seg_sel = 0;
SEGPORT = coode[i];
bit_sel = 1;
bit_sel = 0;
SEGPORT = outdata[i];
seg_sel = 1;
seg_sel = 0;
delay_ms(1);
}
}
second_seg();
}
}