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

📄 lcd.c

📁 LCD液晶显示程序,带中文字库,显示内容可任意设置!
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#include <absacc.h>
#include <SwitchDect.h>



uchar com;								//命令字
uchar dat;								//数据字

sbit CSA = P1^4; 						//*cs-1*/
sbit CSB = P1^3; 						//*cs-2*/
sbit RS  = P1^2; 						//*rs*/
sbit RW  = P1^1; 						//*r/w*/
sbit EN  = P1^0; 						//*enable*/


void ReadStatus()                       //*判断"忙"状态*/
{
	uchar busy;
	uchar temp;
	RS = 0;                             //*读时序控制1; RS=0表示进行的是指令操作*/
	RW = 1;                             //*读时序控制2; RW=1表示进行的是读操作*/
   	do
   	{
		P0 = 0xff;						//*P0作输入*/
        EN = 1;                         //*读时序控制3; 使能信号置高*/ 
        busy = P0;                      //*P0代表端口1的内容*/
        EN = 0;                         //*读时序控制4; 使能信号置低*/
        temp=busy&0x80;               
     }while (temp!=0);
}


void WrLeftCom()						//*左屏写命令*/
{
	CSA = 0;							//选中左屏,0有效;
    CSB = 1;							//右屏不被选中,1无效;
    ReadStatus();
	RS = 0;
    RW = 0;
    P0 = com;							//*com表示命令的内容*/
    EN = 1;
    EN = 0;	
}


void WrRightCom()						//*写右屏命令*/
{
	CSA = 1;
	CSB = 0;
    ReadStatus();
	RS = 0;
    RW = 0;
    P0 = com;
    EN = 1;
    EN = 0;	
}


void WrLeftData()						//*左屏写数据*/
{
	CSA = 0;
    CSB = 1;
    ReadStatus();
	RS = 1;
    RW = 0;
    P0 = dat;                         
    EN = 1;
    EN = 0;
}


void WrRightData()						//*右屏写数据*/
{
	CSA = 1;
	CSB = 0;
    ReadStatus();
	RS = 1;
    RW = 0;
    P0 = dat;                          
    EN = 1;
    EN = 0;
}


void ClrFullScr()						//清全屏
{
	uchar page=0;
	uchar column=0;

	for(page=0;page<8;page++)
    {
		com =(0xb8 + page);				//页地址设置
        WrLeftCom();
		WrRightCom();

        com =0x40;                      //列地址设置
        WrLeftCom();
		WrRightCom();

        for( column=0; column<64; column++)   //RAM清"0"
        {                              
        	dat =0x00;                  //由于列地址在操作完后会自动加1,
										//因此只用设置初地址就行了
            WrLeftData();
            WrRightData();	            //RAM清0就是在所在单元写上数据0
		}
	}
}


void LCDInit()                          //液晶初始化
{		
	com =0xc0;                          //显示从第0行开始
	WrLeftCom();
	WrRightCom();

    com =0x3F ;                         //液晶显示开关打开
	WrLeftCom();
	WrRightCom();

	ClrFullScr();						//清全屏
}


void Display88Dot(uchar Row, uchar Col, uchar* Lib, uint Addr) 	//Display a 8*8 dot array;													
{													//Row:0~7 Col:0~15
	uchar OffsetCol = 0;

	Addr <<= 3;
	
	if((Row>7)||(Col>15)) 				//防止越界
		return;
	else if(Col>7)
	{
		com = 0xb8 + Row;
		WrRightCom();
		
		Col -= 8;
		Col <<= 3;
		com = 0x40 + Col;
		WrRightCom();

		for(OffsetCol=0; OffsetCol<8; OffsetCol++)
		{
			dat = Lib[OffsetCol + Addr];
			WrRightData();
		}	
	}
	else
	{
		com = 0xb8 + Row;
		WrLeftCom();
		
		Col <<= 3;
		com = 0x40 + Col;
		WrLeftCom();

		for(OffsetCol=0; OffsetCol<8; OffsetCol++)
		{
			dat = Lib[OffsetCol + Addr];
			WrLeftData();
		}	
	}
}


void DisplayChar(uchar Row, uchar Col, uchar* Lib, uint Addr)	//*Display a 8*16 dot array;													
{													//Row:0~3 Col:0~15
	if((Row>3)||(Col>15)) 				//防止越界
		return;
	Row <<= 1;
	Addr <<= 1;

	Display88Dot(Row, Col, Lib, Addr);
	Display88Dot(Row+1, Col, Lib, Addr+1);
}


void DisplayWord(uchar Row, uchar Col, uchar* Lib, uint Addr)	//Display a 16*16 dot array;
{																//Row:0~3 Col:0~7
	if((Row>3)||(Col>7))				//防止越界
		return;

	Row  <<= 1;
	Col  <<= 1;
	Addr <<= 2;

	Display88Dot(Row, Col, Lib, Addr);
	Display88Dot(Row, Col+1, Lib, Addr+1);
	Display88Dot(Row+1, Col, Lib, Addr+2);
	Display88Dot(Row+1, Col+1, Lib, Addr+3);
}


void DisplayLog(uchar* Lib)
{
	uchar page=0;
	uchar column=0;

	for(page=0;page<8;page++)
    {
		com =(0xb8 + page);					//页地址设置
        WrLeftCom();
		WrRightCom();

        com =0x40;                      	//列地址设置
        WrLeftCom();
		WrRightCom();

        for(column=0; column<64; column++)  //先写左半屏某行
        {                              
        	dat = Lib[page*128+column];      
            WrLeftData();
		}
        for(column=64; column<128; column++)//
        {                              
        	dat = Lib[page*128+column];  //由于列地址在操作完后会自动加1,										
											//因此只用设置初地址就行了
            //WrLeftData();
            WrRightData();	            //RAM清0就是在所在单元写上数据0
		}
	}
	
}


⌨️ 快捷键说明

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