搜索
bottom↓
回复: 20

TM1629 官方技术手册、程序————带键盘扫描接口的LED (发光二极管显示器) 驱动控制

[复制链接]

出0入0汤圆

发表于 2012-3-1 21:36:41 | 显示全部楼层 |阅读模式
TM1629是带键盘扫描接口的LED (发光二极管显示器) 驱动控制专用电路, 内部集成有MCU 数
字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、空调 、家庭影院等
产品的高段位显示屏驱动。技术手册ourdev_723418Z922G0.pdf(文件大小:2.42M) (原文件名:TM1629_V1.0.pdf)


/*
  *开发环境:   Keil uVision3
*晶震频率:   12M
*作者:      
*完成日期:   2009-05-05
功能:        驱动共阴LED数码屏做时钟显示,可由按键控制时钟暂停,开始,停止以及其它数码管显示0-9数字,
               数码管可以由按键调节显示不同数字
*/
#include<reg52.h>
#include<intrins.h>
#define nop _nop_();
#define uchar unsigned char
#define uint  unsigned int
sbit stb =P1^0;        //定义片选通讯口
sbit clk =P1^1;        //定义时钟通讯口
sbit dio =P1^2;        //定义数据输入/输出通讯口
bdata uchar y=0;//定义可以位寻址全局变量y
sbit y7 =y^7;
uchar show[16] = {0x76,0x7b,0x38,0x38,0x3f,0x40,0x40,0x40,0x40,0x40};//初始化显示“HELLO”字符代码
uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码
uchar TIME_seconds,seconds_2,sub_1,sub_2,shi_1,shi_2; //时间寄存器,依次从秒个位至小时十位
uchar TIME_count; //定时中断控制制位
uchar T_count;   //时钟小数点闪
uchar count4;    //保存按键控制对应的数码管闪
uchar key_FLAG1;//按键标志位
uchar key_COUNT1;//按键移动数动显示数据
uchar key_LED=0;  //按键单独显示赋值寄存器
uchar count7;
/*********************************   
功能: TM1629写数据
**********************************/
void write(uchar wr_data)
{
     uchar i;
         stb =0;           //给有效的片选信号(片选信号是低电平有效)
         nop;
         nop;                 
         for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
         {
             clk =0;
                 nop;
                 nop;
             wr_data >>= 1;//移位数据,低位在前!
             nop;
             dio = CY;
             nop;
             nop;
             clk =1;
             nop;
           }
}
/*********************************  
功能:读按键子程序 由y 返回1BIT按键数据
**********************************/
unsigned char read()
{
  uchar d;
  stb = 0;          //给有效的片选信号(片选信号是低电平有效)
  dio = 1;          //将DIO置高,因为没有按键按下时,键值默认为00H,此时为了与键值有区别
  for(d=0;d<8;d++)
   {
     clk = 0;
         nop;
   if(dio==1)
     {
     y7 = 1;
         }
  else
     {
         y7 = 0;
         }
         clk = 1;
         if(d!=7){y=(y>>1);}   
         nop;
         nop;
        }
        return(y);
}                    
/*********************************
    TM1629控制指令
功能: 驱动LED屏做相应的显示
**********************************/
void xianshi(uchar show_led[16])
{
  uchar h;
  stb = 1;
  clk = 1;
  dio = 1;
  write(0x40);//写数据到显示寄存器,采用地址自动加一
  stb = 1;
  write(0xc0);//显示寄存器的00H单元开始
  for(h=0;h<16;h++)
  {   
   write(show_led[h]);//给显示寄存器送数据,
   }
   stb=1;
   write(0x8b);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
   stb = 1;
}

//-------读按键以及相应的显示处理-------
void panjian()
{
   uchar count3,key[4];
   stb = 1;
   write(0x42);//送读按键命令(42H),
   for(count3=0;count3<5;count3++)
   {
     key[count3]=read();        //读4BIT按键数据,
   }
   if((key_FLAG1 != 0x02))
   {
   if((key[0]==0x01)){key_LED= 0;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG1按键按下,数码管显示数字0
   if((key[0]==0x02)){key_LED= 1;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG1按键按下,数码管显示数字1
   if((key[0]==0x04)){key_LED= 2;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K1与SEG2按键按下,数码管显示数字2。
   if((key[0]==0x08)){key_LED= 3;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K0与SEG2按键按下,数码管显示数字3。
   if((key[0]==0x80)){key_LED= 4;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K0与SEG3按键按下,数码管显示数字4。
   if((key[0]==0x40)){key_LED= 5;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K1与SEG3按键按下,数码管显示数字5。
   if((key[0]==0x20)){key_LED= 6;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG4按键按下,数码管显示数字6。
   if((key[0]==0x10)){key_LED= 7;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG4按键按下,数码管显示数字7。
   if((key[1]==0x01)){key_LED= 8;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K3与SEG5按键按下,数码管显示数字8。
   if((key[1]==0x02)){key_LED= 9;key_FLAG1 = 0x01;show[key_COUNT1] = CODE[key_LED];} //K2与SEG5按键按下,数码管显示数字9       
        }
   if((key[1]==0x04)){key_FLAG1= 0x00; count7 = 0;}             //K1与SEG6按键按下,key_FLAG1 = 0x00启动定时器,时间开始。
   if((key[1]==0x08)){count7 = 0x01;TR0 = 0;key_FLAG1 = 0x02;} //当K0与SEG6按键按下,key_FLAG1 = 0x02单独显示数字按键无效!  暂停。
   if((key[1]==0x80))                                         // K0与SEG7按键按下,key_FLAG1 = 0x00启动定时器,时间开始。
   {
     key_FLAG1 = 0x00;
         count7 = 0;
         shi_2 = 0;
         shi_1 = 0;
         sub_2 = 0;
         sub_1 = 0;
         seconds_2 = 0;
         TIME_seconds = 0;
        }
   if((key[1] == 0x40))                           // K1与SEG7按键按下,控制数码管右移一位
    {
             show[key_COUNT1] = count4;
             key_FLAG1 = 0x01;//key_FLAG1 = 0x00关闭定时器,时间暂停。
          key_COUNT1 ++;
                if((key_COUNT1 == 10)){ key_COUNT1 = 0;}
         }         
   if((key[1] == 0x20))                   // K2与SEG7按键按下,控制数码管左移一位
    {
              show[key_COUNT1] = count4;
             key_FLAG1 = 0x01;//key_FLAG1 = 0x00关闭定时器,时间暂停。
                 if((key_COUNT1==0)){ key_COUNT1 = 10;}
          key_COUNT1 -= 1;
         }
   if((key_FLAG1 == 0x01)){ count4 = show[key_COUNT1];}        //保存当前按键位显示数据
   if((count7 != 0x01)){ key_FLAG1 = 0;}   
}
/**********************************
     定时中断函数入口
功能: 每50MS中断一次
**********************************/  
void time0(void) interrupt 1 using 2
{
  TH0=0x3c;
  TL0=0xb0;
  TIME_count++;
  if(TIME_count==21)
  {
    TIME_count = 0;
    TIME_seconds++;        // 秒寄存器加1
        T_count ^= 0x80;
   }
}
/*********************************
     时钟函数
功能: 处理时钟显示
**********************************/
void TIME_show()
{
  //sub_1 = sub_1|0x80;
  //shi_1 = shi_1|0x80;
  show[15] = CODE[TIME_seconds];// 数码屏上最后一个“8”字,依次下去
  show[14] = CODE[seconds_2];   //数码屏倒数第二个“8”字,
  show[13] = CODE[sub_1]|T_count;
  show[12] = CODE[sub_2];
  show[11] = CODE[shi_1]|T_count;
  show[10] = CODE[shi_2];
  if(TIME_seconds == 10)          //对时间数据进行处理,以免溢出。
   {
     TIME_seconds = 0;
         seconds_2+=1;
        }
  if(seconds_2 == 6)
   {
     seconds_2 = 0;
         sub_1 +=1;
        }
  if(sub_1 == 10)
   {
     sub_1 = 0;
         sub_2 +=1;
        }
  if(sub_2 == 6)                                                                                       
   {
     sub_2 = 0;
         shi_1 +=1;
    }
  if(shi_1 == 10)
   {
     shi_1 = 0;
         shi_2 +=1;
        }
  if(shi_2 == 6)          //时钟每60小时自动清0
   {
     shi_2 = 0;
         shi_1 = 0;
         sub_2 = 0;
         sub_1 = 0;
         seconds_2 = 0;
         TIME_seconds = 0;
        }
}      
/*********************************
    延时函数
功能: 1ms延时
**********************************/
void delay_ms(uchar cyc)
{
        //当将=1的时候,延时1ms
        uchar ii,jj;
        for(jj=1;jj<=cyc;jj++)
        {
                for(ii=0;ii<200;ii++)
                {
                        nop;
                }
        }
}         
/*********************************
    主函数
**********************************/
void main()
{
uchar count6;//按键按下时,所控制的位闪!
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;//初始化单片机I/O口
TMOD=0x01;  //定时器设置
TH0=0x3c;
TL0=0xb0;
IE=0x82;
TF0=1;
xianshi(show);//初始化显示“HELLO”字符
_delay_ms(230);
_delay_ms(230);
_delay_ms(230);   
_delay_ms(230);
_delay_ms(230);    //共延时1s
count4 = show[key_COUNT1];
while(1)//循环
{
  count6+=1;
  if((count6%2))
  {
    show[key_COUNT1] = count4;        //基数时,显示当位数
   }
  else
   {
     show[key_COUNT1] =0;          //偶数时,灭当位数 !  程序循环2次,闪一次。
        }
if(key_FLAG1 == 0x02){ TR0 = 0;}
if(key_FLAG1 == 0x00){ TR0 = 1;}
stb = 1;
dio = 1;
clk = 1;
TIME_show();   //控制做时钟显示
panjian();     //判断按键值
xianshi(show); //根据按键值,给显示寄存器送相应的显示数据
_delay_ms(230);//延时240ms!
if(count6 == 201){ count6 = 0;}
}
}











汇编程序,没测试过ourdev_723432VZZRCK.mht(文件大小:421K) (原文件名:CS6297(昌)芯片显示子程序.mht)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-3-1 21:53:52 | 显示全部楼层
沙发

出0入0汤圆

发表于 2012-3-1 22:39:13 | 显示全部楼层
不错,用过tm1618,tm1638,tm1629b

出0入0汤圆

发表于 2012-3-2 06:36:17 | 显示全部楼层

出0入0汤圆

发表于 2012-3-2 09:23:58 | 显示全部楼层
价格能否告知?
看性价比如何?
谢。

出0入0汤圆

发表于 2012-3-2 11:54:09 | 显示全部楼层
回复【4楼】Excellence 精益求精
-----------------------------------------------------------------------

2元左右,主要是看用量。价格不一样。

出0入0汤圆

发表于 2012-3-2 11:55:04 | 显示全部楼层
主要是QFP封装摆在那里,封装和测试价格都不低

出0入0汤圆

发表于 2012-4-27 08:49:03 | 显示全部楼层
楼主,你好,我也在用TM1629A这个芯片,用的是共阳的数码管,也是用的这个程序,但是不显示啊,STB  DIO  CLK 这三个引脚全是高电平,如有时间请加我QQ:327888317,谢谢

出0入0汤圆

发表于 2012-4-27 08:55:59 | 显示全部楼层
楼主,你好,请问TM1629和TM1638的差别在什么地方?感觉TM1638驱动共阴的比较好办,驱动共阳的就是很麻烦,也一直没有搞定共阳的,

出0入0汤圆

发表于 2012-5-2 13:52:31 | 显示全部楼层
Excellence 发表于 2012-3-2 09:23
价格能否告知?
看性价比如何?
谢。

我天微原厂的,可+Q276169465咨询。

出0入0汤圆

发表于 2012-5-2 20:44:55 | 显示全部楼层
wu_qi0613 发表于 2012-4-27 08:49
楼主,你好,我也在用TM1629A这个芯片,用的是共阳的数码管,也是用的这个程序,但是不显示啊,STB  DIO  C ...

1629A是驱动共阴屏的。共阳屏的话用1640 16*8段。你Q拒绝被添加

出0入0汤圆

发表于 2012-5-3 11:01:11 | 显示全部楼层
和1628是不是一样的?

出0入0汤圆

发表于 2012-5-3 11:13:47 | 显示全部楼层
这是一个好芯片

出0入0汤圆

发表于 2012-5-9 16:56:33 | 显示全部楼层
xiangwd 发表于 2012-5-2 20:44
1629A是驱动共阴屏的。共阳屏的话用1640 16*8段。你Q拒绝被添加

谢谢您的回复,我的问题我解决了,Tm1629A可以驱动共阳的!不过还是谢谢你!

出0入0汤圆

发表于 2014-5-21 16:32:58 | 显示全部楼层
不错啊  收留了

出0入0汤圆

发表于 2014-5-28 17:01:33 | 显示全部楼层
多謝分享,讚一個

出0入0汤圆

发表于 2015-4-1 17:11:46 | 显示全部楼层
刚好需要

出0入0汤圆

发表于 2015-4-1 17:24:28 | 显示全部楼层
xiangwd 发表于 2012-5-2 20:44
**** 作者被禁止或删除 内容自动屏蔽 ****

我用TM1629驱动15位的共阳数码管成功,TM的片子不错

出0入0汤圆

发表于 2015-4-1 17:25:14 | 显示全部楼层
fxhfxh 发表于 2012-4-27 08:55
楼主,你好,请问TM1629和TM1638的差别在什么地方?感觉TM1638驱动共阴的比较好办,驱动共阳的就是很麻烦, ...

基本兼容,就是支持的段和按键不一样而已,显示程序相互通用

出0入0汤圆

发表于 2015-8-30 09:30:42 | 显示全部楼层
键盘扫描 哪里出了问题  采样不到数据

void SIP_READ(void)
{
unsigned char N,i,RetDat=0;
  
        PORTC|=(1<<ASTB);
        PORTC|=(1<<BSTB);
        PORTC|=(1<<DIO);
        PORTC|=(1<<CLK);
    NOP();
        NOP();
        SPI_Write_A(0x42); //发送读键盘命令//        
        NOP();
        NOP();
        PORTC&=~(1<<DIO);
        DDRC&=~(1<<DIO);     //设定为输入//
        NOP();
        NOP();
        NOP();
   for(i=0;i<5;i++)
    {
    for(N=0;N<8;N++)
                {
                        NOP();
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        if((PORTC&0x02)!=0)
                         {
                          RetDat|=0x80;
                          PORTC&=~(1<<P_LED);  //观察灯//
                         }
                         else
                          {
                          RetDat&=0x7f;
                          }
                        RetDat>>=1;
                        NOP();
                        PORTC|=(1<<CLK);
                        NOP();
                        NOP();
                        NOP();                       
                }
           Key_A_buf[0]=RetDat;
           NOP();
        }   
        NOP();
        NOP();
        PORTC|=(1<<DIO);   
        DDRC|=(1<<DIO);     //设定为输出//
        PORTC|=(1<<ASTB);  
}       

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-8-30 09:32:29 | 显示全部楼层
for(i=0;i<4;i++)
    {
    for(N=0;N<8;N++)
                {
                        NOP();
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        if((PORTC&0x02)!=0)
                         {
                          RetDat|=0x80;
                          PORTC&=~(1<<P_LED);  //观察灯//
                         }
                         else
                          {
                          RetDat&=0x7f;
                          }
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-6 19:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表