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

📄 lcd.c

📁 液晶ATM12864D的驱动程序
💻 C
字号:
///////////////////////////
//Designed by: xiu
//QQ:270570606
///////////////////////////
#include <reg51.h>
#include <intrins.h>
#include "ASCII.h"

#define uint unsigned int
#define uchar unsigned char

//功能引脚定义
sbit lcd_rs = P0^6;
sbit lcd_rw = P0^7;
sbit lcd_e = P3^5;
sbit lcd_reset = P3^4;

sbit lcd_cs1 = P3^7;
sbit lcd_cs2 = P3^6;

#define lcd_data P2

//命令表(lcd_rs=0,lcd_rw=0)
#define  lcd_off  0x3e          //0011 111X |0x1;	D0
#define  lcd_on  0x3f           //0011 111X |0x1;	D0
#define y_address 0xb8   		//1011 1XXX |0x07;	D0-D2	(0~7)
#define x_address 0x40 			//01XX XXXX |0x3f;	D0-D5	(0~63)
#define disp_start_line 0xc0    //11XX XXXX |0x3f; D0-D5	(0~63)
#define status_busy 0x80

#define NOP() _nop_()

void wait_ready(void); //等待ready
void send_i(uchar CS,uchar instruction);//写指令
void send_d(uchar CS,uchar c);//写数据
void Init_Lcd(void);//初始化LCD
void Clear_Lcd(void);//清屏
void WriteASCII(uchar x,uchar y,uchar ASCII);////写英文 取模顺序:CADB 右旋90度
void lcd_set(char);//设置LCD
void lcd_first_set(char datas);//LCD初始化设置

void delay(char mas){
	char mastemp;
	for(;mas>0;mas--)
	{
		for(mastemp=1000;mastemp>0;mastemp--);
	}
}
//////////////////////////////////////////////////
////等待ready
void wait_ready(void){
	lcd_rs=0;
	lcd_rw=1;
	lcd_data=0xff;
	lcd_e=1;
	_nop_();
	while(lcd_data&status_busy);
	lcd_e=0;
}
////////////////////////////////////////////////////

//////////////////////////////////////////////////
////写指令
void send_i(uchar CS,uchar instruction){//写指令,CS=0 左;CS=1 右
	switch(CS){
		case 0: lcd_cs1=1;lcd_cs2=0; break;	//左
		case 1: lcd_cs1=0;lcd_cs2=1; break;	//右
		default: return;
	}
	wait_ready();
	lcd_rs=0;
	lcd_rw=0;
	NOP();
	lcd_data=instruction;
	lcd_e=1;
	NOP();
	lcd_e=0;
}
////////////////////////////////////////////////////

//////////////////////////////////////////////////
////写数据
void send_d(uchar CS,uchar c){//写数据,CS=0 左;CS=1 右
	switch(CS){
		case 0: lcd_cs1=1;lcd_cs2=0; break;	//左
		case 1: lcd_cs1=0;lcd_cs2=1; break;	//右
		default: return;
	}
	wait_ready();
	lcd_rs=1;
	lcd_rw=0;
	NOP();
	lcd_data=c;
	lcd_e=1;
	NOP();
	lcd_e=0;
}
//////////////////////////////////////////////////

//////////////////////////////////////////////////
////设置LCD	
void lcd_set(char datas)
{
	lcd_rs=0;
	lcd_rw=0;
	lcd_data=datas;
	lcd_e=1;
	_nop_();
	lcd_e=0;
}
//////////////////////////////////////////////////

//////////////////////////////////////////////////
////LCD初始化设置
void lcd_first_set(char datas)
{
	lcd_cs1=1;
	lcd_cs2=0;
	lcd_set(datas);
	
	delay(15);

	lcd_cs1=0;
	lcd_cs2=1;
	lcd_set(datas);

	delay(15);
}

//////////////////////////////////////////////////
////初始化LCD
void Init_Lcd(void){
	uchar cbyte;
	lcd_rw = 0;
	lcd_rs = 0;
	lcd_e = 0;
	lcd_cs1 = 1;
	lcd_cs2 = 1;
	delay(200);	

	delay(15);
	cbyte=0x3e;//关闭显示;
	lcd_first_set(cbyte);
	delay(20);

	cbyte=0x3f;//开显示;
	lcd_first_set(cbyte);

	cbyte=0xc0;//设置起始行行号为0;
	lcd_first_set(cbyte);	
}
////////////////////////////////////////////////////

/////////////////////////////////////////////////
////清屏
void Clear_Lcd(void){
	uchar a=0;
	uchar b=0;
	for (a=0;a<=7;a++){
		send_i(0,y_address|a);
		send_i(1,y_address|a);
		send_i(0,x_address|0);
		send_i(1,x_address|0);
		for (b=0;b<=127;b++){
			send_d(0,0x00);
			send_d(1,0x00);
		}
	}
}
/////////////////////////////////////////////////////

//////////////////////////////////////////////////////
////写英文 取模顺序:CADB 右旋90度,5*8
void WriteASCII(uchar x,uchar y,uchar ASCII){
	uint r;
	uchar window=0;
	for (r=(ASCII*5);r<=((ASCII*5)+4);r++){
		if(x>123) return;//防止乱码
		if(x>63){
			window=1;
			x=x%64;
		}
		send_i(window,y_address|(y/8));
		send_i(window,x_address|x);
		send_d(window,nAsciiDot[r]);
		x++;
	}
}
///////////////////////////////////////

//////////////////////////////////////////////////////
////画点
//void WritePoint(uchar x,uchar y,

void main(void){
	Init_Lcd();
	Clear_Lcd();
	WriteASCII(0,8,'H'-0x20);
	WriteASCII(5,8,'e'-0x20);
	WriteASCII(10,8,'l'-0x20);
	WriteASCII(15,8,'l'-0x20);
	WriteASCII(20,8,'o'-0x20);
	WriteASCII(25,8,'!'-0x20);
	WriteASCII(45,16,'W'-0x20);
	WriteASCII(50,16,'o'-0x20);
	WriteASCII(55,16,'n'-0x20);
	WriteASCII(60,16,'d'-0x20);
	WriteASCII(65,16,'e'-0x20);
	WriteASCII(70,16,'r'-0x20);
	WriteASCII(75,16,'f'-0x20);
	WriteASCII(80,16,'u'-0x20);
	WriteASCII(85,16,'l'-0x20);

	WriteASCII(50,48,'M'-0x20);
	WriteASCII(55,48,'a'-0x20);
	WriteASCII(60,48,'d'-0x20);
	WriteASCII(65,48,'e'-0x20);
	WriteASCII(70,48,' '-0x20);
	WriteASCII(75,48,'b'-0x20);
	WriteASCII(80,48,'y'-0x20);
	WriteASCII(85,48,':'-0x20);
	WriteASCII(90,48,' '-0x20);
	WriteASCII(95,48,'W'-0x20);
	WriteASCII(100,48,'a'-0x20);
	WriteASCII(105,48,'n'-0x20);
	WriteASCII(110,48,'g'-0x20);

	while(1)
	{
	}
}
	

⌨️ 快捷键说明

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