找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18804|回复: 30
收起左侧

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

  [复制链接]
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();
    }
}
回复

使用道具 举报

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;              //数据端口位输出模式

}
回复

使用道具 举报

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

ASK错了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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