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

📄 text1.c

📁 一款液晶RT240128GB的以8080方式控制的底层驱动源代码程序,非常难得,放血奉献!
💻 C
📖 第 1 页 / 共 2 页
字号:

/******************************************************** 
   LCD采用ST7920,RT240128GB
   控制单片机AT89C51 11.0592MHz
   2008.5.8 汪亲朋.
************************************************************/
#include "reg52.h"
//#include "intrins.h"
#define   uchar  unsigned char
#define   uint   unsigned int

#define   PORTB   P1
sbit   WRT  =P2^7;//低电平有效//
sbit   RAD  =P2^6;//低电平有效//
sbit   CS   =P2^5;//低电平有效//
sbit   RS   =P2^4;//1:数据寄存器 0:指令寄存器//
sbit   RESET=P2^3;//低电平有效//正常工作应为高电平//
sbit   BUSY =P2^2;//默认高电平为忙//
sbit   INT  =P2^1;//默认高电平触发中断//
/*	_WR       BIT P2.7
	_RD       BIT P2.6
	CSL       BIT P2.5
	RS        BIT P2.4
	RST       BIT P2.3
	BUSY      BIT P2.2
	KEY       BIT P3.2*/
/*
//////////////指令寄存器00H////////////////////////
#define 00H_DISPLAY		(0x01)/////bit0//1:屏幕正常显示 0:屏幕反白显示////
#define 00H_FLASH		(0x00<<1)//bit1//1:屏幕闪烁,闪烁时间由80H的BTR决定 0:屏幕不闪烁正常显示////
#define 00H_LCD_ON_OFF	(0x00<<2)//bit2//1:屏幕开启 0:屏幕关闭////
#define 00H_MODEL	    (0x01<<3)//bit3//1:文字模式 0:绘图模式////
//#define 00H_SIO		(0x00<<4)//bit4///
//#define 00H_IIC		(0x00<<5)//bit5///
#define 00H_POWER_MODE	(0x03<<6)//bit[7:6]//11:电源工作正常模式 00:电源工作关闭模式////
//////////////指令寄存器F0H////////////////////////
#define F0H_ASCII_BLOCK	(0x02)   //bit[1:0]//00:ASCII区块0//01:ASCII区块1//10:ASCII区块2//11:ASCII区块3////
#define F0H_DECODE_MODE	(0x00<<2)//bit2//1:全部以ASCII解码(00-FFH)//0:00-9FH视为ASCIIA0-FFH视为汉字码////
#define F0H_REWRTITE 	(0x00<<3)//bit3//1:开始写入//0:不动作////
#define F0H_FONT	    (0x00<<4)//bit[5:4]//00:选择简体(GB)(256KB)//01:选择繁体(GIB5)(512KB)//10:选择简体(GB)(512KB)//
#define F0H_SELECT_ROM	(0x00<<6)//bit6//1:选择上部的256KB的ROM//0:选择下部的256KB的ROM//
#define F0H_JIANZI		(0x01<<7)//bit7//1:正常使用//0:客户自建立ROM时使用//
//////////////指令寄存器10H////////////////////////
#define 10H_CURSOR_WIDTH(0x00)/////bit0//1:光标宽度固定为1个字节即8个Pixel//0:光标可以自适应宽度////
#define 10H_CURSOR_FLASH(0x00<<1)//bit1//1:光标闪烁,闪烁时间由80H的BTR决定 0:光标不闪烁正常显示////
#define 10H_CURSOR_DISP	(0x00<<2)//bit2//1:光标显示//0:光标不显示////
#define 10H_CURSOR_WRT_M	(0x01<<3)//bit3//1:写入数据到DDRAM时光标自动移位//0:不自动移位////
#define 10H_ZI_TYPE		(0x01<<4)//bit4//1:正常字型//0:粗体字型/////
#define 10H_FAN_DISP    (0x01<<5)//bit5//1:正常显示//0:汉字反白显示/////
#define 10H_ALIGN	    (0x01<<6)//bit6//1:文字对齐使能//0:文字对齐禁能////
#define 10H_CURSOR_RAD_M	(0x00<<7)//bit7//1:从DDRAM读取数据时光标自动移位//0:不自动移位////
//////////////指令寄存器12H////////////////////////
#define 12H_MAKE_WORAD	(0x03)   //bit[1:0]//00:ASCII区块0//01:ASCII区块1//10:ASCII区块2//11:ASCII区块3////
//#define 12H_CURSOR_DISP	(0x00<<2)//bit2//1:光标显示//0:光标不显示////
//#define 12H_CURSOR_WRT_M	(0x01<<3)//bit3//1:写入数据到DDRAM时光标自动移位//0:不自动移位////
//#define 12H_ZI_TYPE		(0x01<<4)//bit4//1:正常字型//0:粗体字型/////
//#define 12H_FAN_DISP    (0x01<<5)//bit5//1:正常显示//0:汉字反白显示/////
//#define 12H_ALIGN	    (0x01<<6)//bit6//1:文字对齐使能//0:文字对齐禁能////
#define 12H_MOVE	    (0x01<<7)//bit7//1:先水平移动再垂直移动//0:先垂直移动再水平移动////
*/
/////////////////////////////
/////////////////////////////////////////////////////////////////
void LCD_NOP(void)
{
  uchar i;
  for(i=0;i<5;i++); 
}
/////////////////////////////////////////////////////////////////
void Delay(int x)
{
  int i,j;
  for(j=0;j<x;j++)
   {
    for(i=0;i<250;i++);
   }
}
/****************************** 读忙状态函数 ****************************
* 功能:在正常读写操作之前检测LCD模块的忙状态, 
*       DB7 = 0:LCD控制器空闲;DB7 = 1:LCD控制器忙
*************************************************************************/
/*
void Check_Busy(void) 
{
    CS=0;////选中LCD////
	while(BUSY) ;////如果Busy的值为1,说明忙,则一直在此处等待,直到为0/////
}
*/	     
//////////////////LCD写命令字///////////////////////////////////////
void LCD_Write_Com(uchar CMD)
{ 
 // Check_Busy();///检测忙信号////
  PORTB=CMD;      /// 将命令字符送往数据口 ///
  CS=0;
  RAD=1;
  RS=0; 
  WRT=0;
  LCD_NOP();
  WRT=1;
  RS=1;
  CS=1;
}
//////////////LCD写数据/////////////////////////////////////////////////
void LCD_Write_Dat(uchar x_data)
{ 
 // Check_Busy();///检测忙信号////
  PORTB=x_data;      /// 将数据字符送往数据口 ///
  CS=0;
  RAD=1;
  RS=1; 
  WRT=0;
  LCD_NOP();
  WRT=1;
  RS=1;
  CS=1;
}
//////////////LCD读取数据/////////////////////////////////////////////////
uchar LCD_Read_Dat(void)
{ 
  uchar x_data;
 // Check_Busy();///检测忙信号////
  PORTB=0xff;    /// 将数据0xff送往数据口 ///
  CS=0;  
  WRT=1;
  RS=0;
  RAD=0;
  LCD_NOP();
  x_data=PORTB; 
  RS=1;
  RAD=1;
  CS=1;
  return(x_data);
}
//////////////LCD设定功能/////////////////////////////////////////////////
void LCD_Write_Funtion(uchar CMD,uchar x_data)
{ 
  LCD_Write_Com(CMD);
  LCD_Write_Com(x_data);
}
//////////////LCD读取缓冲器/////////////////////////////////////////////////
uchar LCD_Read_Funtion(uchar CMD)
{ 
  LCD_Write_Com(CMD);
  return(LCD_Read_Dat());
}
//////////////LCD初始化/////////////////////////////////////////////////
void LCD_Init(void)
{
 //初始化参数表:前面的是寄存器地址,后面的是参数
 //LCD_Write_Funtion(0x00,0xCD);//LCD基本显示功能设定 文本模式
 LCD_Write_Funtion(0x00,0xCC);//LCD基本显示功能设定 文本模式
 LCD_Write_Funtion(0x01,0xF0);//中断准位(高电平) / 设定系统频率8MHz
 LCD_Write_Funtion(0x02,0x10);//LCD内存读写速度与功能设定(读字形ROM)
 LCD_Write_Funtion(0x03,0x80);//LCD特殊显示功能
// LCD_Write_Funtion(0x10,0x6B);//LCD基本显示功能设定 2
 LCD_Write_Funtion(0x10,0x4B);//LCD基本显示功能设定 光标不自动移位
 LCD_Write_Funtion(0x11,0x00);//光标高度和行距设定
 LCD_Write_Funtion(0x12,0x91) ;//显示层设定:高位8灰度,9水平单一层,A单二层,B同时一二层
 LCD_Write_Funtion(0x20,0x1E) ;//实际显示窗口垂直结束地址(LCD屏的分辨率30*8=240)
 LCD_Write_Funtion(0x30,0x7F) ;//实际显示窗口水平结束地址(128)
 LCD_Write_Funtion(0x40,0x00) ;//实际显示窗口垂直起始地址
 LCD_Write_Funtion(0x50,0x00) ;//实际显示窗口水平起始地址
 LCD_Write_Funtion(0x21,0x1E) ;//工作区窗口垂直结束地址(用户指定的显示窗口)
 LCD_Write_Funtion(0x31,0x7F) ;//工作区窗口水平结束地址
 LCD_Write_Funtion(0x41,0x00) ;//工作区窗口垂直起始地址
 LCD_Write_Funtion(0x51,0x00) ;//工作区窗口水平起始地址
 LCD_Write_Funtion(0x60,0x00) ;//地址定位
 LCD_Write_Funtion(0x61,0x00) ;//
 LCD_Write_Funtion(0x70,0x00) ;//
 LCD_Write_Funtion(0x71,0x00) ;//
 LCD_Write_Funtion(0x72,0x00) ;//
 LCD_Write_Funtion(0x80,0xAA) ;//光标闪烁时间
 LCD_Write_Funtion(0x81,0x04) ;//保留
 LCD_Write_Funtion(0x91,0x00) ;//保留
 LCD_Write_Funtion(0x90,0x10) ;//值太大屏幕会闪烁
 LCD_Write_Funtion(0xA0,0x11) ;//键、触摸屏、光标行列状态
 LCD_Write_Funtion(0xA1,0x00) ;
 LCD_Write_Funtion(0xA2,0x00) ;
 LCD_Write_Funtion(0xA3,0x00) ;
 LCD_Write_Funtion(0xB0,0x27) ;
 LCD_Write_Funtion(0xB1,0xEF) ;
 LCD_Write_Funtion(0xC0,0x00) ;
 LCD_Write_Funtion(0xC1,0x0A) ;
 LCD_Write_Funtion(0xC8,0x80) ;
 LCD_Write_Funtion(0xC9,0x80) ;
 LCD_Write_Funtion(0xCA,0x00) ;
 LCD_Write_Funtion(0xD0,0x80) ;
 LCD_Write_Funtion(0xE0,0x00) ;//自动写此寄存器的数据到DDRAM(图形模式有效)
 LCD_Write_Funtion(0xF0,0xA0) ;//字符字体控制
 LCD_Write_Funtion(0xF1,0x0F) ;//字符点阵大小控制
/////39
}
//////////清除文本层显示数据///////////////////
void LCD_Clear_Text(void)
{
  uchar i,j;
  LCD_Write_Funtion(0x00,0xCD);//文本模式
  LCD_Write_Funtion(0x10,0x6B);
  LCD_Write_Funtion(0xF0,0xA0);
  LCD_Write_Funtion(0x60,0x00);//地址定位
  LCD_Write_Funtion(0x70,0x00);//地址定位
  for(i=0;i<8;i++)/////共16//////
   {
    for(j=0;j<30;j++) 	 
	  //LCD_Write_Dat(' ');////每页连续写入40个数据///// 
      LCD_Write_Dat(0x20);
   }  
} 
//////////清除图形层显示数据///////////////////
void LCD_Clear_Graphics(void)
{
  uchar i,j;
  LCD_Write_Funtion(0x00,0xC5); //图形模式
  LCD_Write_Funtion(0x12,0x91);//显示层设定:高位8灰度,9水平单一层,A单二层,B同时一二层
  LCD_Write_Funtion(0x60,0x00);//地址定位
  LCD_Write_Funtion(0x70,0x00);//地址定位
  for(i=0;i<128;i++)/////共16//////
   {
    for(j=0;j<30;j++) 	 
	  LCD_Write_Dat(0x00); ////每页连续写入40个数据/////      
   }  
}
/////////////////////////////////////////////////// 
void LCD_Write_word(uchar LCM_X,uchar LCM_Y,uchar *ptr)
{
  uchar X,Y;
  uchar i=0;
  X=LCM_X;
  Y=LCM_Y;
  //LCD_Clear_Text();
  LCD_Write_Funtion(0x00,0xCD);//文本模式
  //LCD_Write_Funtion(0x10,0x4B);
  LCD_Write_Funtion(0x60,X);//地址定位
  LCD_Write_Funtion(0x70,Y);//地址定位  
  while (*ptr != '%')////利用数组最后有空格作为信息结束的判断/////
   { 
    if((X+i)>=30)
	 {
	   X=0;
	   Y=LCM_Y+16;
	   //i=0;
	   LCD_Write_Funtion(0x60,X) ;//地址定位
       LCD_Write_Funtion(0x70,Y) ;//地址定位  
	 }	
    LCD_Write_Dat(*ptr++);
	i++;    
   }
}
/*

⌨️ 快捷键说明

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