一、蜂鸣器3,没理解。
二、RTC DS1302 中的2、3点,目前还不知道为什么。(应该算是解决了,2020-12-15)
在学LCD12864时,在1.17.16 这节课中,老师在调试时,就发现如下代码运行不了:
Lcd7565_WritedCmd(0x10 + (x >> 4) & 0x0f);
但如果 ,把复杂的运算提取出来,如下操作,代码运行是Ok的:
x1 = (x >> 4) & 0x0f;
Lcd7565_WritedCmd(0x10 + x1);
所以,这应该是Keil c51这个编译器不够高级,导致编译时出错导致的。
三、关于ADC xpt2046 读取数值的代码,一时学看不懂。(已学会,2020-12-2)
时序图如下:
官方及我的代码如下:
unsigned int dat = 0;
for(i=0; i<12; i++) //接收12位数据
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
//这是我的代码
// dat = DOUT;
// CLK = 1;
// CLK = 0;
// dat = 1 << dat;
}
已解决主要是我的代码中:dat = DOUT;
应该是dat = DOUT | dat;
官方写的代码比较乱,我这样的初学者看得云里雾里的。下面是官方的代码:
#include"XPT2046.h"
/****************************************************************************
*函数名:SPI_Write
*输 入:dat:写入数据
*输 出:无
*功 能:使用SPI写入数据
****************************************************************************/
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7; //放置最高位
dat <<= 1;
CLK = 0; //上升沿放置数据
CLK = 1;
}
}
/****************************************************************************
*函数名:SPI_Read
*输 入:无
*输 出:dat:读取 到的数据
*功 能:使用SPI读取数据
****************************************************************************/
uint SPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++) //接收12位数据
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
/****************************************************************************
*函数名:Read_AD_Data
*输 入:cmd:读取的X或者Y
*输 出:endValue:最终信号处理后返回的值
*功 能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6; i>0; i--); //延时等待转换结果
CLK = 1; //发送一个时钟周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
下面是自己写的代码:
sbit DOUT = P1^0; //输出
sbit CLK = P1^3; //时钟
sbit DIN = P1^1; //输入
sbit CS = P1^2; //片选
unsigned int read_adc_data(unsigned char config_addr)
{
unsigned char i = 0;
unsigned int ad_value = 0;
CLK = 0;
CS = 0; //使能芯片
for(i=0; i<8; i++)
{
DIN = config_addr >> 7; //放置最高位
config_addr <<= 1;
CLK = 1; //上升沿放置数据
CLK = 0;
}
for(i=6; i>0; i--); //延时等待转换结果
for(i=0; i<12; i++)
{
ad_value = DOUT | ad_value; //读取高位
ad_value <<= 1;
CLK = 1; //上升沿读取数据
CLK = 0;
}
CS = 1; //结束使能
return ad_value;
}
在学习的过程中,发现个特点:关于计算,老师一般不会在一行代码里写太长的语句,而是分好几行。我在写代码的时候,可能受到之前别的老师的影响,写的比较长,由于自己还不熟练,以至于debug的时候,没能及时发现问题点。所以,分几行写是有很多好处的。