(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?
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序,都会重新被初始化。其数值只会为1,而不会增加的。应考虑周全。
SPI的写入程序从表面上看有一点小瑕疵,写入函数的末尾最好将时钟保持在高电平。防止形成错误的上升沿。(上升沿可能会引起数据串入芯片,当然片选无效也可能不会。总之,小心为妙。) lnulibin 发表于 2014-8-28 19:37 static/image/common/back.gif
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序, ...
新手刚学51两个月 lnulibin 发表于 2014-8-28 19:37 static/image/common/back.gif
按键检测及处理明显不太成熟。一次按下按键被反复处理了多次。变量i作为局部变量,每次执行键盘检测程序, ...
把i设置为全局变量i=0还会有上述问题吗? 各位高手求指导 看着这程序脑袋大~
被人带坏了 阮天宇00 发表于 2014-8-28 20:26 static/image/common/back.gif
看着这程序脑袋大~
被人带坏了
:lol新手,求指导
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]