打印
[STM32]

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

[复制链接]
3185|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
古歌|  楼主 | 2014-8-28 18:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
通过矩阵键盘输入控制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[3];

//键盘扫描子程序
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[0];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[0];break;
                               case(0x0D):KeyValue=ma3[1];break;      
                                case(0x0B):KeyValue=ma3[2];break;      
                                case(0x07):KeyScan();break;      
                        }     
                }   
        }
        k[i++]=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[0]*10.0+k[1]+k[2]/10.0+k[3]/100.0;         
        TPL0501_write(key);
        }
}
用万用表测TPL0501的电阻值时,电阻一直不稳定,按键输入后电阻显示也没有规律,,求大神指导修改

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

评论
派大星inside 2021-2-20 11:27 回复TA
请问楼主这个任务成功了吗?我也是新手,有问题想请教一下,网上找不到相关例程。。。 

相关帖子

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
古歌 + 1 很给力!
板凳
古歌|  楼主 | 2014-8-28 20:01 | 只看该作者
lnulibin 发表于 2014-8-28 19:37
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序, ...

新手刚学51两个月

使用特权

评论回复
地板
古歌|  楼主 | 2014-8-28 20:06 | 只看该作者
lnulibin 发表于 2014-8-28 19:37
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序, ...

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

使用特权

评论回复
5
古歌|  楼主 | 2014-8-28 20:07 | 只看该作者
各位高手求指导

使用特权

评论回复
6
阮天宇00| | 2014-8-28 20:26 | 只看该作者
看着这程序脑袋大~
被人带坏了

使用特权

评论回复
7
古歌|  楼主 | 2014-8-28 21:11 | 只看该作者
阮天宇00 发表于 2014-8-28 20:26
看着这程序脑袋大~
被人带坏了

:lol新手,求指导

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

24

帖子

0

粉丝