一时半会还不能理解的内容的记录

博主在学习嵌入式过程中遇到一些理解难题,包括蜂鸣器、RTC DS1302的使用以及ADC xpt2046的读取。在LCD12864的课程中,发现Keil C51编译器可能导致复杂运算的编译错误。通过拆分代码解决了问题。同时,分享了在理解和调试ADC代码时的经验,强调了分段编写代码的益处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、蜂鸣器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的时候,没能及时发现问题点。所以,分几行写是有很多好处的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值