lcd.c

来自「15寸」· C语言 代码 · 共 108 行

C
108
字号
#include <at89x52.h>
#include "lcd.h"

sbit dc = 0x96;			//P1.6 LCD的RS  	pin7
sbit rw = 0x95;			//P1.5 LCD的R/W 	pin6
sbit cs = 0x94;			//P1.4 LCD的E   	pin5
sfr lcdbus = 0x80;		//P0   LCD的数据 D0 = P0.0

unsigned char displayPosition = 0;
unsigned char DDRAMAddress = 0;


void softNop(void){}

bit lcd_checkBusy(void)
{
	unsigned char lcdstate;
	dc = 0;
	rw = 1;
	cs = 1;
	softNop();
	lcdstate = lcdbus;
	cs = 0;
	return((bit)(lcdstate & 0x80));
}

void lcd_WCmd(unsigned char lcdCmd)	//write LCD command
{
	while(lcd_checkBusy());
	lcdbus = lcdCmd;
	dc = 0;
	rw = 0;
	cs = 1;
	softNop();
	cs = 0;
	lcdbus = 0xff;
}

void lcd_WData(unsigned char lcddata)
{
	while(lcd_checkBusy());
	lcdbus = lcddata;
	dc = 1;		//dc = 1 为数据,=0 为命令
	rw = 0;		//rw = 1 为读,=0 为写
	cs = 1;		//cs = 1 选通
	softNop();
	cs = 0;
	lcdbus = 0xff;
}

//---------------------------------------------------------
void lcd_setDDRAMAddress(unsigned char DDRAMaddr)
{
	DDRAMAddress = DDRAMaddr;
	lcd_WCmd(DDRAMaddr | 0x80);
   
}

void lcd_cls(void)
{
	lcd_WCmd(0x01);
}

void lcd_string16(unsigned char position,unsigned char *str)
{

    unsigned char i = 0;

	if(position >= 16) position = 0;
	if(position < 8)
	{
		lcd_setDDRAMAddress(position);
	}
	if(position >=8)
	{
		position = position - 8;
		position = position + 0x40;
		lcd_setDDRAMAddress(position);
	}

    DDRAMAddress = position;

	while (str[i] !=0)
	{
		if(DDRAMAddress == 8) lcd_setDDRAMAddress(0x40);
 	    if(DDRAMAddress == 0x48)
	    {
			lcd_setDDRAMAddress(0);
			DDRAMAddress = 0;
		}

		DDRAMAddress ++;
		lcd_WData(str[i]);
		i ++;
	}
}

void lcd_init(void)
{
	lcd_WCmd(0x38);	//8 bit,2 line 5*7
	lcd_WCmd(0x0c);	//
	lcd_WCmd(0x01);	//clear display
	displayPosition = 0;
	DDRAMAddress = 0;
}


⌨️ 快捷键说明

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