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

📄 main_lcd.c

📁 KEIL C51程序
💻 C
字号:
#include <absacc.h>
#include <intrins.h>
#include <REGX52.h>
#define uint unsigned int
#define uchar unsigned char

#define add_iw_lr   XBYTE[0x8300]      //写指令(左右)地址
#define add_iw_l    XBYTE[0x8200]	   //写指令(左)地址
#define add_iw_r    XBYTE[0x8100]	   //写指令(右)地址
#define add_dw_lr   XBYTE[0x8700]	   //写数据(左右)地址
#define add_dw_l    XBYTE[0x8600]	   //写数据(左)地址
#define add_dw_r    XBYTE[0x8500]	   //写数据(右)地址
#define add_rsta_lr XBYTE[0x8b00]      //读状态地址
#define add_rd_lr   XBYTE[0x8f00]      //读显示数据地址

sbit lcdreset=P1^7; // LCD复位端口位地址
uchar s_c;        //定义屏幕位置(0-左,1-右,2-全屏)

code char
_asc_20[]={0x00,0x00,0x00,0x00,0x00,0x00},//space
_asc_21[]={0x00,0x00,0x4f,0x00,0x00,0x00},//!
_asc_28[]={0x00,0x00,0x1c,0x22,0x41,0x00},//(
_asc_29[]={0x00,0x41,0x22,0x1c,0x00,0x00},//)
_asc_2a[]={0x14,0x08,0x3e,0x08,0x14,0x00},//*
_asc_2b[]={0x08,0x08,0x3e,0x08,0x08,0x00},//+
_asc_2c[]={0x00,0x50,0x30,0x00,0x00,0x00},//,
_asc_2d[]={0x08,0x08,0x08,0x08,0x08,0x00},//-
_asc_2e[]={0x00,0x60,0x60,0x00,0x00,0x00},//.

_asc_30[]={0x3e,0x51,0x49,0x45,0x3e,0x00},//0
_asc_31[]={0x00,0x42,0x7f,0x40,0x00,0x00},//1
_asc_32[]={0x42,0x61,0x51,0x49,0x46,0x00},//2
_asc_33[]={0x21,0x41,0x45,0x4b,0x31,0x00},//3
_asc_34[]={0x18,0x14,0x12,0x7f,0x10,0x00},//4
_asc_35[]={0x27,0x45,0x45,0x45,0x39,0x00},//5
_asc_36[]={0x3c,0x4a,0x49,0x49,0x30,0x00},//6
_asc_37[]={0x01,0x01,0x71,0x0d,0x03,0x00},//7
_asc_38[]={0x36,0x49,0x49,0x49,0x36,0x00},//8
_asc_39[]={0x06,0x49,0x49,0x29,0x1e,0x00},//9
_asc_3a[]={0x00,0x36,0x36,0x00,0x00,0x00},//:
_asc_3b[]={0x00,0x56,0x36,0x00,0x00,0x00},//;
//_asc_3c[]={0x00,0x08,0x14,0x22,0x41,0x00},//<
_asc_3c[]={0x00,0xfe,0x7c,0x38,0x10,0x00},//-> (替换成自定义符号)
_asc_3d[]={0x14,0x14,0x14,0x14,0x14,0x00},//=
_asc_3e[]={0x00,0x41,0x22,0x14,0x08,0x00},//>
_asc_3f[]={0x02,0x01,0x51,0x09,0x06,0x00},//?
_asc_40[]={0x3e,0x41,0x5d,0x55,0x1e,0x00},//@ (原来)
_asc_41[]={0x7e,0x11,0x11,0x11,0x7e,0x00},//A
_asc_42[]={0x7f,0x49,0x49,0x49,0x36,0x00},//B
_asc_43[]={0x3e,0x41,0x41,0x41,0x22,0x00},//C
_asc_44[]={0x7f,0x41,0x41,0x22,0x1c,0x00},//D
_asc_45[]={0x7f,0x49,0x49,0x49,0x41,0x00},//E
_asc_46[]={0x7f,0x09,0x09,0x09,0x01,0x00},//F
_asc_47[]={0x3e,0x41,0x49,0x49,0x7a,0x00},//G
_asc_48[]={0x7f,0x08,0x08,0x08,0x7f,0x00},//H
_asc_49[]={0x00,0x41,0x7f,0x41,0x00,0x00},//I
_asc_4a[]={0x20,0x40,0x41,0x3f,0x01,0x00},//J
_asc_4b[]={0x7f,0x08,0x14,0x22,0x41,0x00},//K
_asc_4c[]={0x7f,0x40,0x40,0x40,0x40,0x00},//L
_asc_4d[]={0x7f,0x02,0x0c,0x02,0x7f,0x00},//M
_asc_4e[]={0x7f,0x04,0x08,0x10,0x7f,0x00},//N
_asc_4f[]={0x3e,0x41,0x41,0x41,0x3e,0x00},//O
_asc_50[]={0x7f,0x09,0x09,0x09,0x06,0x00},//P
_asc_51[]={0x3e,0x41,0x51,0x21,0x5e,0x00},//Q
_asc_52[]={0x7f,0x09,0x19,0x29,0x46,0x00},//R
_asc_53[]={0x46,0x49,0x49,0x49,0x31,0x00},//S
_asc_54[]={0x01,0x01,0x7F,0x01,0x01,0x00},//T
_asc_55[]={0x3F,0x40,0x40,0x40,0x3F,0x00},//U
_asc_56[]={0x1F,0x20,0x40,0x20,0x3F,0x00},//V
_asc_57[]={0x3F,0x40,0x38,0x40,0x3F,0x00},//W
_asc_58[]={0x63,0x14,0x08,0x14,0x63,0x00},//X
_asc_59[]={0x03,0x04,0x78,0x04,0x03,0x00},//Y
_asc_5a[]={0x61,0x51,0x49,0x45,0x43,0x00},//Z

_asc_61[]={0x20,0x54,0x54,0x54,0x78,0x00},//a
_asc_62[]={0x7f,0x48,0x44,0x44,0x38,0x00},//b
_asc_63[]={0x38,0x44,0x44,0x44,0x44,0x00},//c
_asc_64[]={0x38,0x44,0x44,0x48,0x7f,0x00},//d
_asc_65[]={0x38,0x54,0x54,0x54,0x18,0x00},//e
_asc_66[]={0x08,0x7e,0x09,0x01,0x02,0x00},//f
_asc_67[]={0x06,0x49,0x49,0x49,0x3e,0x00},//g
_asc_68[]={0x7f,0x08,0x04,0x04,0x78,0x00},//h
_asc_69[]={0x00,0x44,0x7d,0x40,0x00,0x00},//i
_asc_6a[]={0x20,0x40,0x44,0x3d,0x00,0x00},//j
_asc_6b[]={0x7f,0x10,0x28,0x44,0x00,0x00},//k
_asc_6c[]={0x00,0x41,0x7f,0x40,0x00,0x00},//l
_asc_6d[]={0x7c,0x04,0x18,0x04,0x78,0x00},//m
_asc_6e[]={0x7c,0x08,0x04,0x04,0x78,0x00},//n
_asc_6f[]={0x38,0x44,0x44,0x44,0x38,0x00},//o
_asc_70[]={0x7c,0x14,0x14,0x14,0x08,0x00},//p
_asc_71[]={0x08,0x14,0x14,0x14,0x7c,0x00},//q
_asc_72[]={0x00,0x7c,0x08,0x04,0x04,0x00},//r
_asc_73[]={0x48,0x54,0x54,0x54,0x20,0x00},//s
_asc_74[]={0x00,0x04,0x3f,0x44,0x40,0x00},//t
_asc_75[]={0x3c,0x40,0x40,0x20,0x7c,0x00},//u
_asc_76[]={0x1c,0x20,0x40,0x20,0x1c,0x00},//v
_asc_77[]={0x3c,0x40,0x30,0x40,0x3c,0x00},//w
_asc_78[]={0x44,0x28,0x10,0x28,0x44,0x00},//x
_asc_79[]={0x0c,0x50,0x50,0x50,0x3c,0x00},//y
_asc_7a[]={0x44,0x64,0x54,0x4c,0x44,0x00};//z

code char code *ascii[]={
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	_asc_20,_asc_21,
	0,0,0,0,0,0,
	_asc_28,_asc_29,_asc_2a,_asc_2b,_asc_2c,_asc_2d,_asc_2e,0, 	 	 	 	 	 	 	
	_asc_30,_asc_31,_asc_32,_asc_33,_asc_34,_asc_35,_asc_36,_asc_37,_asc_38,_asc_39,
	_asc_3a,_asc_3b,_asc_3c,_asc_3d,_asc_3e,_asc_3f,
	0,
	_asc_41,_asc_42,_asc_43,_asc_44,_asc_45,_asc_46,_asc_47,_asc_48,_asc_49,_asc_4a,
	_asc_4b,_asc_4c,_asc_4d,_asc_4e,_asc_4f,_asc_50,_asc_51,_asc_52,_asc_53,_asc_54,
	_asc_55,_asc_56,_asc_57,_asc_58,_asc_59,_asc_5a,
	0,0,0,0,0,0,
	_asc_61,_asc_62,_asc_63,_asc_64,_asc_65,_asc_66,_asc_67,_asc_68,_asc_69,_asc_6a,
	_asc_6b,_asc_6c,_asc_6d,_asc_6e,_asc_6f,_asc_70,_asc_71,_asc_72,_asc_73,_asc_74,
	_asc_75,_asc_76,_asc_77,_asc_78,_asc_79,_asc_7a,
	0,0,0,0,0};



/*----------------------------------------------------------------------------------------------------*/
/*--基本函数源程序------------------------------------------------------------------------------------*/

 //延时
Lcd12864delay(uint i)
{
	while(i--) {;}
}
/*----------------------------------------------------------------------------------------------------*/
//状态检查
void CheckState()
{
uchar dat;
do{dat=add_rsta_lr;
dat=0x90 & dat; //仅当第4,7位为0时才可操作
}while(!(dat==0x00));
}
/*----------------------------------------------------------------------------------------------------*/
//写显示数据
//dat:显示数据
void WriteByte(uchar dat,s_c)
{
switch(s_c)
{case 0:               //写左显示数据
     CheckState();
     add_dw_l=dat;
   break;

 case 1:               //写右显示数据
     CheckState();
     add_dw_r=dat;
   break;
 
 case 2:               //写左右显示数据
     CheckState();
     add_dw_lr=dat;
   break;
}					  
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD发送命令
//command :命令
SendCommandToLCD(uchar command,s_c)
{
	switch(s_c)
	{case 0:               //写左指令
	     CheckState();
	     add_iw_l=command;
	   break;
	
	 case 1:               //写右指令
	     CheckState();
	     add_iw_r=command;
	   break;
	 
	 case 2:               //写左右指令
	     CheckState();
	     add_iw_lr=command;
	   break;
	}
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
line=line & 0x07; // 0<=line<=7		        //防止越界
line=line|0xb8; //1011 1xxx	                //通过和b8h或得到指令包含页地址的指令码
SendCommandToLCD(line,s_c);                 //??需要设置屏幕位置(左右?)
}
/*----------------------------------------------------------------------------------------------------*/
//设定列地址--Y 0-63
void SetColumn(uchar column)
{
column=column &0x3f; // 0=<column<=63        //防止越界
column=column | 0x40; //01xx xxxx            //通过和40h或得到指令包含列地址的指令码
SendCommandToLCD(column,s_c);                //??需要设置屏幕位置(左右?)
}
/*----------------------------------------------------------------------------------------------------*/
//设定显示开始行--XX
void SetStartLine(uchar startline)  //0--63
{
	startline=startline & 0x3f;  //防止越界,  原来的--startline=startline & 0x07,只能达到7行,有误
	startline=startline|0xc0; //1100 0000         //通过和c0h或得到指令包含开始行地址的指令码
	SendCommandToLCD(startline,s_c);              //??需要设置屏幕位置(左右?)
}
/*----------------------------------------------------------------------------------------------------*/
//开关显示
void SetOnOff(uchar onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff,s_c);                  //??需要设置屏幕位置(左右?) 
}
/*---------------------------------------------------------------------------------------------------*/
//选择屏幕
//screen: 0-左,1-右,2-全屏
void SelectScreen(uchar screen)
{ //深圳RT12864:正有效 cs0: 1--左; cs1: 1--右;case2:1--全屏
switch(screen)
{ 
case 0:        //左屏
  s_c=0;
  break;    
case 1:        //右屏      
  s_c=1;
  break;
case 2:        //全屏
  s_c=2;
  break;
}
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-左,1-右,2-全屏
void ClearScreen(uchar screen)
{ unsigned char i,j;
SelectScreen(screen);

for(i=0;i<8;i++)
{ SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00,s_c);
}
}
}
/*-------------------------------------------------------------------------------------------------*/
void Reset() //液晶复位
{
//reset 低复位
lcdreset=0;
/*_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();*/
Lcd12864delay(1000);
lcdreset=1;

SelectScreen(2);      //选择全屏,关显示
SendCommandToLCD(0x3e,s_c);	

}


/*--------------------------------------------------------------------------------------------------*/
//显示8*6点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-20)
//address : 字模区首地址
void Show86(uchar lin,uchar column,uint address)
{
	 unsigned char i;
	if(column>20) {return;}
	  if(column<10){ SelectScreen(1);}       //如果列数<8(0,1,2,3,4,5,6,7,8,9)则写在第一屏上
	  else  {SelectScreen(2);}               //否则 (10,11,12,13,14,15,16,17,18,19)写在第二屏上
	column=column & 0x0f;                    //防止越界
	SetLine(lin);
	SetColumn(column=column*6+4);            //相当于×6+4,得到真实的列地址,即前后4列空
	for(i=0;i<6;i++)                         //显示8列,即一个8×8点阵 
	WriteByte( CBYTE[address+i],s_c );       //需要建立CBYTR表格????????
}

/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(uchar lin,uchar column,uint address)
{
	unsigned char i;
	if(column>16) {return;}
	if(column<8)
	     { 
		 	SelectScreen(1);          //如果列数<8(0,1,2,3,4,5,6,7)则写在第一屏上
	      	column=column & 0x07;      //防止越界 
	   	 }       
	 else {
	       	SelectScreen(2);          //否则 (8,9,10,11,12,13,14,15)写在第二屏上
	        column=column & 0x0f;    //防止越界
	        }
	SetLine(lin);
	SetColumn(column<<3);                    //左移3位,相当于×8,得到真实的列地址
	for(i=0;i<8;i++)                         //显示8列,即一个8×8点阵 
	WriteByte( CBYTE[address+i],s_c );       //需要建立CBYTR表格????????
}

/*----------------------------------------------------------------------------------------------*/
void InitLCD() //初始化LCD
{ 
	Reset();       //复位,关显示
	
	ClearScreen(2);  //清全屏
	
	SelectScreen(2);
	SetOnOff(1);     //开显示
	SelectScreen(2); //选择全屏
	SetStartLine(0); //开始行:0
}
/*----------------------------------------------------------------------------------------------------*/
void main(void)
{
	InitLCD();    //初始化LCD
	while(1)
	{
		SelectScreen(2); //选择全屏
		SetStartLine(5); //开始行:0
		Show88(1,2,ascii+22);
		Show88(1,3,ascii+30);
	}
}

⌨️ 快捷键说明

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