0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32設(shè)計(jì)的數(shù)字電子秤

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-18 11:04 ? 次閱讀

1. 項(xiàng)目介紹

稱(chēng)重計(jì)量是現(xiàn)在社會(huì)活動(dòng)中不可缺少的部分,隨著國(guó)際交流的發(fā)展,稱(chēng)重計(jì)量的國(guó)際間的統(tǒng)一顯得越來(lái)越重要。

電子稱(chēng)重技術(shù)是現(xiàn)代稱(chēng)重計(jì)量和控制系統(tǒng)工程的重要基礎(chǔ)之一。近年來(lái),隨著現(xiàn)代科技進(jìn)步,電子稱(chēng)重技術(shù)取得了突飛猛進(jìn)的發(fā)展,電子秤在計(jì)量領(lǐng)域中也占有越來(lái)越重要的地位。尤其是商用電子衡器,以其準(zhǔn)確度高、反應(yīng)靈敏、性能穩(wěn)定、結(jié)構(gòu)簡(jiǎn)單、環(huán)境適應(yīng)性強(qiáng)、便于與電子計(jì)算機(jī)結(jié)合而實(shí)現(xiàn)稱(chēng)重計(jì)量與過(guò)程控制自動(dòng)化等特點(diǎn),而被廣泛用于工商貿(mào)易、能源交通、冶金礦山、輕工食品、醫(yī)藥衛(wèi)生、航空航天等領(lǐng)域。

電子秤的工作原理首先是通過(guò)稱(chēng)重傳感器采集到被測(cè)物體的重量并將其轉(zhuǎn)換成電壓信號(hào),輸出電壓信號(hào)通常很小,需要通過(guò)前端信號(hào)處理電路進(jìn)行準(zhǔn)確的線(xiàn)性放大。放大后的模擬電壓信號(hào)經(jīng)A/D轉(zhuǎn)換電路轉(zhuǎn)換成數(shù)字量,被送入到主控電路的單片機(jī)中,再經(jīng)過(guò)單片機(jī)控制OLED顯示屏,從而顯示出被測(cè)物體的重量,在實(shí)際應(yīng)用中為提高數(shù)據(jù)采集的精度,并盡量減少外界電氣干擾還需要在傳感器與A/D芯片之間加上信號(hào)調(diào)理電路。

當(dāng)前項(xiàng)目是采用采用STM32+稱(chēng)重模塊+OLED實(shí)現(xiàn)了簡(jiǎn)單的電子秤項(xiàng)目,稱(chēng)重模塊上采用24位的ADC芯片,精度較高。實(shí)現(xiàn)了稱(chēng)重,校準(zhǔn)、去皮等功能。

硬件介紹:

MCU:STM32F103ZET6,只要是STM32F1X系列本工程代碼都通用的。

稱(chēng)重模塊: 淘寶購(gòu)買(mǎi)的稱(chēng)重模塊

OLED: SPI接口的0.96寸OLED屏,采用的是中景園電子的OLED屏。

完整工程下載地址: https://download.csdn.net/download/xiaolong1126626497/63993934

視頻演示地址: https://live.csdn.net/v/182608

項(xiàng)目運(yùn)行效果:

poYBAGKEYiWAXNK9AAbRt-lYS4w171.pngpYYBAGKEYiaAfAP4AAg8Jz6QyY0191.pngpoYBAGKEYieAWbF1AAZ9MajUoI8504.png

2. 項(xiàng)目實(shí)現(xiàn)

2.1 稱(chēng)重傳感器

稱(chēng)重傳感器就是一個(gè)壓力傳感器,其又叫做懸臂梁壓力傳感器。安裝時(shí)需要一端固定,另一端受力。其內(nèi)部有四個(gè)應(yīng)變電阻片,共同組成了一個(gè)電橋,當(dāng)受力端施加壓力時(shí),傳感器殼體會(huì)發(fā)生形變,從而影響應(yīng)變電阻片的阻值。

下面是稱(chēng)重傳感器的原理圖:

pYYBAGKEYieAGSYyAAGcOKx2_wo963.png

稱(chēng)重傳感器實(shí)物圖:

稱(chēng)重傳感

poYBAGKEYiiAQh0VAAQgJZ7YTBo045.png

器是采用 CS1237 作為轉(zhuǎn)換芯片,用于把微小的電壓信號(hào)轉(zhuǎn)換為具有 24 位精度的數(shù)字信號(hào)。模塊信號(hào)輸入端可以接受差分信號(hào),內(nèi)部具有可編程運(yùn)算放大器用于放大輸入端的弱小信號(hào)。模塊內(nèi)置溫度傳感器,可粗略估計(jì)周?chē)鷾囟取DK可用于多種工業(yè)過(guò)程控制場(chǎng)合,比如電子秤,血液計(jì),智能變換器等。

CS1237中有1路ADC,集成了1路差分輸入,信號(hào)輸入可以是差分輸入信號(hào)AINP、AINN,也可以是溫度傳感器的輸出信號(hào),輸入信號(hào)的切換由寄存器(ch_sel[1:0])控制。

CS1237是采用2線(xiàn)SPI串行通信,通過(guò)SCLK和DRDY/DOUT可以實(shí)現(xiàn)數(shù)據(jù)的接收以及功能配置。

實(shí)現(xiàn)代碼如下:

#include "ADC-CS1237.h"


static long AD_Res_Last=0;																		//上一輪的ADC數(shù)值保存
/*
定義CS1237使用的GPIO口
CLK   PB14    時(shí)鐘線(xiàn)
OUT   PB15    數(shù)據(jù)輸出線(xiàn)
*/
void CS1237_GPIO_INIT(void)
{
	RCC->APB2ENR |= 0x01 << 3;    											//打開(kāi)PB口
	
	GPIOB->CRH &= 0xF0FFFFFF;														//寄存器清零
	GPIOB->CRH |= 0x03000000;														//通用推挽輸出 50MHz
	GPIOB->ODR |= 1<< 14;																//拉高CLK電平
}

void CS1237_DRDY(void)																//配置PB15為輸入
{
	GPIOB->CRH &= 0x0FFFFFFF;														//寄存器清零
	GPIOB->CRH |= 0x80000000;														//上下拉輸入模式
}


void CS1237_DOUT(void)																//配置PB15為輸出
{
	GPIOB->CRH &= 0x0FFFFFFF;														//寄存器清零
	GPIOB->CRH |= 0x30000000;														//通用推挽輸出 50MHz
}



//CS1237進(jìn)入低功耗模式
void CS1237_Power_Down(void)
{
	CLK_HIGH
	delay_us(200);                											//CLK上拉時(shí)間應(yīng)超過(guò)100us,恢復(fù)后下拉時(shí)間至少10us
}
//配置CS1237芯片
void Con_CS1237(void)
{
	u8 i;
	u8 dat;
	u8 count_i=0;																				//溢出計(jì)時(shí)器
	dat = CS_CON;																				// 0100 1000
	CS1237_DOUT();
	OUT_HIGH
	delay_ms(310);																			//上電建立時(shí)間
	CS1237_DRDY();																			//配置PB15為輸入	
	CLK_LOW																							//時(shí)鐘拉低
	while(INT)																					//芯片準(zhǔn)備好數(shù)據(jù)輸出  時(shí)鐘已經(jīng)為0,數(shù)據(jù)也需要等CS1237全部拉低為0才算都準(zhǔn)備好
	{
		printf("123\r\n");
		delay_ms(100);																		//10HZ下轉(zhuǎn)換時(shí)間是100ms
		count_i++;
		if(count_i > 150)
		{
			CLK_HIGH;
			CS1237_DOUT();
			OUT_HIGH
			return;																					//超時(shí),則直接退出程序
		}
	}
	for(i=0;i<29;i++)																	  // 1 - 29
	{
		One_CLK;
	}
	CS1237_DOUT();
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//30
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//31
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//32
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//33
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//34
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//35
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//36
	One_CLK;																						//37     寫(xiě)入了0x65
	for(i=0;i<8;i++)																		// 38 - 45個(gè)脈沖了,寫(xiě)8位數(shù)據(jù)
	{
		CLK_HIGH;
		delay_us(6);
		if(dat&0x80)
			OUT_HIGH
		else
			OUT_LOW
		dat <<= 1;
		CLK_LOW;
		delay_us(6);
	}
	CS1237_DRDY();
	One_CLK;												//46個(gè)脈沖拉高數(shù)據(jù)引腳
}

//讀取芯片的配置數(shù)據(jù)
u8 Read_CON(void)
{
	u8 i;
	u8 dat=0;												//讀取到的數(shù)據(jù)
	u8 count_i=0;										//溢出計(jì)時(shí)器
	CS1237_DOUT();
	OUT_HIGH
	CS1237_DRDY();									//配置PB15為輸入	
	CLK_LOW													//時(shí)鐘拉低
	while(INT)											//芯片準(zhǔn)備好數(shù)據(jù)輸出  時(shí)鐘已經(jīng)為0,數(shù)據(jù)也需要等CS1237全部拉低為0才算都準(zhǔn)備好
	{
		delay_ms(100);
		count_i++;
		if(count_i > 150)
		{
			CLK_HIGH;
			CS1237_DOUT();
			OUT_HIGH;
			return 1;										//超時(shí),則直接退出程序
		}
	}
	for(i=0;i<29;i++)								// 1 - 29
	{
		One_CLK;
	}
	CS1237_DOUT();
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//30
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);//31
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//32
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);//33
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//34
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//35
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);//36
	One_CLK;//37     寫(xiě)入了0x56
	CS1237_DRDY();
	dat=0;
	for(i=0;i<8;i++)											// 38 - 45個(gè)脈沖了,讀取數(shù)據(jù)
	{
		One_CLK;
		dat <<= 1;
		if(INT)
			dat++;
	}
	One_CLK;															//46個(gè)脈沖拉高數(shù)據(jù)引腳
	return dat;
}

//讀取ADC數(shù)據(jù),返回的是一個(gè)有符號(hào)數(shù)據(jù)
long Read_CS1237(void)
{
	u8 i;
	long dat=0;														//讀取到的數(shù)據(jù)
	u16 count_i=0;												//溢出計(jì)時(shí)器
	CS1237_DOUT();
	OUT_HIGH															//等待模擬輸入信號(hào)建立
	CLK_LOW;															//時(shí)鐘拉低
	CS1237_DRDY();
	while(INT)														//芯片準(zhǔn)備好數(shù)據(jù)輸出  時(shí)鐘已經(jīng)為0,數(shù)據(jù)也需要等CS1237拉低為0才算都準(zhǔn)備好
	{
//		printf("等待1\r\n");
		delay_ms(10);
		count_i++;
		if(count_i > 300)
		{
			CLK_HIGH;
			CS1237_DOUT();
			OUT_HIGH;
			return 0;													//超時(shí),則直接退出程序
		}
	}
	CS1237_DOUT();
	OUT_HIGH															//端口鎖存1,
	CS1237_DRDY();
	dat=0;
	for(i=0;i<24;i++)											//獲取24位有效轉(zhuǎn)換
	{
		CLK_HIGH;
		delay_us(6);
		dat <<= 1;
		if(INT)
			dat ++;
		CLK_LOW;
		delay_us(6);	
	}
	for(i=0;i<3;i++)											//一共輸入27個(gè)脈沖
	{
		One_CLK;
	}
	CS1237_DOUT();
	OUT_HIGH;
	//先根據(jù)宏定義里面的有效位,丟棄一些數(shù)據(jù)
	i = 24 - ADC_Bit;//i表示將要丟棄的位數(shù)
	dat >>= i;//丟棄多余的位數(shù)
	return dat;
}

//初始化ADC相關(guān)參數(shù)
int Init_CS1237(void)
{
	Con_CS1237();//配置CS1237
	if(Read_CON() != CS_CON)//如果讀取的ADC配置出錯(cuò),則重啟
	{
		printf("讀取錯(cuò)誤\r\n");
		return 0;
	}
	delay_us(10000);
	AD_Res_Last = Read_CS1237();
	AD_Res_Last = Read_CS1237();
	AD_Res_Last = Read_CS1237();
	return 0;
}

//數(shù)字一階濾波器 濾波系數(shù)A,小于1。上一次數(shù)值B,本次數(shù)值C out = b*A + C*(1-A)
//下面這個(gè)程序負(fù)責(zé)讀取出最終ADC數(shù)據(jù)
long Read_18Bit_AD(void)   //18位的
{
	float out,c;
	
	out = AD_Res_Last;
	c = Read_CS1237();
	if(c!=0) // 讀到正確數(shù)據(jù)
	{
		out = out*Lv_Bo + c*(1-Lv_Bo);
		AD_Res_Last = out;//把這次的計(jì)算結(jié)果放到全局變量里面保護(hù)
	}
	return AD_Res_Last;
}

2.2 OLED顯示屏

OLED顯示屏是0.96寸 SPI接口顯示屏,采用SSD1306驅(qū)動(dòng),兼容3.3V或5V電源輸入,非常常見(jiàn),淘寶一搜一大堆,當(dāng)前選擇的是中景園電子的OLED顯示屏。

在調(diào)試設(shè)備或者測(cè)試數(shù)據(jù)時(shí),有時(shí)候需要實(shí)時(shí)觀(guān)察數(shù)據(jù)的變化,加入顯示屏可以把觀(guān)察設(shè)備的運(yùn)行情況,數(shù)據(jù)變化等。在成本和難易程度上,OLED顯示屏是非常適合初學(xué)者去學(xué)習(xí)與應(yīng)用的。

OLED視頻實(shí)物圖:

pYYBAGKEYiiAJIP_AAIk2oLpFfY242.png

示例代碼:

#include "OLED.H"
#include "oled_font.h"

/*
定義OLED使用的GPIO口
D0   PA5    時(shí)鐘線(xiàn)	
D1   PA1    數(shù)據(jù)輸出線(xiàn)
RES  PA2    復(fù)位線(xiàn)
DC   PA3    數(shù)據(jù)/命令選擇線(xiàn)
CS   PA4    片選線(xiàn)
*/

void OLED_GPIO_INIT(void)
{
	RCC->APB2ENR |= 1<<2;       //打開(kāi)PA口
	GPIOA->CRL &= 0xFF00000F;	//寄存器清零
	GPIOA->CRL |= 0x00333330;  //通用推挽輸出 50MHz
	GPIOA->ODR |=0x003E;
}

void OLED_Init(void)
{
	OLED_GPIO_INIT();	//GPIO口初始化
 
	OLED_RES_HIGH;
	delay_ms(100);
	OLED_RES_LOW;
	delay_ms(200);								//延遲,由于單片機(jī)上電初始化比OLED快,所以必須加上延遲,等待OLED上電初始化完成
	OLED_RES_HIGH;
	delay_ms(200);

	OLED_WR_Byte(0xAE,OLED_CMD);	//關(guān)閉顯示
	OLED_WR_Byte(0x2e,OLED_CMD);	//關(guān)閉滾動(dòng)

	OLED_WR_Byte(0x00,OLED_CMD);	//設(shè)置低列地址
	OLED_WR_Byte(0x10,OLED_CMD);	//設(shè)置高列地址
	OLED_WR_Byte(0x40,OLED_CMD);	//設(shè)置起始行地址
	OLED_WR_Byte(0xB0,OLED_CMD);	//設(shè)置頁(yè)地址

	OLED_WR_Byte(0x81,OLED_CMD);	// 對(duì)比度設(shè)置,可設(shè)置亮度
	OLED_WR_Byte(0xFF,OLED_CMD);	//  265  

	OLED_WR_Byte(0xA1,OLED_CMD);	//設(shè)置段(SEG)的起始映射地址;column的127地址是SEG0的地址
	OLED_WR_Byte(0xA6,OLED_CMD);	//正常顯示;0xa7逆顯示

	OLED_WR_Byte(0xA8,OLED_CMD);	//設(shè)置驅(qū)動(dòng)路數(shù)
	OLED_WR_Byte(0x3F,OLED_CMD);	//1/64duty
	
	OLED_WR_Byte(0xC8,OLED_CMD);	//重映射模式,COM[N-1]~COM0掃描

	OLED_WR_Byte(0xD3,OLED_CMD);	//設(shè)置顯示偏移
	OLED_WR_Byte(0x00,OLED_CMD);	//無(wú)偏移
	
	OLED_WR_Byte(0xD5,OLED_CMD);	//設(shè)置震蕩器分頻(默認(rèn))
	OLED_WR_Byte(0x80,OLED_CMD);	
	
	OLED_WR_Byte(0xD8,OLED_CMD);	//設(shè)置 area color mode off(沒(méi)有)
	OLED_WR_Byte(0x05,OLED_CMD);
	
	OLED_WR_Byte(0xD6,OLED_CMD);	//放大顯示
	OLED_WR_Byte(0x00,OLED_CMD);
	
	OLED_WR_Byte(0xD9,OLED_CMD);	//設(shè)置 Pre-Charge Period(默認(rèn))
	OLED_WR_Byte(0xF1,OLED_CMD);
	
	OLED_WR_Byte(0xDA,OLED_CMD);	//設(shè)置 com pin configuartion(默認(rèn))
	OLED_WR_Byte(0x12,OLED_CMD);
	
	OLED_WR_Byte(0xDB,OLED_CMD);	//設(shè)置 Vcomh,可調(diào)節(jié)亮度(默認(rèn))
	OLED_WR_Byte(0x30,OLED_CMD);
	
	OLED_WR_Byte(0x8D,OLED_CMD);	//設(shè)置OLED電荷泵
	OLED_WR_Byte(0x14,OLED_CMD);	//開(kāi)顯示
	
	OLED_WR_Byte(0xA4,OLED_CMD);	// Disable Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);	// Disable Inverse Display On (0xa6/a7) 
	
	OLED_WR_Byte(0xAF,OLED_CMD);	//開(kāi)啟OLED面板顯示
	OLED_Clear();	//清屏
	OLED_Set_Pos(0,0); 	 //畫(huà)點(diǎn)
}

void OLED_Write_Byte(u8 data)
{
	u8 i;	//定義變量
	for(i = 0; i < 8; i++)	//循環(huán)8次
	{
		OLED_D0_LOW		//將時(shí)鐘線(xiàn)拉低
		delay_us(1);	//延遲		
		if(data & 0x80)	//數(shù)據(jù)從高位-->低位依次發(fā)送
			OLED_D1_HIGH	//數(shù)據(jù)為為1
		else
			OLED_D1_LOW	//數(shù)據(jù)位為0		
		data <<= 1;	//數(shù)據(jù)左移1位
		OLED_D0_HIGH	//時(shí)鐘線(xiàn)拉高,把數(shù)據(jù)發(fā)送出去
		delay_us(1);	//延遲
	}
	
}


/*
	@brief			對(duì)OLED寫(xiě)入一個(gè)字節(jié)
	@param			dat:數(shù)據(jù)
					cmd:1,寫(xiě)誒數(shù)據(jù);0,寫(xiě)入命令
	@retval			無(wú)
 */
void OLED_WR_Byte(u8 dat,u8 cmd)
{
	if(cmd)  //如果cmd為高,則發(fā)送的是數(shù)據(jù)
		OLED_DC_HIGH	//將DC拉高
	else    //如果cmd為低,則發(fā)送的是命令
		OLED_DC_LOW	//將DC拉低
		
	OLED_CS_LOW; //片選拉低,選通器件
		
	OLED_Write_Byte(dat); //發(fā)送數(shù)據(jù)
		
	OLED_CS_HIGH //片選拉高,關(guān)閉器件 
	OLED_DC_HIGH //DC拉高,空閑時(shí)為高電平
}


/*
	@brief			設(shè)置數(shù)據(jù)寫(xiě)入的起始行、列
	@param			x: 列的起始低地址與起始高地址;0x00~0x0f:設(shè)置起始列低地址(在頁(yè)尋址模式);
						0x10~0x1f:設(shè)置起始列高地址(在頁(yè)尋址模式)
					y:起始頁(yè)地址 0~7
	@retval			無(wú)
 */
void OLED_Set_Pos(u8 x, u8 y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);//寫(xiě)入頁(yè)地址
	OLED_WR_Byte((x&0x0f),OLED_CMD);  //寫(xiě)入列的地址  低半字節(jié)
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//寫(xiě)入列的地址 高半字節(jié)
}   	     	  


/*
	@brief			開(kāi)顯示
	@param			無(wú)
	@retval			無(wú)
 */ 
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //設(shè)置OLED電荷泵
	OLED_WR_Byte(0X14,OLED_CMD);  //使能,開(kāi)
	OLED_WR_Byte(0XAF,OLED_CMD);  //開(kāi)顯示
}

/*
	@brief			OLED滾屏函數(shù),范圍0~1頁(yè),水平向左
	@param			無(wú)
	@retval			無(wú)
 */	
void OLED_Scroll(void)
{
	OLED_WR_Byte(0x2E,OLED_CMD);	//關(guān)閉滾動(dòng)
	OLED_WR_Byte(0x27,OLED_CMD);	//水平向左滾動(dòng)
	OLED_WR_Byte(0x00,OLED_CMD);	//虛擬字節(jié)
	OLED_WR_Byte(0x00,OLED_CMD);	//起始頁(yè) 0
	OLED_WR_Byte(0x00,OLED_CMD);	//滾動(dòng)時(shí)間間隔
	OLED_WR_Byte(0x01,OLED_CMD);	//終止頁(yè) 1
	OLED_WR_Byte(0x00,OLED_CMD);	//虛擬字節(jié)
	OLED_WR_Byte(0xFF,OLED_CMD);	//虛擬字節(jié)
	OLED_WR_Byte(0x2F,OLED_CMD);	//開(kāi)啟滾動(dòng)
}

/*
	@brief			關(guān)顯示
	@param			無(wú)
	@retval			無(wú)
 */  
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0XAE,OLED_CMD);  //關(guān)顯示
	OLED_WR_Byte(0X8D,OLED_CMD);  //設(shè)置OLED電荷泵
	OLED_WR_Byte(0X10,OLED_CMD);  //失能,關(guān)
}		   			 


/*
	@brief			清屏
	@param			無(wú)
	@retval			無(wú)
 */	  
void OLED_Clear(void)  
{  
	u8 i,n;		    //定義變量
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //從0~7頁(yè)依次寫(xiě)入
		OLED_WR_Byte (0x00,OLED_CMD);      //列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //列高地址  
		for(n=0;n<128;n++)
		{
			OLED_WR_Byte(0,OLED_DATA); //寫(xiě)入 0 清屏
		}
	}
}


/*
	@brief			顯示一個(gè)字符
	@param			x:起始列
					y:起始頁(yè),SIZE = 16占兩頁(yè);SIZE = 12占1頁(yè)
					chr:字符
	@retval			無(wú)
 */
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{      	
	u8 c=0,i=0;	
	c=chr-' '; //獲取字符的偏移量	
	if(x>Max_Column-1){x=0;y=y+2;} //如果列數(shù)超出了范圍,就從下2頁(yè)的第0列開(kāi)始

	if(SIZE ==16) 					//字符大小如果為 16 = 8*16
		{
			OLED_Set_Pos(x,y);	//從x y 開(kāi)始畫(huà)點(diǎn)
			for(i=0;i<8;i++)  	//循環(huán)8次 占8列
			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); //找出字符 c 的數(shù)組位置,先在第一頁(yè)把列畫(huà)完
			OLED_Set_Pos(x,y+1); //頁(yè)數(shù)加1
			for(i=0;i<8;i++)  //循環(huán)8次
			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); //把第二頁(yè)的列數(shù)畫(huà)完
		}
	else 	//字符大小為 6 = 6*8
		{	
			OLED_Set_Pos(x,y+1); //一頁(yè)就可以畫(huà)完
			for(i=0;i<6;i++) //循環(huán)6次 ,占6列
			OLED_WR_Byte(F6x8[c][i],OLED_DATA); //把字符畫(huà)完
		}
}


/*
	@brief			計(jì)算m^n
	@param			m:輸入的一個(gè)數(shù)
					n:輸入數(shù)的次方
	@retval			result:一個(gè)數(shù)的n次方
 */
u16 oled_pow(u8 m,u8 n)
{
	u16 result=1;	 
	while(n--)result*=m;    
	return result;
}				  


/*
	@brief			在指定的位置,顯示一個(gè)指定長(zhǎng)度大小的數(shù)
	@param			x:起始列
					y:起始頁(yè)
					num:數(shù)字
					len:數(shù)字的長(zhǎng)度
					size:顯示數(shù)字的大小
	@retval			無(wú)
 */		  
void OLED_ShowNum(u8 x,u8 y,u16 num,u16 len,u16 size)
{         	
	u8 t,temp;  															//定義變量
	u8 enshow=0;															//定義變量

	for(t=0;t=128){x=0;y+=2;} //如果x大于等于128,切換頁(yè),從該頁(yè)的第一列顯示
		j++; //下一個(gè)字符
	}
}


/*
	@brief			顯示中文
	@param			x:起始列;一個(gè)字體占16列
					y:起始頁(yè);一個(gè)字體占兩頁(yè)
					no:字體的序號(hào)
	@retval			無(wú)
 */
void OLED_ShowCHinese(u8 x,u8 y,u8 no,u8 w,u8 h)
{      			    
	u8 t,k,addr0=(h/8)*no; //定義變量
  for(k=0;k;t++)>

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10849

    瀏覽量

    353887
  • 電子秤
    +關(guān)注

    關(guān)注

    23

    文章

    210

    瀏覽量

    44219
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)字電子秤電路圖

    數(shù)字電子秤電路圖
    發(fā)表于 04-02 09:39 ?8951次閱讀
    <b class='flag-5'>數(shù)字</b>式<b class='flag-5'>電子秤</b>電路圖

    無(wú)線(xiàn)吊,無(wú)線(xiàn)傳輸?shù)?b class='flag-5'>電子秤解決方案

    轉(zhuǎn)換為計(jì)算機(jī)能識(shí)別的數(shù)字量,計(jì)算機(jī)運(yùn)行計(jì)算后,將物件名稱(chēng)、重量、價(jià)格等等在顯示屏上顯示出來(lái),同時(shí)也可打印出單據(jù)。無(wú)線(xiàn)傳輸?shù)?b class='flag-5'>電子秤可以不用RS485等有線(xiàn)裝置與總部聯(lián)系,直接經(jīng)無(wú)線(xiàn)方式與總部聯(lián)絡(luò),將每天
    發(fā)表于 01-14 10:14

    電子秤程序

    看了很多電子秤的程序,但就是不懂它的設(shè)置什么的,比如電子秤的稱(chēng)重范圍的設(shè)計(jì)?……求路過(guò)的各位大仙指導(dǎo),感激不盡。
    發(fā)表于 04-18 12:17

    簡(jiǎn)易電子秤

    本帖最后由 soen 于 2016-10-11 15:01 編輯 2016電子設(shè)計(jì)大賽G(電阻應(yīng)變片)基于stm32 c8t6的12864液晶顯示電子秤
    發(fā)表于 07-30 03:08

    模擬電子技術(shù)基礎(chǔ)教材+數(shù)字電子秤資料合集

    單片機(jī)設(shè)計(jì)的數(shù)字電子秤資料合集主要內(nèi)容包括了:程序,proteus仿真,原理圖,模擬電子技術(shù)基礎(chǔ)電子教材,數(shù)字
    發(fā)表于 12-12 17:41

    電子秤開(kāi)發(fā)

    我有一個(gè)項(xiàng)目要用到電子秤,電子秤的使用環(huán)境有振動(dòng)同時(shí)精度要求比較高,不知哪位大神有更好的建議。
    發(fā)表于 11-15 00:55

    簡(jiǎn)易電子秤

    本帖最后由 東隅遇桑榆 于 2021-7-9 18:49 編輯 基于CC2540單片機(jī)的簡(jiǎn)易電子秤:隨著微電子技術(shù)的應(yīng)用,電子秤的出現(xiàn)迅速得到了人們的青睞。相比傳統(tǒng)的機(jī)械式稱(chēng)量工具,電子
    發(fā)表于 07-09 18:46

    如何利用stm32去做電子秤?

    如何利用stm32去做電子秤
    發(fā)表于 11-25 08:08

    電子秤

    電子秤 電子秤
    發(fā)表于 09-23 15:12 ?2503次閱讀
    <b class='flag-5'>電子秤</b>

    數(shù)字電子秤課程設(shè)計(jì)

    數(shù)字電子秤課程設(shè)計(jì),有圖,有內(nèi)容啊, 希望對(duì)大家有用
    發(fā)表于 01-14 17:09 ?110次下載

    電子秤 完結(jié)版

    課程設(shè)計(jì)簡(jiǎn)易電子秤芯片:stm32c8
    發(fā)表于 12-09 16:33 ?0次下載

    電子秤仿真圖

    基于單片機(jī)的數(shù)字電子秤
    發(fā)表于 03-19 11:47 ?56次下載

    基于stm32電子秤方案大全(二款stm32電子秤設(shè)計(jì)方案)

     電子秤(英文名:electronic balance)是衡器的一種,是利用胡克定律或力的杠桿平衡原理測(cè)定物體質(zhì)量的工具。按結(jié)構(gòu)原理可分為機(jī)械、電子秤、機(jī)電結(jié)合三大類(lèi)。
    發(fā)表于 01-29 12:05 ?3.4w次閱讀

    如何選購(gòu)電子秤

    吊鉤人們?cè)谌コ匈?gòu)買(mǎi)蔬菜水果的時(shí)候都會(huì)看到工作人員使用電子秤來(lái)給商品稱(chēng)重,所以在一般人的印象中,電子秤就是臺(tái)秤,而不同類(lèi)型的電子秤之間的最大差別就是設(shè)備的大小不同。其實(shí)現(xiàn)在
    發(fā)表于 03-27 11:18 ?2455次閱讀

    基于STM32的智能電子秤設(shè)計(jì)

    一.硬件方案本設(shè)計(jì)是一款基于STM32單片機(jī)的電子秤系統(tǒng),隨著科學(xué)技術(shù)的不斷發(fā)展,傳統(tǒng)的機(jī)械逐漸被電子秤所取代,相比于計(jì)量不精確,費(fèi)時(shí)費(fèi)力的機(jī)械
    發(fā)表于 01-13 10:57 ?81次下載
    基于<b class='flag-5'>STM32</b>的智能<b class='flag-5'>電子秤</b>設(shè)計(jì)