程序分为main.c+HX711.c+HX711.h+lcd12864.c+lcd12864.h
//lcd12864.h
#ifndef __lcd12864_H
#define __lcd12864_H
//---包含头文件---//
#include
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---如果使用画图模式定义这个---//
//#define LCD12864_PICTURE
//---定义使用的IO口---//
#define LCD12864_DATAPORT P0 //数据IO口
sbit LCD12864_RS = P2^6; //(数据命令)寄存器选择输入
sbit LCD12864_RW = P2^5; //液晶读/写控制
sbit LCD12864_EN = P2^7; //液晶使能控制
sbit LCD12864_PSB = P3^2; //串/并方式控制
sbit LCD12864_RST = P3^4; //复位端
//---声明全局函数---//
void LCD12864_Delay1ms(uint c);
uchar LCD12864_Busy(void);
void LCD12864_WriteCmd(uchar cmd);
void LCD12864_WriteData(uchar dat);
void LCD12864_Init();
void LCD12864_ClearScreen(void);
void LCD12864_SetWindow(uchar x, uchar y);
#endif
//lcd12864.c
#include"lcd12864.h"
/*******************************************************************************
* 函 数 名 : LCD12864_Delay1ms
* 函数功能 : 延时1MS
* 输 入 : c
* 输 出 : 无
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
uchar a,b;
for(; c>0; c--)
{
for(b=199; b>0; b--)
{
for(a=1; a>0; a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LCD12864_Busy
* 函数功能 : 检测LCD是否忙
* 输 入 : 无
* 输 出 : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
uchar i = 0;
LCD12864_RS = 0; //选择命令
LCD12864_RW = 1; //选择读取
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
while((LCD12864_DATAPORT & 0x80) == 0x80) //检测读取到的值
{
i++;
if(i > 100)
{
LCD12864_EN = 0;
return 0; //超过等待时间返回0表示失败
}
}
LCD12864_EN = 0;
return 1;
}
/*******************************************************************************
* 函 数 名 : LCD12864_WriteCmd
* 函数功能 : 写命令
* 输 入 : cmd
* 输 出 : 无
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
LCD12864_RS = 0; //选择命令
LCD12864_RW = 0; //选择写入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = cmd; //放置数据
LCD12864_EN = 1; //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 数 名 : LCD12864_WriteData
* 函数功能 : 写数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
uchar i;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return; //超过等待退出
}
}
LCD12864_RS = 1; //选择数据
LCD12864_RW = 0; //选择写入
LCD12864_EN = 0; //初始化使能端
LCD12864_DATAPORT = dat; //放置数据
LCD12864_EN = 1; //写时序
LCD12864_Delay1ms(5);
LCD12864_EN = 0;
}
/*******************************************************************************
* 函 数 名 : LCD12864_ReadData
* 函数功能 : 读取数据
* 输 入 : 无
* 输 出 : 读取到的8位数据
*******************************************************************************/
#ifdef LCD12864_PICTURE
uchar LCD12864_ReadData(void)
{
uchar i, readValue;
i = 0;
while( LCD12864_Busy() == 0)
{
LCD12864_Delay1ms(1);
i++;
if( i>100)
{
return 0; //超过等待退出
}
}
LCD12864_RS = 1; //选择命令
LCD12864_RW = 1;
LCD12864_EN = 0;
LCD12864_Delay1ms(1); //等待
LCD12864_EN = 1;
LCD12864_Delay1ms(1);
readValue = LCD12864_DATAPORT;
LCD12864_EN = 0;
return readValue;
}
#endif
/*******************************************************************************
* 函 数 名 : LCD12864_Init
* 函数功能 : 初始化LCD12864
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LCD12864_Init()
{
LCD12864_PSB = 1; //选择并行输入
LCD12864_RST = 1; //复位
LCD12864_WriteCmd(0x30); //选择基本指令操作
LCD12864_WriteCmd(0x0c); //显示开,关光标
LCD12864_WriteCmd(0x01); //清除LCD12864的显示内容
}
/*******************************************************************************
* 函 数 名 : LCD12864_ClearScreen
* 函数功能 : 在画图模式下,LCD12864的01H命令不能清屏,所以要自己写一个清
* * 屏函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
#ifdef LCD12864_PICTURE
void LCD12864_ClearScreen(void)
{
uchar i,j;
LCD12864_WriteCmd(0x34); //开启拓展指令集
for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三十二次
{
LCD12864_WriteCmd(0x80+i); //先写入纵坐标Y的值
LCD12864_WriteCmd(0x80); //再写入横坐标X的值
for(j=0;j<32;j++) //横坐标有16位,每位写入两个字节的的数据,也
{ //就写入32次以为当写入两个字节之后横坐标会自
LCD12864_WriteData(0xFF); //动加1,所以就不用再次写入地址了。
}
}
LCD12864_WriteCmd(0x36); //0x36扩展指令里面打开绘图显示
LCD12864_WriteCmd(0x30); //恢复基本指令集
}
#endif
/*******************************************************************************
* 函 数 名 : LCD12864_SetWindow
* 函数功能 : 设置在基本指令模式下设置显示坐标。注意:x是设置行,y是设置列
* 输 入 : x, y
* 输 出 : 无
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y)
{
uchar pos;
if(x == 0) // 第一行的地址是80H
{
x = 0x80;
}
else if(x == 1) //第二行的地址是90H
{
x = 0x90;
}
else if(x == 2) //第三行的地址是88H
{
x = 0x88;
}
else if(x == 3) //第三行的地址是98H
{
x = 0x98;
}
pos = x + y;
LCD12864_WriteCmd(pos);
}
//HX711.h
#ifndef _HX711_H_
#define _HX711_H_
#include "reg52.h"
#define HXNOREAD 0XFFFF
sbit ADSK=P2^0;
sbit ADDO=P2^1;
#define ADSK_LOW ADSK = 0
#define ADSK_HIGH ADSK = 1
#ifndef u32
#define u32 unsigned long
#endif
#ifndef u16
#define u16 unsigned int
#endif
#ifndef u8
#define u8 unsigned char
#endif
////////////////////去噪后的均值滤波
#define WEILINE_LEN 10 //总缓冲点数
#define CUTHEAD_LEN 3 //去极大值点数
#define CUTLAST_LEN 3 //去极小值点数
#define USEDATA_LEN (WEILINE_LEN - CUTHEAD_LEN - CUTLAST_LEN) //均值点数
////////////////////
void Read_40HzInit(void);
unsigned long ReadCount(void);
void InsertSort(u16 pushdata, u16* avedata, u16 dst[], u8 len);
u16 HxAveDataRead(void);
#endif
//HX711.c
#include "HX711.H"
#define AveNum 5
unsigned long grabuffer[AveNum];
unsigned long ReadCount(void)
{
volatile unsigned long Count;
unsigned char i;
u16 noreadcount = 0;
ADSK_LOW; //使能AD SCK置低
Count=0;
while(ADDO) //AD转换未结束则等待
{
noreadcount++;
if(noreadcount > 100)
return HXNOREAD;
}
for(i=0;i<24;i++)
{
ADSK_HIGH; //
Count=Count<<1; //
ADSK_LOW; //
if(ADDO) Count++;
}
ADSK_HIGH;
Count=Count^0x7FFFFF;
ADSK_LOW;
//////////////
ADSK_HIGH;
ADSK_LOW;
ADSK_HIGH;
ADSK_LOW;
////////////
// Base_GData_temp = Count;
Count=Count/256;
return(Count);
}
void Read_40HzInit(void)
{
unsigned char i;
ADSK_LOW; //使能AD(PD_SCK 置低)
while(ADDO); //AD转换未结束则等待,否则开始读取
for(i=0;i<27;i++)
{
ADSK_HIGH; //PD_SCK 置高(发送脉冲)
ADSK_LOW; //PD_SCK 置低
}
ADSK_HIGH;
ADSK_LOW;
}
volatile short datasbuf[WEILINE_LEN];
void InsertSort(u16 pushdata, u16* avedata, u16 dst[], u8 len)
{
u16 i, j;
u32 buf, sum = 0;
///insert
for(i = 0; i < (len-1); i++)
{
dst[i] = dst[i+1];
}
dst[len-1] = pushdata;
///sort
for(i = 0 ; i < len; i++)
datasbuf[i] = dst[i];
for(i = len-1; i > 0; i--)
{
for(j = 0; j < i; j++)
{
if(datasbuf[j] < datasbuf[j + 1])
{
buf = datasbuf[j+1];
datasbuf[j+1] = datasbuf[j];
datasbuf[j] = buf;
}
}
}
///get ave
for(i = CUTHEAD_LEN; i < (len- CUTLAST_LEN); i++)
{
sum += datasbuf[i];
}
*avedata = sum/USEDATA_LEN;
}
static u16 AveData = 0;
u16 grafifo[WEILINE_LEN];
u16 HxAveDataRead(void)
{
u16 datatemp;
datatemp = ReadCount();
if(datatemp != HXNOREAD)
{
InsertSort(datatemp, &AveData, grafifo, WEILINE_LEN);
}
return AveData;
}
//main.c
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd12864.h"
#include "HX711.H"
#ifndef u32
#define u32 unsigned long
#endif
#ifndef u16
#define u16 unsigned int
#endif
#ifndef u8
#define u8 unsigned char
#endif
sbit k8=P2^2;
u16 i=0;
unsigned char code dis1[] ="重量:g";
u8 Disp[4];
u32 Dispcz=32810;
u32 WeightData = 0;
void Delay200ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 9;
j = 104;
k = 139;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void chengzhong()
{
WeightData = ((HxAveDataRead()-Dispcz)*1.3235);
Disp[0]=WeightData%10000/1000/*+0x30*/;
Disp[1]=WeightData%10000%1000/100/*+0x30*/;
Disp[2]=WeightData%10000%1000%100/10/*+0x30*/;
Disp[3]=WeightData%10000%1000%100%10/*+0x30*/;
if(k8==0)
{
Dispcz=HxAveDataRead();
Delay200ms();
}
}
void XSCZ()
{
LCD12864_SetWindow(0, 0);
LCD12864_WriteData(dis1[0]);
LCD12864_WriteData(dis1[1]);
LCD12864_WriteData(dis1[2]);
LCD12864_WriteData(dis1[3]);
LCD12864_WriteData(dis1[4]);
LCD12864_WriteData(Disp[0]+0x30);
LCD12864_WriteData(Disp[1]+0x30);
LCD12864_WriteData(Disp[2]+0x30);
LCD12864_WriteData(Disp[3]+0x30);
LCD12864_WriteData(dis1[5]);
chengzhong(); //数据处理函数
}
void main(void)
{
k8=1;
LCD12864_Init();
while(1)
{
XSCZ();
}
}
上一篇:16*16LED点阵动态显示
下一篇:单片机粮仓温湿度控制系统
推荐阅读最新更新时间:2024-11-02 23:03
设计资源 培训 开发板 精华推荐
- 用于无传感器电机控制的 S12ZVML-MINIBRD、S12 MagniV S12ZVM 迷你板
- LTC1665IGN 微功率八通道 8 位 DAC 的典型应用
- Arduino-Uno-Rev3-XDModify
- 使用 Cypress Semiconductor 的 CY7C9689 的参考设计
- SY55858U,用于 GB 以太网交换机的模拟交换机评估板
- TS2576CM533 RN 3A、3.3V、52KHz 降压开关稳压器的典型(固定输出电压版本)应用
- TCR6DA1833U、200mA、3.3V 和 1.8V 输出电压双路输出 CMOS 低压降稳压器的典型应用
- 12V 3串 UV灯(光固化)
- NCP1403 15V/50mA PFM升压DC-DC转换器的典型升压应用电路2
- CN0143