HT1622 驱动程

news/2025/1/9 9:46:01/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_CS = P1^0;		//端口还没按原理图改过来,应为p0^0~p0^3;
sbit LCD_RD = P1^1;
sbit LCD_WR = P1^2;
sbit LCD_DATA = P1^3;
/
//------------------------------------------------------------------------------
//Subroutine Declare
//------------------------------------------------------------------------------
void Delay2us(uchar);
void Delay100us(uchar);
void Delay1ms(uchar);
void Delay10ms(uchar);
void Delay100ms(uchar);//==============================================================================
//Subroutine:	Delay2us
//==============================================================================
void Delay2us(uchar Counter)
{while (--Counter);
}//==============================================================================
//Subroutine:	Delay100us
//==============================================================================
void Delay100us(uchar Counter)
{while (Counter--){Delay2us(150);}
}//==============================================================================
//Subroutine:	Delay1ms
//==============================================================================
void Delay1ms(uchar Counter)
{while (Counter--){Delay100us(11);}
}//==============================================================================
//Subroutine:	Delay10ms
//==============================================================================
void Delay10ms(uchar Counter)
{while (Counter--){Delay1ms(11);}
}//==============================================================================
//Subroutine:	Delay100ms
//==============================================================================
void Delay100ms(uchar Counter)
{while (Counter--){Delay1ms(101);}
}///
void SendBit(bit SENT_BIT)	   //发送一位数据
{//LCD_CS=0;LCD_DATA=SENT_BIT;LCD_WR=0;Delay2us(1);//delay100ns(2);LCD_WR=1;//LCD_CS=1;
}
void SendData(uchar dat,uchar CNT)	 //发送数据
{uchar i;for (i=0;i<CNT;i++){SendBit(dat&0x01);dat=dat>>1;}
}
void SendAddr(uchar addr ,uchar CNT)   //发送地址
{uchar i;for (i=0;i<CNT;i++){SendBit(addr&0x80);addr<<=1;}
}
void LCD_Write_Command(uchar CMD)		 //写命令
{LCD_CS=0;SendAddr(0x80,3);SendAddr(CMD,9);					 //A5 A4 A3 A2 A1 A0LCD_CS=1;
}
void LCD_Write_Data(uchar addr ,uchar DAT)	 //写数据
{LCD_CS=0;SendAddr(0xA0,3);SendAddr(addr<<2,6);   		   		 //A5 A4 A3 A2 A1 A0SendData(DAT,4);					  //D0 D1 D2 D3LCD_CS=1;
}
void LCD_Init()							//初始化
{LCD_Write_Command(0x01);		     //SYS ENLCD_Write_Command(0x29);		     //set bias 1/3LCD_Write_Command(0x18);			 //on-chip RC oscillatorLCD_Write_Command(0x01);			 //SYS ENLCD_Write_Command(0x03);			 //dispaly on
}
void display(uchar dat)					//0x00清空
{uchar i;uchar address=0;for (i=0;i<255;i++){LCD_Write_Data(address,dat);address++;}
}status=0xffff;
从左到右 分别对应0~15
//void SetSunLightStatus(uint status)
//{
//	bit leve=0;
//	uint i=0;
//	uchar addr=1;
//	uchar storge=44;
//	// Delay100ms(3);
//
//	for(i=0;i<16;i++)
//	{
//	    if(i%4==0)
//		addr=1;
//		if(i>=0&&i<<4)
//			storge=44;
//		if(i>=4&&i<<8)
//			storge=45;
//		if(i>=8&&i<12)
//			storge=40;
//		if(i>=12&&i<16)
//			storge=41;
//	   leve=status&0x8000;
//	   status<<=1;
//	   if(leve==1)
//	   {
//
//		  LCD_Write_Data(storge,addr);
//
//		  Delay1ms(25);//时间函数要改
//
//	   }
//	      if(i==3)
//		  {
//		  	  	LCD_Write_Data(44,0x00);
//
//		  }
//		  if(i==7)
//		  {
//
//		  		LCD_Write_Data(45,0x00);
//		  }
//          if(i==11)
//		  {
//		  		 LCD_Write_Data(40,0x00);
//
//		  }
//		  if(i==15)
//		  {
//		  		 LCD_Write_Data(41,0x00);
//
//		  }
//	   addr<<=1;
//	   leve=0;
//
//	}
//}void SetSunLightStatus(uint status)
{bit leve=0;	 //高低电平判断uchar val=0;  //记录一个单元地址的总值uchar temp=0;uchar addr=1;uint i=0;for (i=0;i<16;i++){leve=status&0x8000;status<<=1;if (leve==1){val+=addr;addr<<=1;}else{addr<<=1;}leve=0;if ((i+1)%4==0)	  //所有变量重新初始化,以便继续下一个单元的计算{temp=val;addr=1;val=0;}if (i==3){LCD_Write_Data(44,temp);temp=0;}if (i==7){LCD_Write_Data(45,temp);temp=0;}if (i==11){LCD_Write_Data(40,temp);temp=0;}if (i==15){LCD_Write_Data(41,temp);temp=0;}}
}
void SetSoarXLightStatus(uint status)
{bit leve=0;	 //高低电平判断uchar val=0;  //记录一个单元地址的总值uchar temp=0;uchar addr=1;uint i=0;for (i=0;i<16;i++){leve=status&0x8000;status<<=1;if (leve==1){val+=addr;addr<<=1;}else{addr<<=1;}leve=0;if ((i+1)%4==0)	  //所有变量重新初始化,以便继续下一个单元的计算{temp=val;addr=1;val=0;}if (i==3){LCD_Write_Data(42,temp);temp=0;}if (i==7){LCD_Write_Data(43,temp);temp=0;}if (i==11){LCD_Write_Data(38,temp);temp=0;}if (i==15){LCD_Write_Data(39,temp);temp=0;}}
}
/enum{V,KW,A,KWh,AllUnit}Choice_Unit=V;
void SetUnitValue(void)
{switch (Choice_Unit){case V:LCD_Write_Data(0,0x01);break;case KW:LCD_Write_Data(0,0x02);break;case A:LCD_Write_Data(1,0x04);break;case KWh:LCD_Write_Data(1,0x08);case AllUnit:LCD_Write_Data(0,0x03);LCD_Write_Data(1,0x0c);break;default :break;}
}/
enum{Battery,Solar,Total}BatteryOrSolarMode=Battery;
void SetBatteryOrSolarLightMode()
{switch (BatteryOrSolarMode){case Battery:LCD_Write_Data(0,0x07);break;case Solar:LCD_Write_Data(1,0x0d);break;case Total:LCD_Write_Data(1,0x0e);break;default:break;}
}
//实际应用中,SetBatteryOrSolarLightMode()应放到SetUnitValue(void)后,制版问题,两个显示在一个单元地址导致
///
void SetValue(uchar local, uchar value,bit leve) //KWh小数点位置,1表示有,0表示无
{uchar seg1[10]={13,0,14,10,3,11,15,0,15,11};uchar seg2[10]={7, 6, 3, 7,6, 5, 5,7, 7, 7};uchar addr1=0;uchar addr2=0;uchar value1=seg1[value] ;uchar value2=seg2[value];if (local==1){addr1=2;addr2=4;}else if (local==2){addr1=6;addr2=8;}else if (local==3){addr1=10;addr2=12;}else if (local==4){addr1=14;addr2=16;}else if (local==5){addr1=22;addr2=24;}else if (local==6){addr1=26;addr2=28;}else if (local==7){addr1=30;addr2=32;}else if (local==8){addr1=34;addr2=36;}else if (local<=17&&local>=9){addr1=(local-9)*4+3;addr2=addr1+2;}LCD_Write_Data(addr1,value1);if (leve==1&&(local==3||local==7||local==11||local==17||local==16))value2+=8;LCD_Write_Data(addr2,value2);
}
void main()
{LCD_Init();display(0x00);
//	 LCD_Write_Data(1,0x01);
//	 display(0x00);//  LCD_Write_Data(24,7);
//	while(1) ;while (1){uchar i,j;for (j=0;j<10;j++){for (i=1;i<=17;i++){if (i==17)SetValue(i, j,0) ;elseSetValue(i, j,1) ;}Delay10ms(10);}}SetValue(17, 7,1);}//
/*	 SetValue()测试程序while(1){uchar i,j;for(j=0;j<10;j++){for(i=1;i<=17;i++){if(i==17)SetValue(i, j,0) ;elseSetValue(i, j,1) ;}Delay10ms(10);}}
*/
//
/*Choice_Unit=AllUnit;SetUnitValue()	 ;BatteryOrSolarMode=Solar;SetBatteryOrSolarLightMode() ;
*/
//


http://www.ppmy.cn/news/192971.html

相关文章

物联网LoRa系列-22:LoRa终端--射频芯片SX1261 SX1262的LoRa专用调制解调器与配置

目录结构&#xff1a; 1. SX1261/2功能模块 2. 调制技术的基本原理 3. LoRa调制解调的介绍 4. LoRa调制解调的寄存器设置 1. SX1261/2功能模块&#xff1a; MCU与SX1261/2物理上通过两组接口进行通信&#xff1a; &#xff08;1&#xff09;SPI总线 &#xff08;2&#x…

基于FPGA的LCD1602驱动

一、功能描述 本设计实现LCD_1602的接口&#xff0c;具体功能定义如下&#xff1a; 1、异步复位信号&#xff1b; 2、按下复位键后在LCD_1602液晶屏显示内部设置好的字符,每间隔0.1秒显示一个字符。 二、输入输出信号描述 三、设计思想 1、首先把50MHz的时钟信号转化为10Hz的…

光纤收发器tx和rx的区别?

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;在很多地方也被称之为光电转换器&#xff08;Fiber Converter&#xff09;。产品一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中…

液晶LCD1602驱动代码

液晶LCD1602简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#xff08;LCD&#xff09;、控制驱动主电路HD44780及其扩展驱动电路HD44100&#xff0c;以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可…

DP1621国产LCD驱动芯片兼容替代HT1621B

目录 DP1621简介DP1621芯片特性 DP1621简介 DP1621是点阵式存储映射的LCD驱动器芯片&#xff0c;可支持最大128点&#xff08;32SEG * 4COM&#xff09;的 LCD屏&#xff0c;也支持2COM和3COM的LCD屏。单片机可通过3/4个通信脚配置显示参数和发送显示数据&#xff0c;也可通过…

基于FPGA的LCD1602驱动(含代码)

目录 LCD1602显示原理 LCD1602接口 LCD1602操作时序 &#xff08;1&#xff09;读操作时序 &#xff08;2&#xff09;写操作时序 LCD1602初始化 LCD1602读写数据 LCD1602显示原理 将LCD显示屏与FPGA连接之后&#xff0c;需要做的第一件事就是进行LCD驱动&#xff08;也…

【Pytorch基础教程40】DLRM推荐算法模型部署

note 文章目录 note一、DLRM模型1. 特征工程和embedding层2. butterfly shuffle3. 模型结构 二、模型部署Reference 一、DLRM模型 DLRM是2020年meta提出的工业界推荐算法模型&#xff0c;模型结构非常简单&#xff0c;也没用到什么attention机制等的东西&#xff0c;更多是注重…

java项目报错405_405报错是什么原因_状态码405是什么错误

今天网站遇到一个问题&#xff1a;http post请求网页会出现405&#xff0c;分析了下原因&#xff1a; 是因为Apache、IIS、Nginx等绝大多数web服务器&#xff0c;都不允许静态文件响应POST请求。 下面是解决方案&#xff1a;将post请求改为get请求 XF405/XF400支持拍摄4K UHD(3…