📄 text1.c
字号:
/********************************************************
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 + -