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

📄 lcd.h

📁 用8位数码管组成显示电路提示信息
💻 H
字号:
/*
#include <absacc.h>
#include <intrins.h>
#include <reg51.h>

//#include "1302.h"
// LCD128*64 数据线
#define LCD12864DataPort P1
#define uchar unsigned char
#define uint unsigned char
// LCD128*64 I/O 信号管脚
sbit di = P2^0; // 数据\指令 选择
sbit rw = P2^2; // 读\写 选择
sbit en = P2^1; // 读\写使能
sbit cs1= P2^3; // 片选1,低有效(前64列)
sbit cs2= P2^4; // 片选2,低有效(后64列)
*/
#include "circlecode.h"
#include "HZcode.h" 
#include "DegreePoint.h"
#define EN 2
#define DI 3
#define RW 4
#define CS1 4
#define CS2 5    
void SinPout(uchar tmp)  
{ 
	/*   
uchar i;
for (i=0;i<8;i++)
{ 
     
      if (tmp&0x80)
      {
       
         
          PORTD|=Bit(IN164);  
         
          }
       else            
       {
          PORTD&=~Bit(IN164);  
         
          } 
      PORTD&=~Bit(CLK164);    
       
       PORTD|=Bit(CLK164);      
       
      tmp=tmp<<1;
} 
*/
if (tmp&0x01)
		PORTC|=Bit(0);
	else
		PORTC&=~Bit(0);	
	if (tmp&0x02)
		PORTC|=Bit(1);
	else
		PORTC&=~Bit(1);
	if (tmp&0x04)
		PORTD|=Bit(2);
	else
		PORTD&=~Bit(2);
	if (tmp&0x08)
		PORTD|=Bit(3);
	else
		PORTD&=~Bit(3);
	if (tmp&0x10)
		PORTD|=Bit(4);
	else
		PORTD&=~Bit(4);	
	if (tmp&0x20)
		PORTD|=Bit(5);
	else
		PORTD&=~Bit(5);
	if (tmp&0x40)
		PORTD|=Bit(6);
	else
		PORTD&=~Bit(6);
	if (tmp&0x80)
		PORTD|=Bit(7);
	else
		PORTD&=~Bit(7);
}
 
void nop(void)
{
	//_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	uchar i;
	for (i=0;i<20;i++) 
	{
	#asm("NOP") ;
	}
}

//状态检查
void CheckState(void)
{
	uchar dat;
	dat = 0x00;
	//di=0;
       //	#asm("CBI PORTB,DI")
       PORTB&=~Bit(DI);
	//rw=1;
       //	#asm("SBI PORTB,RW")
       PORTB|=Bit(RW);
/*	do
	{
		P1=0xff;
		en=1;
		dat=P1; 
		en=0;
		dat&=0x80; //仅当第7位为0时才可操作
	}while(dat);*/
}

//写显示数据
//dat:显示数据
void WriteByte(uchar dat)
{
       	CheckState();
	//di=1; 
	//rw=0;
	//#asm("SBI PORTB,DI")
	//#asm("CBI PORTB,RW")
      	PORTB|=Bit(DI);
       	PORTB&=~Bit(RW);
       //	LCD12864DataPort=dat;
       SinPout(dat);
	//en=1; 
	//en=0;
	//#asm("SBI PORTB,EN")
	//#asm("CBI PORTB,EN")
     	PORTB|=Bit(EN);
     	PORTB&=~Bit(EN);
       //	LCD12864DataPort=0;
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
SendCommandToLCD(uchar command)
{
      	CheckState();
	//rw=0;
	//di=0;
	//#asm("CBI PORTB,RW")
	//#asm("CBI PORTB,DI")   
	PORTB&=~Bit(RW);   

	PORTB&=~Bit(DI);
        SinPout(command);
       //	LCD12864DataPort=command;
	//en=1;
	//en=0;
	//#asm("SBI PORTB,EN")
	//#asm("CBI PORTB,EN")
	PORTB|=Bit(EN);

	PORTB&=~Bit(EN);

}


/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
	line &= 0x07; // 0<=line<=7
	line |= 0xb8; //1011 1xxx
	SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(uchar column)
{
	column &= 0x3f; // 0=<column<=63
	column |= 0x40; //01xx xxxx
	SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(uchar startline) //0--63
{
	//startline &= 0x07;
	startline |= 0xc0; //1100 0000
	SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(uchar onoff)
{
	onoff|=0x3e; //0011 111x
	SendCommandToLCD(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(uchar screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
	switch(screen)
	{ 
		case 0: 
			//cs1=0;//全屏
			//#asm("CBI PORTB,CS1")
			PORTC&=~Bit(CS1);
			nop();
			//cs2=0; 
			//#asm("CBI PORTB,CS2")
			PORTC&=~Bit(CS2);
			nop();
			break; 
		case 1: 
			//cs1=1;//左屏
			//#asm("SBI PORTB,CS1")
			PORTC|=Bit(CS1);
			nop();
			//cs2=0;
			//#asm("CBI PORTB,CS2")
			PORTC&=~Bit(CS2);
			nop();
			break;
		case 2: 
			//cs1=0;//右屏
			//#asm("CBI PORTB,CS1")
			PORTC&=~Bit(CS1);
			nop();
			//cs2=1;
			//#asm("SBI PORTB,CS2")
			PORTC|=Bit(CS2);
			nop();
			break;
		default:
			break;
	}
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(uchar screen)
{ 
	uchar i,j;
	SelectScreen(screen);
	for(i=0;i<8;i++)
	{ 
		SetLine(i);
		for(j=0;j<64;j++)
		{
			WriteByte(0x00);
		}
	}
}
/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//lin:行(0-7), column: 列(0-127)
//address : 字模区首地址

void Show8x8(uchar lin,uchar column,uchar num,uchar add)
{ 
	uchar i;
//	if(column>128) {return;}
	if(column<64)
	{
		SelectScreen(1); //如果列数<64则从第一屏上开始写
		SetLine(lin);
		SetColumn(column);
		for(i=0;i<8;i++)
		{
			if(column+i<64)
			{
				WriteByte(HZcode[num][add+i]);
				
			}
			else
			{
				SelectScreen(2);
				SetLine(lin);
				SetColumn(column-64+i);
				WriteByte(HZcode[num][add+i]);
			}
		}
	}
	else 
	{
		SelectScreen(2); //否则从第二屏上开始写
		column-=64; //防止越界
		SetLine(lin);
		SetColumn(column);
		for(i=0;i<8;i++)
		{
			if(column+i<64)
			{
				WriteByte(HZcode[num][add+i]);
			}
			else
			{
				SelectScreen(1);
				SetLine(lin);
				SetColumn(column-64+i);
				WriteByte(HZcode[num][add+i]);
			}
		}
	}
}

void Show_Circle(void)
{
	uchar i;
	uchar lin,column;
	
	column=8;
	for (lin=0;lin<6;lin++)
	{
	       	SelectScreen(1); //如果列数<64则从第一屏上开始写
	      	SetLine(lin);    
	        SetColumn(column);
		for(i=0;i<48;i++)
		{
		       	WriteByte(CirCode[lin][i]);
		      //	nop();
		}
	}
	
}
void Show_HalfCircle(void)
{
	uchar i;
	uchar lin,column;
	
	column=25;
	for (lin=0;lin<6;lin++)
	{
	        SelectScreen(2); //如果列数<64则从第一屏上开始写
	      	SetLine(lin);
	     	SetColumn(column);
		for(i=24;i<48;i++)
		{
			WriteByte(CirCode[lin][i]);
		}
	}
}
void PaintDegree(uchar deg,uchar bScreen)
{
	uchar lin,column,i;
	column=16;
//	bit dgflag[16];
	SetLine(0);
	if (bScreen) {SelectScreen(2);column=10;}
	else
		SelectScreen(1);
	for (lin=0;lin<4;lin++)
	{
		SetLine(lin+1);
		SetColumn(column);
		for(i=0;i<33;i++)
		{
			WriteByte(DegreeCode[deg][lin*33+i]);
		}
			
	}
	
}


//显示汉字16*16
void ShowChinese(uchar lin,uchar column,uchar num)
{
        //uchar *address;
//	if(lin>7 || column>127){return;}	
       	//address = &HZcode[num][0];
       	Show8x8(lin,column,num,0);
       	Show8x8(lin,column+8,num,8);
     	Show8x8(lin+1,column,num,16);
     	Show8x8(lin+1,column+8,num,24); 
     
}

void InitLCD(void) //初始化LCD
{ 
	int i=2000; //延时
	while(i--);
 	SetOnOff(1); //开显示
	//ClearScreen(1);//清屏
	//ClearScreen(2);
	ClearScreen(0);
       //	SetStartLine(0); //开始行:0
}
void Show_Preset(void)
{
	ShowChinese(6,20,0);//预
	ShowChinese(6,34,1);//设
	
}

void Show_Slow(void)
{
ShowChinese(6,86,3);//慢
}
void Show_Quick(void)
{
ShowChinese(6,86,2);//快
}

⌨️ 快捷键说明

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