单片机制作数字钟坛里示例很多,没必要发程序代码了,但是单片机驱动双阴极LED屏幕,我找了半天也没有找到,只得自己写了一个,现在分享出来,请大家指教。
TMS3450数字钟的LED屏幕同普通数码管区别很大,是双阴极LED屏幕,共四个数码管,还有冒号、上午、下午等标志,例如小时的两个数码管共用6-12脚,分钟的两个数码管共用13-19脚,采用双阴极动态扫描,上午、冒号由阴极K1负责,如下图所示,下面是驱动代码:
图片:108_1822464_581fad5043e122b.jpg
#include
sbit LED4B2K_K1_PIN = P3^6;
sbit LED4B2K_K2_PIN = P3^7;
#define LED4B2K_SetHourSeg(dat) P1 = dat
#define LED4B2K_SetMinuteSeg(dat) P2 = dat
#define LED4B2K_EnableK1() { LED4B2K_K2_PIN = 0; LED4B2K_K1_PIN = 1; }
#define LED4B2K_EnableK2() { LED4B2K_K1_PIN = 0; LED4B2K_K2_PIN = 1; }
//小时高位为0时消隐显示,将原本显示数字0的小时高位共阴1的0x06和共阴2的0x0D码表都改为0
code unsigned char DispCode11[10] = {0x00,0x00,0x06,0x06,0x00,0x06,0x06,0x02,0x06,0x06}; //小时高位共阴1
code unsigned char DispCode12[10] = {0x00,0x09,0x07,0x0B,0x0B,0x0A,0x0E,0x09,0x0F,0x0B}; //小时高位共阴2
code unsigned char DispCode21[10] = {0x68,0x00,0x38,0x30,0x50,0x70,0x78,0x00,0x78,0x70}; //小时低位共阴1
code unsigned char DispCode22[10] = {0x70,0x30,0x50,0x70,0x30,0x60,0x60,0x70,0x70,0x70}; //小时低位共阴2
code unsigned char DispCode31[10] = {0x07,0x06,0x03,0x07,0x06,0x05,0x05,0x07,0x07,0x07}; //分钟高位共阴1
code unsigned char DispCode32[10] = {0x0D,0x00,0x0E,0x06,0x03,0x07,0x0F,0x00,0x0F,0x07}; //分钟高位共阴2
code unsigned char DispCode41[10] = {0x68,0x00,0x38,0x30,0x50,0x70,0x78,0x00,0x78,0x70}; //分钟低位共阴1
code unsigned char DispCode42[10] = {0x70,0x30,0x50,0x70,0x30,0x60,0x60,0x70,0x70,0x70}; //分钟低位共阴2
void Display(unsigned char hour, unsigned char minute, unsigned char isSecond, unsigned char isFirst)
{
unsigned char hour1, hour2, minute1, minute2, seghour1, seghour2, segminute1, segminute2;
hour1 = hour >> 4;
hour2 = hour & 0x0F;
minute1 = minute >> 4;
minute2 = minute & 0x0F;
seghour1 = DispCode11[hour1] | DispCode21[hour2];
seghour2 = DispCode12[hour1] | DispCode22[hour2];
segminute1 = DispCode31[minute1] | DispCode41[minute2];
segminute2 = DispCode32[minute1] | DispCode42[minute2];
if(isSecond) segminute1 |= 0x80;
if(isFirst)
{
LED4B2K_SetHourSeg(seghour1);
LED4B2K_SetMinuteSeg(segminute1);
LED4B2K_EnableK1();
}
else
{
LED4B2K_SetHourSeg(seghour2);
LED4B2K_SetMinuteSeg(segminute2);
LED4B2K_EnableK2();
}
}
#define Delay10ms() { unsigned int iDelay = 1250; while(--iDelay); }
void main(void)
{
bit isFirst = 1, isSecond = 0;
unsigned char hour = 0x12;
unsigned char minute = 0x34;
unsigned char count = 0;
while(1)
{
if(++count == 50) //秒闪烁
{
count = 0;
isSecond = !isSecond;
}
isFirst = !isFirst; //分别扫描K1和K2
Display(hour, minute, isSecond, isFirst);
Delay10ms();
}
}
[ 此帖被mengfc在2015-03-10 11:52重新编辑 ]
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。