打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
利用单片机和TMS3450数字钟双阴极LED屏幕制作电子钟|创意DIY
单片机制作数字钟坛里示例很多,没必要发程序代码了,但是单片机驱动双阴极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重新编辑 ]
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
单片机彩灯是怎样点亮
51单片机数码管详解
电子密码锁设计
5161AS八段一位数码管显示实验
电子爱好者DIY 自制音乐频谱(附源码)
单片机写延时程序的几种方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服