古歌 发表于 2014-8-28 18:06

(SPI)数字电位器TPL0501一直无法控制

通过矩阵键盘输入控制TPL0501的电阻值,但是一直不成功,求高手指导
#include<reg51.h>
#include<intrins.h>
#define uint   unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define GPIO_KEY P0
sbit TPL0501_DIN=P3^5;
sbit TPL0501_SCLK=P3^6;
sbit TPL0501_CS=P3^7;
unsigned char k;

//键盘扫描子程序
void KeyScan(void)
{
        int i=0;
        unsigned char n;//扫描第一行   
        GPIO_KEY=0xEF;   
        n=GPIO_KEY;   
        n&=0x0F;
        if(n!=0x0F)
        {   
                delay1ms(1);//去抖动   
                GPIO_KEY=0xEF;   
                n=GPIO_KEY;   
                n&=0x0F;   
                if(n!=0x0F)      
                {      
                        switch(n)   
                        {      
                                case (0x0E):KeyValue=0;break;      
                                case (0x0D):KeyValue=1;break;      
                                case (0x0B):KeyValue=2;break;      
                                case (0x07):KeyValue=3;break;      
                        }      
                }   
    }      
        GPIO_KEY=0xDF;//扫描第二行      
        n=GPIO_KEY;      
        n&=0x0F;
        if(n!=0x0F)   
        {      
                delay1ms(1);      
                GPIO_KEY=0xDF;      
                n=GPIO_KEY;      
                n&=0x0F;      
                if(n!=0x0F)
                {         
                        switch(n)   
                        {      
                                case(0x0E):KeyValue=4;break;      
                                case(0x0D):KeyValue=5;break;      
                                case(0x0B):KeyValue=6;break;      
                                case(0x07):KeyValue=7;break;      
                        }   
                }   
        }      
        GPIO_KEY=0xBF;//扫描第三行      
        n=GPIO_KEY;      
        n&=0x0F;
        if(n!=0x0F)   
        {      
                delay1ms(1);      
                GPIO_KEY=0xBF;      
                n=GPIO_KEY;      
                n&=0x0F;      
                if(n!=0x0F)      
                {         
                        switch(n)   
                        {      
                                case(0x0E):KeyValue=8;break;      
                                case(0x0D):KeyValue=9;break;      
                                case(0x0B):KeyValue=ma2;break;      
                                case(0x07):genzong();break;      
                        }   
                }   
        }      
        GPIO_KEY=0x7F;//扫描第四行      
        n=GPIO_KEY;      
        n&=0x0F;
        if(n!=0x0F)   
        {      
                delay1ms(1);      
                GPIO_KEY=0x7F;      
                n=GPIO_KEY;      
                n&=0x0F;      
                if(n!=0x0F)      
                {         
                        switch(n)   
                        {      
                                case(0x0E):KeyValue=ma3;break;
                               case(0x0D):KeyValue=ma3;break;      
                                case(0x0B):KeyValue=ma3;break;      
                                case(0x07):KeyScan();break;      
                        }   
                }   
        }
        k=KeyValue;
}



void TPL0501_write(uint temp)
{
        uint i,change_number;
        change_number=temp3<<2;
        TPL0501_CS=1;
      TPL0501_SCLK=0;
        TPL0501_CS=0;
        for(i=0;i<8;i++)
        {       
                _nop_();                       
                TPL0501_SCLK=0;
                _nop_();       
                TPL0501_DIN=(bit)(change_number&0x800);
                _nop_();
                _nop_();       
                _nop_();               
                change_number<<=1;
                TPL0501_SCLK=1;
                _nop_();
                _nop_();
                _nop_();       
        }
        TPL0501_SCLK=0;
      TPL0501_CS=1;

}

void main()
{
      float key;
        while(1)
        {
        key_scan();
      key=k*10.0+k+k/10.0+k/100.0;       
        TPL0501_write(key);
        }
}
用万用表测TPL0501的电阻值时,电阻一直不稳定,按键输入后电阻显示也没有规律,,求大神指导修改

或者有没有其他程序可以控制TPL0501?

lnulibin 发表于 2014-8-28 19:37

按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序,都会重新被初始化。其数值只会为1,而不会增加的。应考虑周全。
SPI的写入程序从表面上看有一点小瑕疵,写入函数的末尾最好将时钟保持在高电平。防止形成错误的上升沿。(上升沿可能会引起数据串入芯片,当然片选无效也可能不会。总之,小心为妙。)

古歌 发表于 2014-8-28 20:01

lnulibin 发表于 2014-8-28 19:37 static/image/common/back.gif
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序, ...

新手刚学51两个月

古歌 发表于 2014-8-28 20:06

lnulibin 发表于 2014-8-28 19:37 static/image/common/back.gif
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序, ...

把i设置为全局变量i=0还会有上述问题吗?

古歌 发表于 2014-8-28 20:07

各位高手求指导

阮天宇00 发表于 2014-8-28 20:26

看着这程序脑袋大~
被人带坏了

古歌 发表于 2014-8-28 21:11

阮天宇00 发表于 2014-8-28 20:26 static/image/common/back.gif
看着这程序脑袋大~
被人带坏了

:lol新手,求指导

阿源玩电子 发表于 2025-7-26 17:30


void TPL0501_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
   
    // 仅配置 CS、SCK、MOSI
    GPIO_InitStructure.GPIO_Pin = TPL0501_CS_PIN | TPL0501_SCK_PIN | TPL0501_MOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;// 根据实际需求调整速率
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;      // 上拉保证默认高电平
    GPIO_Init(GPIOC, &GPIO_InitStructure);
   
    // 初始化默认状态
    TPL0501_CS_HIGH();// 默认不选中
    TPL0501_SCK_H();    // SPI Mode 0: 时钟空闲高电平
    TPL0501_MOSI_H();   // MOSI初始高电平
}

static void SPI_WriteByte(uint8_t byte) {
    for (uint8_t i = 0; i <= 8; i++) {
                                TPL0501_MOSI_L();
      TPL0501_SCK_L();                  // 1. 时钟下降沿准备数据
      if (byte & 0x80) {TPL0501_MOSI_H();}
      else {TPL0501_MOSI_L();}
      byte <<= 1;
      TPL0501_SCK_H();                  // 2. 上升沿锁存数据

    }
}

// 完整的 TPL0501 写操作函数
void TPL0501_Write(uint8_t value) {
    TPL0501_CS_LOW();      
    SPI_WriteByte(value);
    TPL0501_CS_HIGH();   
}
页: [1]
查看完整版本: (SPI)数字电位器TPL0501一直无法控制