切换到宽版
  • 5645阅读
  • 10回复

[C51]采用单片机驱动TMS3450数字钟的双阴极LED屏幕 [复制链接]

上一主题 下一主题
离线mengfc
 

发帖
540
M币
3592
专家
5
粉丝
21
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2015-03-06
手头有一个80年代很流行的LED数字钟,采用TMS3450驱动,一般采用市电的50或60HZ频率作为数字钟的基准频率,走时准确度很低,也比较耗电,功能也单一,打算将其淘汰用单片机做个数码钟。但是舍不得这个90x28mm的大屏,打算将其利用一下。本来打算上网找个现成的驱动代码,但是找了半天也没有找到,只得自己写了一个,现在分享出来,请大家指教。

TMS3450数字钟的LED屏幕同普通数码管区别很大,是双阴极LED屏幕,共四个数码管,还有冒号、上午、下午等标志,例如小时的两个数码管共用6-12脚,分钟的两个数码管共用13-19脚,采用双阴极动态扫描,上午、冒号由阴极K1负责,如下图所示,下面是驱动代码:




#include <reg52.h>

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();
  }
}
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共10条打赏M币+92专家+1
离线aqxgm

发帖
6039
M币
17555
专家
161
粉丝
532
只看该作者 1楼 发表于: 2015-03-06
请登录后查看
离线lipeixian

发帖
464
M币
48
专家
1
粉丝
15
只看该作者 2楼 发表于: 2015-03-06
请登录后查看
离线hufuya687

发帖
374
M币
803
专家
1
粉丝
21
只看该作者 3楼 发表于: 2015-03-22
请登录后查看
离线mengfc

发帖
540
M币
3592
专家
5
粉丝
21
只看该作者 4楼 发表于: 2015-03-23
回 hufuya687 的帖子
请登录后查看
离线benli

发帖
33704
M币
6633
专家
91
粉丝
488
只看该作者 5楼 发表于: 2015-03-23
请登录后查看
离线shifalao

发帖
1467
M币
5065
专家
0
粉丝
16
只看该作者 6楼 发表于: 2015-03-23
请登录后查看
离线maidoo

发帖
621
M币
6805
专家
19
粉丝
84
只看该作者 7楼 发表于: 2015-11-16
请登录后查看
离线希望

发帖
17340
M币
11
专家
5
粉丝
4654
只看该作者 8楼 发表于: 2015-11-16
回 shifalao 的帖子
请登录后查看
离线shifalao

发帖
1467
M币
5065
专家
0
粉丝
16
只看该作者 9楼 发表于: 2015-11-17
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个