py-industry 发表于 2015-8-30 09:55:28

TM1629B 键盘通讯问题 求解

测试 键盘按下 数据无变化观察灯点不亮,求解!
双TM1629B 显示测试 通讯正常 见图片
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();
        delay_us(10);
   for(i=0;i<4;i++)
    {
    for(N=0;N<8;N++)
                {
                        RetDat>>=1;
                        NOP();
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        NOP();
                        if((PORTC&0x02)!=0)
                       {
                          RetDat|=0x80;
                          PORTC&=~(1<<P_LED);//观察灯//
                       }
                       else
                          {
                          RetDat&=0x7f;
                          }
                        //RetDat>>=1;
                        NOP();
                        PORTC|=(1<<CLK);
                        NOP();
                        NOP();
                        NOP();
                        NOP();                     
                }
           Key_A_buf=RetDat;
           NOP();
           RetDat=0;
        }   
        NOP();
        NOP();
        PORTC|=(1<<DIO);   
        DDRC|=(1<<DIO);   //设定为输出//
        PORTC|=(1<<ASTB);
}       

ssaiwo 发表于 2015-8-30 09:57:44

检查下时序对吗

py-industry 发表于 2015-8-30 10:00:35

ssaiwo 发表于 2015-8-30 09:57
检查下时序对吗

CLK吗? 显示通讯正常 CLK应该正常吧 还没挂示波器查看

py-industry 发表于 2015-8-30 10:48:50

求K0 K1 波形图 经示波器查看 K0 K1 无波形输出

lmt50211 发表于 2015-8-30 11:15:43

#include "main.h"

const uint8_t table_seg=
{seg00,seg01,seg02,seg03,seg04,seg05,seg06,seg07,seg08,seg09,
seg10,seg11,seg12,seg13,seg14,seg15,seg16,seg17,seg18,seg19,
seg20,seg21,seg22,seg23,seg24,seg25,seg26,seg27,seg28,seg29
};

uint8_t r_dis_buff;//显示缓存区
uint8_t r_key_buff; //按键缓存区
//====================================================================
//===us延时函数===//
void Delay_us(uint16_t byte)//100us = 750
{
    uint16_t i;
    for(i = byte;i > 0;i--)
    {
      ;
    }
}
//====================================================================
//===ms延时函数===//
void Delay_ms(uint16_t byte)//1ms = 10
{
    for(;byte > 0;byte--)
    {
      Delay_us(750);
    }
}
//====================================================================
//===发送1字节===//
void Send_Byte_Date(uint8_t change,uint8_t temp)
{
    uint8_t i;
    if(change == RESET)
    {
      Set_tstb1_L();
    }
    else
    {
      Set_tstb2_L();
    }
    for(i = 8;i >0;i--)
    {
      Set_tclk_L();
      if((temp & 0x01) == SET)
      {
            Set_tdio_H();
      }
      else
      {
            Set_tdio_L();
      }
      Set_tclk_H();
      temp >>= 1;
    }
}
//====================================================================
//===读取按键===//
void Read_Key_Date(void)
{
    uint8_t i,j;
    Set_tstb1_H();
    Set_tclk_H();
    Set_tdio_H();
    Send_Byte_Date(0,0x42);//读取按键值
    for(j = 0;j < 4;j++)
    {
      for(i = 8;i > 0;i--)
      {
            r_key_buff >>= 1;
            Set_tclk_L();
            Delay_us(100);
            Set_tclk_H();
            if(Read_KeyData() == SET)
            {
                r_key_buff |= 0x80;
            }
            else
            {
                r_key_buff &= 0x7f;
            }
      }
    }
    Set_tstb1_H();
}
//====================================================================
//===发送显示数据===//
void Send_Display_Date(uint8_t change)
{
    uint8_t j;
    if(change == RESET)
    {
      Set_tstb1_H();
    }
    else
    {
      Set_tstb2_H();
    }
    Set_tclk_H();
    Set_tdio_H();
    Send_Byte_Date(change,0x44);
    if(change == RESET)
    {
      Set_tstb1_H();
    }
    else
    {
      Set_tstb2_H();
    }
    for(j = 0;j < 16;j++)
    {
      if(change == RESET)
      {
            Send_Byte_Date(change,0xc0 + j);
            if(j >= 12)
            {
                Send_Byte_Date(change,r_dis_buff);
            }
            else
            {
                Send_Byte_Date(change,table_seg]);
            }
            Set_tstb1_H();
      }
      else
      {
            Send_Byte_Date(change,0xc0 + j);
            if((j == 4) || (j == 6))
            {
                Send_Byte_Date(change,r_dis_buff);
            }
            else
            {
                Send_Byte_Date(change,table_seg]);
            }
            Set_tstb2_H();
      }
    }
    Send_Byte_Date(change,0x89);
    if(change == RESET)
    {
      Set_tstb1_H();
    }
    else
    {
      Set_tstb2_H();
    }
}

plb83 发表于 2015-8-30 12:00:47

py-industry 发表于 2015-8-30 10:48
求K0 K1 波形图 经示波器查看 K0 K1 无波形输出

K0K1是键扫输入脚,seg引脚才是键扫输出,跟显示复用的,按键按下时键少送给K0K1,对应内部按键寄存器,MCU去寄存器取键值

py-industry 发表于 2015-8-30 12:13:01

plb83 发表于 2015-8-30 12:00
K0K1是键扫输入脚,seg引脚才是键扫输出,跟显示复用的,按键按下时键少送给K0K1,对应内部按键寄存器,M ...

TM1629B按键寄存器是哪个地址? 按前辈们的程序好像是取的是DIO的电平变化如果取内部寄存器的数据的话 应该比较好处理就是目前 我不知道数据放在TM1629B内部的哪个地址?请告知!谢谢!

py-industry 发表于 2015-8-30 12:18:02

py-industry 发表于 2015-8-30 12:13
TM1629B按键寄存器是哪个地址? 按前辈们的程序好像是取的是DIO的电平变化如果取内部寄存器的数据的话...

示波器 测试SEG脚是有波形出来的
if((PORTC&0x02)!=0)
                       {
                          RetDat|=0x80;
                          PORTC&=~(1<<P_LED);//观察灯//
                       }

DIO脚的电平变化,我的怎么样调节和压按键都点亮不了观察灯

py-industry 发表于 2015-8-30 12:18:43

void main(void )
{
uint8 i;
init_devices();
//PORTC&=~(1<<P_LED);
//PORTC|=(1<<ASTB);
init_TM1629B();
delay_ms(1000);
dis_coun=98765;   //计数器//
disdat_A=(WELD|OFF);   //LED_A 点亮数据//
disdat_B=(COUN|CUR);   //LED_B 点亮数据//
display_A();
TM1629B_Write_A(Dis_Buf_A);
delay_ms(1000);
display_B();
display_COUN();
TM1629B_Write_B(Dis_Buf_B);

while(1)
{
//dis_coun=Key_A_buf;
delay_ms(10);
SIP_READ();
//delay_ms(10);

//display_B();
//display_COUN();
//TM1629B_Write_B(Dis_Buf_B);
//delay_ms(100);


}       
}

py-industry 发表于 2015-8-30 12:20:25

键盘测试程序

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);   //设定为输入//
        PORTC=0xFD;
        DDRC=0xFD;
        NOP();
        NOP();
        delay_us(10);
   for(i=0;i<4;i++)
    {
    for(N=0;N<8;N++)
                {
                        RetDat>>=1;
                        NOP();
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        delay_us(100);
                        PORTC|=(1<<CLK);
                        NOP();
                        if((PORTC&0x02)!=0)
                       {
                          RetDat|=0x80;
                          PORTC&=~(1<<P_LED);//观察灯//
                       }
                       //else
                          //{
                          //RetDat&=0x7f;
                          //}
                        //RetDat>>=1;
                        NOP();
                        //PORTC|=(1<<CLK);
                        NOP();
                        NOP();
                        NOP();
                  delay_us(10);                  
                }
           Key_A_buf=RetDat;
           NOP();
           RetDat=0;
        }   
        NOP();
        NOP();
        PORTC|=(1<<ASTB);
        PORTC|=(1<<DIO);   
        DDRC|=(1<<DIO);   //设定为输出//
}       

void main(void )
{
uint8 i;
init_devices();
//PORTC&=~(1<<P_LED);
//PORTC|=(1<<ASTB);
init_TM1629B();
delay_ms(1000);
dis_coun=98765;   //计数器//
disdat_A=(WELD|OFF);   //LED_A 点亮数据//
disdat_B=(COUN|CUR);   //LED_B 点亮数据//
display_A();
TM1629B_Write_A(Dis_Buf_A);
delay_ms(1000);
display_B();
display_COUN();
TM1629B_Write_B(Dis_Buf_B);

while(1)
{
//dis_coun=Key_A_buf;
delay_ms(10);
SIP_READ();
//delay_ms(10);

//display_B();
//display_COUN();
//TM1629B_Write_B(Dis_Buf_B);
//delay_ms(100);


}       
}

py-industry 发表于 2015-8-30 12:24:37

M16_mcu+TM1629B键盘无反应 求解!

//ICC-AVR application builder : 2015-8-21 上午 09:43:33
// Target : M16
// Crystal: 8.0000Mhz
void port_init(void)
{
PORTA = 0xF3;
DDRA= 0x0C;
PORTB = 0xFF;
DDRB= 0xF8;
PORTC = 0xFF;
DDRC= 0xFF;
PORTD = 0x0E;
DDRD= 0xF1;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();

MCUCR = 0x00;
GICR= 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
// dis_addr=0xc0;
}
void delay_us(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--)
asm("nop");
}
void delay_1ms(void)
{
unsigned int i;
//for(i=(xtal*143-2);i>0;i--)
for(i=1142;i>0;i--)
;
}
void delay_ms(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--)
delay_1ms();
}
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);   //设定为输入//
        PORTC=0xFD;
        DDRC=0xFD;
        NOP();
        NOP();
        delay_us(10);
   for(i=0;i<4;i++)
    {
    for(N=0;N<8;N++)
                {
                        RetDat>>=1;
                        NOP();
                        PORTC&=~(1<<CLK);
                        NOP();
                        NOP();
                        delay_us(100);
                        PORTC|=(1<<CLK);
                        NOP();
                        if((PORTC&0x02)!=0)
                       {
                          RetDat|=0x80;
                          PORTC&=~(1<<P_LED);//观察灯//
                       }
                       //else
                          //{
                          //RetDat&=0x7f;
                          //}
                        //RetDat>>=1;
                        NOP();
                        //PORTC|=(1<<CLK);
                        NOP();
                        NOP();
                        NOP();
                  delay_us(10);                  
                }
           Key_A_buf=RetDat;
           NOP();
           RetDat=0;
        }   
        NOP();
        NOP();
        PORTC|=(1<<ASTB);
        PORTC|=(1<<DIO);   
        DDRC|=(1<<DIO);   //设定为输出//
}       

void main(void )
{
uint8 i;
init_devices();
//PORTC&=~(1<<P_LED);
//PORTC|=(1<<ASTB);
init_TM1629B();
delay_ms(1000);
dis_coun=98765;   //计数器//
disdat_A=(WELD|OFF);   //LED_A 点亮数据//
disdat_B=(COUN|CUR);   //LED_B 点亮数据//
display_A();
TM1629B_Write_A(Dis_Buf_A);
delay_ms(1000);
display_B();
display_COUN();
TM1629B_Write_B(Dis_Buf_B);

while(1)
{
//dis_coun=Key_A_buf;
delay_ms(10);
SIP_READ();
//delay_ms(10);

//display_B();
//display_COUN();
//TM1629B_Write_B(Dis_Buf_B);
//delay_ms(100);


}       
}

plb83 发表于 2015-8-30 12:31:47




先写命令42H,然后读取寄存器数据
注意STB的操作

duxingkei 发表于 2015-8-30 13:09:43

解决思路:
先不找自己的代码,先用别人OK的代码试试~~ 然后对比自己的代码,看到底错到哪了?
我这个是TM1623的读按键,但只读了2字节,你自己加全都1629的所有按键值然后直接调试输出或直接显示到屏上,对比下按键是否有用??



/********************************************************************
函 数 名:TMInByte()
入口参数:MCU读取1个字节
返 回 值:
***********************************************************************/
uchar TMInByte(void)
{
        uchar i,tmp;
        for(i=0;i<8;i++)
        {
                PORT_TM_SCK =0; //读按键时,由于增加101或102电容,导致PORT_TM_DO 端口上升慢,
                      //要延时一段时间才能得到稳定的端口电平,否则按键读取不到或失败
                Delay();
#if 0                                          
      Delay();
      Delay();
      Delay();
      Delay();
      Delay();
#endif          
                tmp >>=1;
                PORT_TM_SCK = 1;
               Delay();
       if(PORT_TM_DO)tmp |= 0X80;

        }
return tmp;
}



/********************************************************************
函 数 名:TMOutByte()
入口参数:MCU输出1字节
返 回 值:
***********************************************************************/
void TMOutByte(uchar OutByte)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                PORT_TM_SCK =0;
               
                if(OutByte&0x1)
                {
         PORT_TM_DI =1;
                }
      else PORT_TM_DI=0;
      
                OutByte>>=1;
               //Delay();

                PORT_TM_SCK = 1;
                Delay();

        }
}

/********************************************************************
函 数 名:TMOutByte()
入口参数:MCU输出1字节
返 回 值:
**********************************************************************
void TMOutByte(ucharOutByte)
{
       uchari=0;
        while(i <8 )
        {
                PORT_TM_SCK =0;
                if(OutByte&0x1){PORT_TM_DI =1;PORT_TM_SCK =1;}
                else { PORT_TM_DI=0;PORT_TM_SCK =1;}
                i++;
                OutByte >>=1;
        }

}
*/



/********************************************************************
函 数 名:TMReadKey()
入口参数:MCU读取键值
返 回 值:
***********************************************************************/

uchar TMReadKey()
{
    uchar tmp,KeyValue;
    //return 0;
    PORT_TM_STB = 0;
       TMOutByte(TM_KEY_READ);
        /* disenable PD0 protect bit */
        //prc2 = 1;//必须解锁 PD0端口方向寄存器的设定
    PORT_TM_DO_M = 0;//0设置端口为输入
    PORT_TM_DO = 1;
       
        Delay();
        KeyValue = TMInByte();
//LedRamMemory.LedBuf= KeyValue;
        // if(KeyValue)Beep();
    if(0xff == KeyValue)KeyValue = KEY_NO_KEY;//防止初始化时IO口获得0XFF
        KeyValue &=(0x09);//0b00001001
        tmp= TMInByte();
        // if(tmp)Beep();
    if(0xff == tmp)tmp = KEY_NO_KEY;//防止初始化时IO口获得0XFF
        tmp &=(0x09); //0b00001001
        KeyValue |=(tmp <<1);
        //if(tmp == 0xff)return;
    PORT_TM_STB = 1;

    PORT_TM_DO_M = 1;//设置端口为输出
    PORT_TM_DO = 1;       
   
   return KeyValue;
#if 0
    if(KeyValue & 2) Beep();
        else if (KeyValue &1)SysErroBeepEn = 1;
   
#endif
       


}

py-industry 发表于 2015-8-30 16:06:38

duxingkei 发表于 2015-8-30 13:09
解决思路:
先不找自己的代码,先用别人OK的代码试试~~ 然后对比自己的代码,看到底错到哪了?
我这个是TM1 ...

谢谢!其实 没几句代码 我是想 是否硬件上有没注意到的地方   我是特别使用了一个观察灯,注意 有一观察灯 ,数据有变化就很快反映到灯上来。代码显示等调通了在加入。现在最简单的都无法通过,细看你们的代码!好像也几乎无差别 无不在乎多几个和少几个NOP ,有心的话 看看我的void SIP_READ(void)问题在哪里?

谢谢你上面提到的 硬体上的注意事项!这是我目前需要的 接到最喜欢看到的!复制+粘贴成功代码似乎解决不了问题!谢谢大家!

py-industry 发表于 2015-8-30 17:19:56

duxingkei 发表于 2015-8-30 13:09
解决思路:
先不找自己的代码,先用别人OK的代码试试~~ 然后对比自己的代码,看到底错到哪了?
我这个是TM1 ...

if(0xff == KeyValue)KeyValue = KEY_NO_KEY;//防止初始化时IO口获得0XFF
      KeyValue &=(0x09);//0b 0000 1001
      tmp= TMInByte();
      // if(tmp)Beep();
    if(0xff == tmp)tmp = KEY_NO_KEY;//防止初始化时IO口获得0XFF
      tmp &=(0x09); //0b 0000 1001
      KeyValue |=(tmp <<1);
      //if(tmp == 0xff)return;

请说明:0x09(0b 0000 1001)和 KEY_NO_KEY值   谢谢!

py-industry 发表于 2015-8-30 17:37:52

py-industry 发表于 2015-8-30 17:19
if(0xff == KeyValue)KeyValue = KEY_NO_KEY;//防止初始化时IO口获得0XFF
      KeyValue &=(0x09);/ ...

DIO口设定为输入,然后是把DIO口 上拉还是下拉?也就是初始化口DIO是1还是0。设定为输出,上拉则测试到0XFF(全1),如果下拉测试到0x00(全0)

duxingkei 发表于 2015-8-30 17:53:35

if(0xff == tmp)tmp = KEY_NO_KEY;//防止初始化时IO口获得0XFF
      tmp &=(0x09); //0b 0000 1001

这个是屏蔽不需要按键的代码,你的按键具体分布在哪我不清楚,你不需要像上面那样把读到的键值屏蔽处理,直接
用 KeyValue = TMInByte();多调用几次, 都读出byte1 到byte5的键值,里面总有你需要的按键键值,按下 后对应键为1,没有按下为0

#define KEY_NO_KEY                           (0)

用下面的这个试试,时序是这样的:
哥 只能帮你到这了



/********************************************************************
函 数 名:TMReadKey()
入口参数:MCU读取键值
返 回 值:
***********************************************************************/

uchar TMReadKey()
{
    uchar tmp,KeyValue;
    //return 0;
    PORT_TM_STB = 0;
       TMOutByte(TM_KEY_READ);
        /* disenable PD0 protect bit */
        //prc2 = 1;//必须解锁 PD0端口方向寄存器的设定
    PORT_TM_DO_M = 0;//0设置端口为输入
    PORT_TM_DO = 1;//上拉
       
        //读4个字节的键值,具体怎么用,你自己使用吧
        Delay();
        KeyValue = TMInByte();
        Delay();
        KeyValue = TMInByte();
        Delay();
        KeyValue = TMInByte();
        Delay();
        KeyValue = TMInByte();

      
    PORT_TM_STB = 1;

    PORT_TM_DO_M = 1;//设置端口为输出
    PORT_TM_DO = 1;       
   
   return 0;



}

duxingkei 发表于 2015-8-30 17:58:32

你TM1629B的DIO 显示传输数据 与都按键是共用的,都键值时为上拉输入,传输命令和传输显示时为输出~~而且保证显示和读取按键不用出现打架的情况,要一步一步的运行
有示波器的话你可以单独调用读取按键的函数,屏蔽显示函数,按下按键,DIO端口看看有木有变化

py-industry 发表于 2015-8-30 18:13:27

这是好的思路 正想这样看看,这现象好像DIO无变化导致全0或全1;目前也是只是初始化的时候使用了显示,关闭初始化后挂示波器看看情况!谢谢
void main(void )
{
uint8 i;
init_devices();
//PORTC&=~(1<<P_LED);
//PORTC|=(1<<ASTB);
init_TM1629B();
delay_ms(1000);
dis_coun=98765;   //计数器//
disdat_A=(WELD|OFF);   //LED_A 点亮数据//
disdat_B=(COUN|CUR);   //LED_B 点亮数据//
display_A();
TM1629B_Write_A(Dis_Buf_A);
delay_ms(1000);
display_B();
display_COUN();
TM1629B_Write_B(Dis_Buf_B);

while(1)
{
//dis_coun=Key_A_buf;
delay_ms(10);
SIP_READ();
//delay_ms(10);

//display_B();
//display_COUN();
//TM1629B_Write_B(Dis_Buf_B);
//delay_ms(100);


}       
}

py-industry 发表于 2015-8-30 18:24:50

duxingkei 发表于 2015-8-30 17:53
if(0xff == tmp)tmp = KEY_NO_KEY;//防止初始化时IO口获得0XFF
      tmp &=(0x09); //0b 0000 1001



谢谢!时序图在规格书上看了N遍了 1、我的时序有问题2、TM1629的DIO无输出变化。

py-industry 发表于 2015-8-30 18:44:24

duxingkei 发表于 2015-8-30 17:58
你TM1629B的DIO 显示传输数据 与都按键是共用的,都键值时为上拉输入,传输命令和传输显示时为输出~~而且保 ...

按规格书来说,键盘的内容应该是XX00 XX00//B7-B0// ,正常的理解应该是 如果我的DIO上拉,TM的DIO输出正常 应该能有波形输出来,也就是说键盘寄存器的值应该不会有0XFF出现。对吧!纳闷为什么有0XFF出现?TM的DIO无输出或者干扰?

py-industry 发表于 2015-8-30 22:08:40

duxingkei 发表于 2015-8-30 17:53
if(0xff == tmp)tmp = KEY_NO_KEY;//防止初始化时IO口获得0XFF
      tmp &=(0x09); //0b 0000 1001



用你的程序修改,输出结果一样一样的{:sweat:} {:sweat:}   ,难道写命令写不进去,似乎也不是 写显示命令正常。程序不难还是无法调通。还有哪位前辈遇到类似的情况? 硬件处理需要注意哪些?第一次用TM芯片希望得到大家的帮助!

py-industry 发表于 2015-8-30 22:54:50

谁来解释这官方说明书??一头雾水!

py-industry 发表于 2015-8-31 00:15:43

感谢前辈们的帮助,键盘终于调通了!其实技术人往往忽略了自己觉得不会出问题的地方。其实问题就在眼前,不折腾到最后不反省,问题不是出现在谁的程式上,其实回过头来看自己的程式你会发现:if((PINC&0x02)!=0)和if((PORTB&0x02)!=0)的错误!错误往往都是很简单!谢谢大家!

对比显示发现可以显示键值了,后面的工作才是即主要也是最重要的。有了显示和键盘,后面的调试也许会变得好玩和有趣些,至少不像我开始一样只能设定一个观察灯来判断程式是否按我的想法运行着!

duxingkei 发表于 2015-8-31 01:03:25

啃爹的错误---

py-industry 发表于 2015-8-31 01:33:39

duxingkei 发表于 2015-8-31 01:03
啃爹的错误---

谢谢你的交流和帮助!不挂示波器我还找不到自己的错误在哪里?看到有波形输出后才恍然大悟!的确坑爹!{:handshake:} {:handshake:}
页: [1]
查看完整版本: TM1629B 键盘通讯问题 求解