搜索
bottom↓
回复: 25

TM1629B 键盘通讯问题 求解

[复制链接]

出0入0汤圆

发表于 2015-8-30 09:55:28 | 显示全部楼层 |阅读模式
测试 键盘按下 数据无变化  观察灯点不亮,求解!
双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[0]=RetDat;
           NOP();
           RetDat=0;
        }   
        NOP();
        NOP();
        PORTC|=(1<<DIO);   
        DDRC|=(1<<DIO);     //设定为输出//
        PORTC|=(1<<ASTB);  
}       

本帖子中包含更多资源

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

x

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-8-30 09:57:44 | 显示全部楼层
检查下时序对吗

出0入0汤圆

 楼主| 发表于 2015-8-30 10:00:35 | 显示全部楼层
ssaiwo 发表于 2015-8-30 09:57
检查下时序对吗

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

出0入0汤圆

 楼主| 发表于 2015-8-30 10:48:50 | 显示全部楼层
求K0 K1 波形图 经示波器查看 K0 K1 无波形输出

出0入0汤圆

发表于 2015-8-30 11:15:43 | 显示全部楼层
  1. #include "main.h"

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

  7. uint8_t r_dis_buff[32];//显示缓存区
  8. uint8_t r_key_buff[4]; //按键缓存区
  9. //====================================================================
  10. //===us延时函数===//
  11. void Delay_us(uint16_t byte)//100us = 750
  12. {
  13.     uint16_t i;
  14.     for(i = byte;i > 0;i--)
  15.     {
  16.         ;
  17.     }
  18. }
  19. //====================================================================
  20. //===ms延时函数===//
  21. void Delay_ms(uint16_t byte)//1ms = 10
  22. {
  23.     for(;byte > 0;byte--)
  24.     {
  25.         Delay_us(750);
  26.     }
  27. }
  28. //====================================================================
  29. //===发送1字节===//
  30. void Send_Byte_Date(uint8_t change,uint8_t temp)
  31. {
  32.     uint8_t i;
  33.     if(change == RESET)
  34.     {
  35.         Set_tstb1_L();
  36.     }
  37.     else
  38.     {
  39.         Set_tstb2_L();
  40.     }
  41.     for(i = 8;i >0;i--)
  42.     {
  43.         Set_tclk_L();
  44.         if((temp & 0x01) == SET)
  45.         {
  46.             Set_tdio_H();
  47.         }
  48.         else
  49.         {
  50.             Set_tdio_L();
  51.         }
  52.         Set_tclk_H();
  53.         temp >>= 1;
  54.     }
  55. }
  56. //====================================================================
  57. //===读取按键===//
  58. void Read_Key_Date(void)
  59. {
  60.     uint8_t i,j;
  61.     Set_tstb1_H();
  62.     Set_tclk_H();
  63.     Set_tdio_H();
  64.     Send_Byte_Date(0,0x42);//读取按键值
  65.     for(j = 0;j < 4;j++)
  66.     {
  67.         for(i = 8;i > 0;i--)
  68.         {
  69.             r_key_buff[j] >>= 1;
  70.             Set_tclk_L();
  71.             Delay_us(100);
  72.             Set_tclk_H();
  73.             if(Read_KeyData() == SET)
  74.             {
  75.                 r_key_buff[j] |= 0x80;
  76.             }
  77.             else
  78.             {
  79.                 r_key_buff[j] &= 0x7f;
  80.             }
  81.         }
  82.     }
  83.     Set_tstb1_H();
  84. }
  85. //====================================================================
  86. //===发送显示数据===//
  87. void Send_Display_Date(uint8_t change)
  88. {
  89.     uint8_t j;
  90.     if(change == RESET)
  91.     {
  92.         Set_tstb1_H();
  93.     }
  94.     else
  95.     {
  96.         Set_tstb2_H();
  97.     }
  98.     Set_tclk_H();
  99.     Set_tdio_H();
  100.     Send_Byte_Date(change,0x44);
  101.     if(change == RESET)
  102.     {
  103.         Set_tstb1_H();
  104.     }
  105.     else
  106.     {
  107.         Set_tstb2_H();
  108.     }
  109.     for(j = 0;j < 16;j++)
  110.     {
  111.         if(change == RESET)
  112.         {
  113.             Send_Byte_Date(change,0xc0 + j);
  114.             if(j >= 12)
  115.             {
  116.                 Send_Byte_Date(change,r_dis_buff[j]);
  117.             }
  118.             else
  119.             {
  120.                 Send_Byte_Date(change,table_seg[r_dis_buff[j]]);
  121.             }
  122.             Set_tstb1_H();
  123.         }
  124.         else
  125.         {
  126.             Send_Byte_Date(change,0xc0 + j);
  127.             if((j == 4) || (j == 6))
  128.             {
  129.                 Send_Byte_Date(change,r_dis_buff[j + 16]);
  130.             }
  131.             else
  132.             {
  133.                 Send_Byte_Date(change,table_seg[r_dis_buff[j + 16]]);
  134.             }
  135.             Set_tstb2_H();
  136.         }
  137.     }
  138.     Send_Byte_Date(change,0x89);
  139.     if(change == RESET)
  140.     {
  141.         Set_tstb1_H();
  142.     }
  143.     else
  144.     {
  145.         Set_tstb2_H();
  146.     }
  147. }
复制代码

出0入0汤圆

发表于 2015-8-30 12:00:47 | 显示全部楼层
py-industry 发表于 2015-8-30 10:48
求K0 K1 波形图 经示波器查看 K0 K1 无波形输出

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 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脚的电平变化,我的怎么样调节和压按键都点亮不了观察灯

出0入0汤圆

 楼主| 发表于 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[7]=(WELD|OFF);   //LED_A 点亮数据//
disdat_B[4]=(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[0];
  delay_ms(10);
  SIP_READ();
  //delay_ms(10);
  
  //display_B();
  //display_COUN();
  //TM1629B_Write_B(Dis_Buf_B);
  //delay_ms(100);
  
  
}       
}

出0入0汤圆

 楼主| 发表于 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[0]=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[7]=(WELD|OFF);   //LED_A 点亮数据//
disdat_B[4]=(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[0];
  delay_ms(10);
  SIP_READ();
  //delay_ms(10);
  
  //display_B();
  //display_COUN();
  //TM1629B_Write_B(Dis_Buf_B);
  //delay_ms(100);
  
  
}       
}

出0入0汤圆

 楼主| 发表于 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[0]=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[7]=(WELD|OFF);   //LED_A 点亮数据//
disdat_B[4]=(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[0];
  delay_ms(10);
  SIP_READ();
  //delay_ms(10);
  
  //display_B();
  //display_COUN();
  //TM1629B_Write_B(Dis_Buf_B);
  //delay_ms(100);
  
  
}       
}

出0入0汤圆

发表于 2015-8-30 12:31:47 | 显示全部楼层



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

本帖子中包含更多资源

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

x

出0入0汤圆

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



  1. /********************************************************************
  2. 函 数 名:TMInByte()
  3. 入口参数:MCU读取1个字节
  4. 返 回 值:
  5. ***********************************************************************/
  6. uchar TMInByte(void)
  7. {
  8.         uchar i,tmp;
  9.         for(i=0;i<8;i++)
  10.         {
  11.                 PORT_TM_SCK =0; //读按键时,由于增加101  或102电容,导致PORT_TM_DO 端口上升慢,
  12.                       //要延时一段时间才能得到稳定的端口电平,否则按键读取不到或失败
  13.                 Delay();
  14. #if 0                                          
  15.       Delay();
  16.       Delay();
  17.       Delay();
  18.       Delay();
  19.       Delay();
  20. #endif          
  21.                 tmp >>=1;
  22.                 PORT_TM_SCK = 1;
  23.                  Delay();
  24.        if(PORT_TM_DO)tmp |= 0X80;

  25.         }
  26. return tmp;
  27. }



  28. /********************************************************************
  29. 函 数 名:TMOutByte()
  30. 入口参数:MCU输出1字节
  31. 返 回 值:
  32. ***********************************************************************/
  33. void TMOutByte(uchar OutByte)
  34. {
  35.         uchar i;
  36.         for(i=0;i<8;i++)
  37.         {
  38.                 PORT_TM_SCK =0;
  39.                
  40.                 if(OutByte&0x1)
  41.                 {
  42.            PORT_TM_DI =1;
  43.                 }
  44.       else PORT_TM_DI  =0;
  45.       
  46.                 OutByte>>=1;
  47.                //Delay();

  48.                 PORT_TM_SCK = 1;
  49.                 Delay();

  50.         }
  51. }

  52. /********************************************************************
  53. 函 数 名:TMOutByte()
  54. 入口参数:MCU输出1字节
  55. 返 回 值:
  56. **********************************************************************
  57. void TMOutByte(uchar  OutByte)
  58. {
  59.          uchar  i=0;
  60.         while(i <8 )
  61.         {
  62.                 PORT_TM_SCK =0;
  63.                 if(OutByte&0x1){PORT_TM_DI =1;PORT_TM_SCK =1;}
  64.                 else { PORT_TM_DI  =0;PORT_TM_SCK =1;}
  65.                 i++;
  66.                 OutByte >>=1;
  67.         }

  68. }
  69. */



  70. /********************************************************************
  71. 函 数 名:TMReadKey()
  72. 入口参数:MCU读取键值
  73. 返 回 值:
  74. ***********************************************************************/

  75. uchar TMReadKey()
  76. {
  77.     uchar tmp,KeyValue;
  78.     //return 0;
  79.     PORT_TM_STB = 0;
  80.          TMOutByte(TM_KEY_READ);
  81.         /* disenable PD0 protect bit */
  82.         //prc2 = 1;//必须解锁 PD0端口方向寄存器的设定
  83.     PORT_TM_DO_M = 0;//0设置端口为输入
  84.     PORT_TM_DO = 1;
  85.        
  86.         Delay();
  87.         KeyValue = TMInByte();
  88.   //  LedRamMemory.LedBuf[6]= KeyValue;
  89.         // if(KeyValue)Beep();
  90.     if(0xff == KeyValue)KeyValue = KEY_NO_KEY;//防止初始化时IO口获得0XFF
  91.         KeyValue &=(0x09);  //0b00001001
  92.         tmp= TMInByte();
  93.         // if(tmp)Beep();
  94.     if(0xff == tmp)tmp = KEY_NO_KEY;//防止初始化时IO口获得0XFF
  95.         tmp &=(0x09); //0b00001001
  96.         KeyValue |=(tmp <<1);
  97.         //if(tmp == 0xff)return;
  98.     PORT_TM_STB = 1;

  99.     PORT_TM_DO_M = 1;//设置端口为输出
  100.     PORT_TM_DO = 1;       
  101.    
  102.    return KeyValue;
  103. #if 0
  104.     if(KeyValue & 2) Beep();
  105.         else if (KeyValue &1)SysErroBeepEn = 1;
  106.    
  107. #endif
  108.        


  109. }
复制代码

出0入0汤圆

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

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

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

出0入0汤圆

 楼主| 发表于 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值   谢谢!

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 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)

出0入0汤圆

发表于 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)

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



  1. /********************************************************************
  2. 函 数 名:TMReadKey()
  3. 入口参数:MCU读取键值
  4. 返 回 值:
  5. ***********************************************************************/

  6. uchar TMReadKey()
  7. {
  8.     uchar tmp,KeyValue[4];
  9.     //return 0;
  10.     PORT_TM_STB = 0;
  11.          TMOutByte(TM_KEY_READ);
  12.         /* disenable PD0 protect bit */
  13.         //prc2 = 1;//必须解锁 PD0端口方向寄存器的设定
  14.     PORT_TM_DO_M = 0;//0设置端口为输入
  15.     PORT_TM_DO = 1;//上拉
  16.        
  17.         //读4个字节的键值,具体怎么用,你自己使用吧
  18.         Delay();
  19.         KeyValue[0] = TMInByte();
  20.           Delay();
  21.         KeyValue[1] = TMInByte();
  22.           Delay();
  23.         KeyValue[2] = TMInByte();
  24.           Delay();
  25.         KeyValue[3] = TMInByte();
  26.   
  27.       
  28.     PORT_TM_STB = 1;

  29.     PORT_TM_DO_M = 1;//设置端口为输出
  30.     PORT_TM_DO = 1;       
  31.    
  32.    return 0;



  33. }
复制代码

本帖子中包含更多资源

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

x

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 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[7]=(WELD|OFF);   //LED_A 点亮数据//
disdat_B[4]=(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[0];
  delay_ms(10);
  SIP_READ();
  //delay_ms(10);
  
  //display_B();
  //display_COUN();
  //TM1629B_Write_B(Dis_Buf_B);
  //delay_ms(100);
  
  
}       
}

出0入0汤圆

 楼主| 发表于 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无输出变化。

出0入0汤圆

 楼主| 发表于 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无输出或者干扰?

出0入0汤圆

 楼主| 发表于 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

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

出0入0汤圆

 楼主| 发表于 2015-8-30 22:54:50 | 显示全部楼层
谁来解释这官方说明书??一头雾水!

本帖子中包含更多资源

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

x

出0入0汤圆

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

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

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-8-31 01:03:25 来自手机 | 显示全部楼层
啃爹的错误---

出0入0汤圆

 楼主| 发表于 2015-8-31 01:33:39 | 显示全部楼层

谢谢你的交流和帮助!不挂示波器我还找不到自己的错误在哪里?看到有波形输出后才恍然大悟!的确坑爹!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 12:27

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

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