找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18965|回复: 30
打印 上一主题 下一主题
收起左侧

TM1650模块单片机源程序(子函数)

  [复制链接]
跳转到指定楼层
楼主
TM1650模块子函数,欢迎下载测试应用. 取之于网络,分享给大家

单片机源程序如下:
  1. #include<STC12C5A.h>
  2. #include"tm1650.h"
  3. void Delay_us(uint i) //us延时
  4. {
  5.         for(;i>0;i--)
  6.         {
  7.         _nop_();
  8. //        _nop_();
  9. //        _nop_();
  10.         }
  11. }
  12. void I2CStart(void)        //开始信号
  13. {
  14.         CLK_H;
  15.         DIO_H;
  16.         Delay_us(5);
  17.         DIO_L;
  18.         
  19. }

  20. void I2Cask(void) //ACK信号
  21. {
  22.         uchar timeout = 1;
  23.         CLK_H;
  24.         Delay_us(5);
  25.         CLK_L;
  26.         while((DIO)&&(timeout<=100))
  27.         {
  28.           timeout++;        
  29.         }
  30.         Delay_us(5);
  31.         CLK_L;
  32. }

  33. void I2CStop(void) //停止信号
  34. {
  35.         CLK_H;
  36.         DIO_L;
  37.         Delay_us(5);
  38.         DIO_H;
  39. }

  40. void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后
  41. {
  42.         uchar i;
  43.         CLK_L;
  44.         Delay_us(1);
  45.         for(i=0;i<8;i++)
  46.         {        
  47.                 oneByte = oneByte<<1;
  48.                 DIO = CY;
  49.                 CLK_L;
  50.                 Delay_us(5);
  51.                 CLK_H;
  52.                 Delay_us(5);
  53.                 CLK_L;
  54.         }
  55. }

  56. uchar Scan_Key(void)          // 按键扫描
  57. {
  58.         uchar i;
  59.         uchar rekey;
  60.         I2CStart();
  61.         I2CWrByte(0x49);//读按键命令
  62.         I2Cask();
  63.         //DIO_H;
  64.         for(i=0;i<8;i++)
  65.         {
  66.            CLK_H;
  67.            rekey = rekey<<1;
  68.            if(DIO)
  69.            {
  70.                    rekey++;
  71.            }
  72.            Delay_us(5);
  73.            CLK_L;        
  74.         }
  75.         I2Cask();
  76.         I2CStop();
  77.         return(rekey);
  78. }


  79. void TM1650_Set(uchar add,uchar dat) //数码管显示
  80. {
  81.         //写显存必须从高地址开始写
  82.         I2CStart();
  83.         I2CWrByte(add); //第一个显存地址
  84.         I2Cask();
  85.         I2CWrByte(dat);
  86.         I2Cask();
  87.         I2CStop();
  88. }
复制代码

所有资料51hei提供下载:
TM1650.rar (1.01 KB, 下载次数: 584)


评分

参与人数 2黑币 +55 收起 理由
supermcu8 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏19 分享淘帖 顶3 踩
回复

使用道具 举报

来自 2#
ID:386669 发表于 2020-8-1 16:42 | 只看该作者
正在看规格书写1650的程序,还没有拿到板子上面测试。看了样例程序,对于有的师兄说按键扫描没有反应,可能是有的单片机的端口输入和输出状态要单独设定,而样例里面的单片机可能是不用设定的。
我这边看规格书的时候也有个疑问,按键读取的时候,只有一个字节,又不区分地址,怎么能读取28个按键呢?
问了代理,说是晚上回复。
回复

使用道具 举报

板凳
ID:39626 发表于 2018-9-17 20:12 | 只看该作者
这个程序不错,找了好久总算找到合适的方案了
回复

使用道具 举报

地板
ID:289967 发表于 2018-10-22 15:02 | 只看该作者
我想问一下,我用赛元的MCU驱动的这个芯片,为什么按键扫描的时候按键没有任何反应呢
回复

使用道具 举报

5#
ID:106045 发表于 2018-11-28 16:35 | 只看该作者
谢谢了
回复

使用道具 举报

6#
ID:310569 发表于 2018-12-21 21:17 | 只看该作者
下来看看是否适合
回复

使用道具 举报

7#
ID:461792 发表于 2019-1-4 14:50 | 只看该作者
请问,这个是pic的还是51的,我是个新手  求指教呀
回复

使用道具 举报

8#
ID:374174 发表于 2019-4-25 20:22 | 只看该作者
谢了!
回复

使用道具 举报

9#
ID:314601 发表于 2019-4-30 13:06 | 只看该作者
主函数部分没有吗     主要是按键扫描判断       有点搞不懂
回复

使用道具 举报

10#
ID:314601 发表于 2019-4-30 13:06 | 只看该作者
安静的麻瓜 发表于 2019-1-4 14:50
请问,这个是pic的还是51的,我是个新手  求指教呀

51的升级版   也属于51
回复

使用道具 举报

11#
ID:486481 发表于 2019-5-17 16:55 | 只看该作者
谢谢了
回复

使用道具 举报

12#
ID:493236 发表于 2019-5-27 14:53 | 只看该作者
很好,但是没有黑币了、、、
回复

使用道具 举报

13#
ID:479519 发表于 2019-7-3 13:12 | 只看该作者
!好东西
回复

使用道具 举报

14#
ID:295805 发表于 2019-7-26 16:05 | 只看该作者
谢楼主分享了。学习学习
回复

使用道具 举报

15#
ID:636445 发表于 2019-11-6 08:31 | 只看该作者
谢谢了
回复

使用道具 举报

16#
ID:263951 发表于 2020-1-11 20:40 | 只看该作者
liuzhengduo16 发表于 2018-10-22 15:02
我想问一下,我用赛元的MCU驱动的这个芯片,为什么按键扫描的时候按键没有任何反应呢

你的问题解决了吗,我也要碰上SC的单片机,不能读按键
回复

使用道具 举报

17#
ID:242109 发表于 2020-5-18 10:31 | 只看该作者
请问这款蕊片需要用户主动扫描吗?还是写入数据后,蕊片自动刷新?
回复

使用道具 举报

18#
ID:791173 发表于 2020-6-27 22:30 | 只看该作者
正在找这个内容,多谢楼主;
回复

使用道具 举报

19#
ID:386669 发表于 2020-8-1 17:53 | 只看该作者
fox1357 发表于 2020-8-1 16:42
正在看规格书写1650的程序,还没有拿到板子上面测试。看了样例程序,对于有的师兄说按键扫描没有反应,可能 ...

我大概明白了,这个芯片无法判断两个按键,0-255只需要返回一个值,就代表某一个具体按键。
回复

使用道具 举报

20#
ID:828202 发表于 2020-10-11 11:22 | 只看该作者
程序 ACK 是错的  试了好久键盘读不出键值 最后发现询问SDA下拉提前了一个脉冲
uchar BL = 2;          //亮度等级
uchar CODE[11] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff}; //0~9显示代码
                   // 0    1    2    3    4    5    6    7    8    9   a


void TM1650(uchar B1,uchar B2, uchar B3 ,uchar B4)
{
    uchar temp[5],temp1[5];
    uchar i;
    temp[1] = B1;
    temp[2] = B2;
    temp[3] = B3;
    temp[4] = B4;
    temp1[1]=temp[1] ;
    temp1[2]=temp[2] ;
    temp1[3]=temp[3] ;
    temp1[4]=temp[4] ;
    for( i=1 ; i < 5 ; i++ )
    {
        if (temp[i] == 97)
        {
           temp1[i] = 10;
        }   
    }
    Set1650(0x48,(BL*16+0x01));     //打开显示 调节灰度
    Set1650(0x68, CODE[temp1[1]]);//数码管显示
    Set1650(0x6a, CODE[temp1[2]]);//数码管显示
    Set1650(0x6c, CODE[temp1[3]]);//数码管显示
    Set1650(0x6e, CODE[temp1[4]]);//数码管显示
}

/******************************************************************************
* 函 数 名: InitTM1650(void)
* 函数功能: 初始化TM1650
* 入口函数: 无
* 返   回:  无
*******************************************************************************/
void InitTM1650(void)
{
    TRI_CLK = 0; //设置端口位输出模式
    TRI_DAT = 0; //设置端口位输出模式
    WPUA |= 0x20; //设置 RA5 RA4弱上拉
    Set1650(0x48,(BL*16+0x01));//设定亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显
                               //如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示
}

/******************************************************************************
* 函 数 名: Set1650(uchar add,uchar dat)
* 函数功能: 按键扫描   写显存必须从高地址开始写
* 入口函数: add 地址  dat 数据
* 返   回:  无
*******************************************************************************/
void Set1650(uchar add,uchar dat)//数码管显示
{                                                         
    Start1650();     //开始   
    WrByte1650(add); //第一个显存地址
    Ask1650();
    WrByte1650(dat); //第一个显示数据
    Ask1650();
    Stop1650();      //停止
}

/******************************************************************************
* 函 数 名: Scan_Key(void)
* 函数功能: 按键扫描
* 入口函数: 无
* 返   回:  rekey 按键扫描结果
*******************************************************************************/
uchar Scan_Key(void) // 按键扫描
{
    uchar i;
    uchar rekey;
    Start1650();              //开始
    WrByte1650(0x49);         //读按键命令
    Ask1650();                //ASK
    //DIO = 1 ;
    TRI_DAT = 1;              //数据端口位输入模式
    Delay_us(1);
    for(i=0;i<8;i++)
    {  
        CLK = 1;
        rekey = rekey<<1;
        if(DIO)
        {
            rekey++;
        }
        Delay_us(5);
        CLK = 0;   
        Delay_us(1);
    }
    TRI_DAT = 0;              //数据端口位输出模式
    Ask1650();               //ASK
    Stop1650();              //停止
    return(rekey);
}

/******************************************************************************
* 函 数 名: WrByte1650(uchar oneByte)
* 函数功能: 写一个字节
* 入口函数: oneByte 要写入的字节
* 返   回:  无
*******************************************************************************/
void WrByte1650(uchar oneByte)//写一个字节 高位在前,低位在后
{
    uchar i;
    CLK = 0;
    Delay_us(5);
    for(i=0;i<8;i++)
    {
        oneByte = oneByte<<1;
        DIO = nC ;                      //进位标志 溢出1 空位0
        CLK = 0;
        Delay_us(5);
        CLK = 1;
        Delay_us(5);
        CLK = 0;
    }
}

/******************************************************************************
* 函 数 名: Stop1650(void)
* 函数功能: 停止信号
* 入口函数: 无
* 返   回:  无
*******************************************************************************/
void Stop1650(void)//停止信号
{
    CLK = 1;
    DIO = 0;
    Delay_us(5);
    DIO = 1;         
}

/******************************************************************************
* 函 数 名: Ask1650(void)
* 函数功能: ACK信号
* 入口函数: 无
* 返   回:  无
*******************************************************************************/
void Ask1650(void)//ACK信号
{
    int timeout = 1;
    TRI_DAT = 1;              //数据端口位输入模式
    Delay_us(5);
     while((DIO)&&(timeout<=300))  //延时等待反馈信号
    {
        timeout++;
    }
    CLK = 1;
    Delay_us(5);
    CLK = 0;
    TRI_DAT = 0;              //数据端口位输出模式

}


/******************************************************************************
* 函 数 名: Start1650(void)
* 函数功能: 开始信号
* 入口函数: 无
* 返   回:  无
*******************************************************************************/
void Start1650(void)//开始信号
{
    CLK = 1;
    DIO = 1;
    Delay_us(5);
    DIO = 0;
}

/******************************************************************************
* 函 数 名: Delay_us(uint i)
* 函数功能: us延时
* 入口函数: i 延时长度
* 返   回:  无
*******************************************************************************/
void Delay_us(uint i)//us延时
{
    for(;i>0;i--)
    {
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
    }
}
回复

使用道具 举报

21#
ID:828202 发表于 2020-10-11 11:24 | 只看该作者
fox1357 发表于 2020-8-1 16:42
正在看规格书写1650的程序,还没有拿到板子上面测试。看了样例程序,对于有的师兄说按键扫描没有反应,可能 ...

ASK 是错的  试试我改的
/******************************************************************************
* 函 数 名: Ask1650(void)
* 函数功能: ACK信号
* 入口函数: 无
* 返   回:  无
*******************************************************************************/
void Ask1650(void)//ACK信号
{
    int timeout = 1;
    TRI_DAT = 1;              //数据端口位输入模式
    Delay_us(5);
     while((DIO)&&(timeout<=300))  //延时等待反馈信号
    {
        timeout++;
    }
    CLK = 1;
    Delay_us(5);
    CLK = 0;
    TRI_DAT = 0;              //数据端口位输出模式

}
回复

使用道具 举报

22#
ID:828202 发表于 2020-10-11 11:25 | 只看该作者
liuzhengduo16 发表于 2018-10-22 15:02
我想问一下,我用赛元的MCU驱动的这个芯片,为什么按键扫描的时候按键没有任何反应呢

ASK错了
回复

使用道具 举报

23#
ID:316803 发表于 2020-11-10 17:12 | 只看该作者
雪城 发表于 2020-10-11 11:24
ASK 是错的  试试我改的
/************************************************************************* ...

TRI_DAT = 1;              //数据端口位输入模式
TRI_DAT = 0;              //数据端口位输出模式

这个数据端口位,在吗定义的?
回复

使用道具 举报

24#
ID:217038 发表于 2020-11-15 14:58 | 只看该作者
这个程序不错,参考下
回复

使用道具 举报

25#
ID:951099 发表于 2021-8-6 10:32 | 只看该作者
DIO = CY;  cy是什么
回复

使用道具 举报

26#
ID:818864 发表于 2021-11-11 16:03 | 只看该作者
本帖最后由 什么都不懂啊 于 2021-11-11 19:07 编辑
shupeiyu 发表于 2021-8-6 10:32
DIO = CY;  cy是什么
这是单片机头文件里面定义的一个数
sbit  CY                 =     PSW^7;
回复

使用道具 举报

27#
ID:412814 发表于 2022-1-15 08:58 | 只看该作者
挺好的资料,学习了,谢谢楼主
回复

使用道具 举报

28#
ID:101990 发表于 2022-1-18 21:12 | 只看该作者
学习一下!不错的例程
回复

使用道具 举报

29#
ID:884711 发表于 2022-8-30 15:29 | 只看该作者
哪位高手把四位数码管分离成28个LED,用于分别指示28个按键的执行情况可好
回复

使用道具 举报

30#
ID:59884 发表于 2023-8-18 10:02 | 只看该作者
haide1998 发表于 2022-8-30 15:29
哪位高手把四位数码管分离成28个LED,用于分别指示28个按键的执行情况可好

如果我没有理解错,这个玩意用的是串行信号,对应地址的存储单元位,对应着一个LED.对应关系IC说明书可查。唯一要弄明白的就是,串行信号的传输规则。
回复

使用道具 举报

31#
ID:427868 发表于 2023-8-26 21:33 | 只看该作者
对比新旧版本规格书,发现旧版本TM1650的读按键命令是0x49,而新版本的命令则是0x4F。新版本不能读按键的可以修改一下试试(旧版本批号首位位是1,新版本批号首位是2).
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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