⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 LCD显示电子计价秤方案 1. 该方案使用的传感器为20KG,灵敏度约为0.5mv/v,选用新传感器线性较好的一段(100g-15Kg),直接处理,没有做非线性修正,称重可能会有偏差. 2. 软件
💻 C
字号:
#include<def.h>	 
#define modeset				0x00			//对于TM1629无效,对于1721都配置为SEG引脚
#define	writedatamode_z		0x40			//采用地址自动加一方式写显存
#define writedatamode_g		0x44			//采用固定地址方式写显存
#define startaddress		0xc0			//起始地址
#define	readkeymode			0x42			//读按键
#define	leddisconmode		0x8a			//LED显示控制
#define	lcddisconmode		0x94			//LCD显示控制
#define datacount			0x10			//采用地址自动加一方式传输数据的个数 

uchar code  buf_led[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};	//存放共阴数码管的段代码,不带小数点
uchar code  buf_ledp[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};	//存放共阴数码管的段代码,带小数点
//money
uchar code  buf_lcd[10]= {0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED};	//存放共阴数码管的段代码,不带小数点
uchar code  buf_lcdp[10]={0xFB,0x70,0xD7,0xF5,0x7C,0xBD,0xBF,0xF0,0xFF,0xFD};	//存放共阴数码管的段代码,带小数点
//weight
//uchar code  buf_lcd[10]= {0xBE,0x06,0x7C,0x5E,0xC6,0xDA,0xFA,0x0E,0xFE,0xDE};
//uchar code  buf_lcdp[10]={0xbf,0x07,0x7d,0x5f,0xC7,0xDb,0xFb,0x0f,0xFf,0xDf};
uchar data  buf_ser[16]={0};	//存放送到LED驱动芯片显存中的值													   
//------------------------------------------------LED串行写1BYTE数据开始----------------------------------------------------------------------
void indata(char p)
{
 	unsigned int i;
 	STB=0; 			    //保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”
	for(i=0;i<8;i++)
	{
 		CLK=0;			//先将“CLK”清零
 		if((p&0x01)!=0)
    	{
			DIO=1;		//需要传送的数据的低位为“1”,则把“DIO”清零
		}
		else
		{
			DIO=0; 		//需要传送的数据的低位为“0”,则把“DIO”置高
		}
		CLK=1;			//送时钟的上升沿
 		p=p>>1;			//准备送下一个BIT
		_nop_();
		_nop_();
		_nop_();
		_nop_();
 	}					//送完一个字节后退出循环
}
//------------------------------------------------LED串行写1BYTE数据结束----------------------------------------------------------------------
#ifdef ONKEYSCAN
//------------------------------------------------LED串行读1BYTE数据开始-----------------------------------------------------------------------
//输出8BIT数据
//在时钟的上升沿通过MCU从LED驱动IC——TM16xx读数据
unsigned char outdata()
{
	unsigned char i,k=0;	//i——控制循环次数,k——临时保存读到的数据
	DIO=1;					//释放DIO为输入
	STB=0; 					//保证“STB”为低电平,程序不依赖于之前端口的状态,保证程序在实际运行中不会出现“端口迷失”
	for(i=0;i<8;i++)		
	{
		CLK=0;			    //先将“CLK”清零
		k=k>>1;
		if(DIO==0)
			{
				k=k&0x7f;	//如果“DIO”为低电平,则把k的最高位清“0”,其他各位保持不变
			}
		else
			{
				k=(k|0x80&0xff);	//如果“DIO”为高电平,则把k的最高位置“1”,其他各位保持不变
			}
		CLK=1; 		//送时钟的上升沿
	} 				//送完一个字节后退出循环
	return(k);		//返回读到的1字节数据
}
//------------------------------------------------LED串行读1BYTE数据结束-----------------------------------------------------------------------
#endif
//------------------------------------------------采用地址自动加一方式传输显示内容-------------------------------------------------------------
void ser_display_a()
{
	uint 	j;					//j——控制本次需要传多少个字节显示数据
	uchar	tempdis;
	tempdis=0;
	DIO=1;
	CLK=1;
	STB=1;						//通讯开始前通讯端口全部初始化为“1”
	indata(modeset); 			//传输模式设置命令
	STB=1;
	indata(writedatamode_z); 	//传数据设置命令,设置采用地址自动加1方式写显示数据
	STB=1;						//数据设置命令传完后需要将“STB”置“1”
	indata(startaddress);		//传起始地址
								//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
	for(j=0;j<datacount;j++)	
	{
		if((disbit==0)&&(j>5))
		{
			tempdis=(buf_ser[j]<<4)&0xf0;
			buf_ser[j]=(buf_ser[j]>>4)&0x0f;
			buf_ser[j]|=tempdis;	
		}
		indata(buf_ser[j]);		//在连续传显示的数据过程中,STB保持为0
	}
	STB=1;						//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
	if(disbit==1)
	{
		indata(leddisconmode);	//传LED显示控制命令
	}
	else
	{
		indata(lcddisconmode);	//传LCD显示控制命令
	}
	STB=1;			            //显示控制命令传完后将“STB”置“1”
}
//采用固定地址方式
void ser_display_g(uchar address,uchar disa)
{
	DIO=1;
	CLK=1;
	STB=1;						//通讯开始前通讯端口全部初始化为“1”
	indata(writedatamode_g);	//传数据设置命令,设置采用固定地址模式
	STB=1;
	indata(address);			//传显示数据对应的地址											
	indata(disa);				//保持“STB”=“0”,传1BYTE显示数据
	STB=1;						//传完显示数据后将“STB”置“1”
	if(disbit==1)
	{
		indata(leddisconmode);	//传LED显示控制命令
	}
	else
	{
		indata(lcddisconmode);	//传LCD显示控制命令
	}
	STB=1;			        	//显示控制命令传完后将“STB”置“1”
}
//------------------------------------------上电自检------------------------------------------------
void discheck()
{
	uchar disi,discyc,disdata;
	uchar tempdis,tempdisl;
	for(discyc=0;discyc<10;discyc++)
	{
		if(disbit==1)
		{
			disdata=buf_ledp[discyc];
		}
		else
		{
			disdata=buf_lcdp[discyc]; 	
		}
		DIO=1;
		CLK=1;
		STB=1;						//通讯开始前通讯端口全部初始化为“1”
		indata(writedatamode_z); 	//传数据设置命令,设置采用地址自动加1方式写显示数据
		STB=1;						//数据设置命令传完后需要将“STB”置“1”
		indata(startaddress);		//传起始地址
		
									//地址命令传完后,“STB”保持为“0”继续传需要显示的数据
		for(disi=0;disi<datacount;disi++)	
		{
			tempdis=disdata;
			if((disbit==0)&&(disi>5))
			{
				tempdis= ((disdata<<4)&0xf0);
				tempdisl=((disdata>>4)&0x0f);
				tempdis|=tempdisl;	
			}
			indata(tempdis);		//在连续传显示的数据过程中,“STB”一直保持为”0“
		}

		STB=1;						//传完所有的显示数据后(最多14BYTE)后,将“STB置“1”
		if(disbit==1)
		{
			indata(leddisconmode);	//传LED显示控制命令
		}
		else
		{
			indata(lcddisconmode);	//传LCD显示控制命令
		}
		STB=1;			            //显示控制命令传完后将“STB”置“			
		adcdata_int=adccon();		//启动ADC,采集初始数据作为每次测量的极小值
	}
	ser_display_a();				//显示内容初始化	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -