когда-то было сделано, работает на многих проектах, зрить надо в корень :))
#include "C8051F120.h"
#include "lcd_routine.h"
#include "global_variable.h"
#include <intrins.h>
#include <stdio.h>
sbit RS = P4^0;
sbit RW = P4^1;
sbit E = P4^2;
void Read_BUSY_Flag(){
unsigned char c;
Set_RS(0);
Set_RW(1);
do{
Set_E(1);
c = (Read_Port() & (1 << 7));
Set_E(0);
}
while(c != 0);
}
/*
unsigned char ReadInstrReg (void){
unsigned char Instr;
Set_RS(0);
Set_RW(1);
Set_E(1);
Instr = Read_Port(); // read Instruction
Set_E(0);
Read_BUSY_Flag();
return(Instr);
}
*/
void WriteInstrReg (unsigned char Instr){
Set_RS(0);
Set_RW(0);
Set_E(1);
Write_Port(Instr); // write instruction
Set_E(0);
Read_BUSY_Flag();
}
void WriteDataReg (unsigned char val){
Set_RS(1);
Set_RW(0);
Set_E(1);
Write_Port(val); // write value
Set_E(0);
Read_BUSY_Flag();
}
void Set_RS (unsigned char i){
SFRPAGE = CONFIG_PAGE;
if(i == 0) RS = 0;
else RS = 1;
Delay_1us();
SFRPAGE = LEGACY_PAGE;
}
void Set_RW (unsigned char i){
SFRPAGE = CONFIG_PAGE;
if(i == 0) RW = 0;
else RW = 1;
Delay_1us();
SFRPAGE = LEGACY_PAGE;
}
void Set_E (unsigned char i ){
SFRPAGE = CONFIG_PAGE;
if(i == 0) E = 0;
else E = 1;
Delay_1us();
SFRPAGE = LEGACY_PAGE;
}
unsigned char Read_Port(){
unsigned char c;
SFRPAGE = CONFIG_PAGE;
P3MDOUT = 0x0;
Delay_1us();
c = P3;
SFRPAGE = LEGACY_PAGE;
return(c);
}
void Write_Port(unsigned char c){
SFRPAGE = CONFIG_PAGE;
P3MDOUT = 0xFF;
Delay_1us();
P3 = c;
SFRPAGE = LEGACY_PAGE;
}
void Delay_ms(unsigned short ms){
unsigned short i,c = 70*SYS_CLK;;
while(ms--){
for(i = 0; i < c; ++i);
}
}
void Delay_1us(void){
unsigned char i = SYS_CLK;
while(--i) _nop_();
}
void Set_Display_Row_Ptr(unsigned char l){
if(l == 0) WriteInstrReg (LINE1_ADDR | DD_RAM_PTR);
if(l == 1) WriteInstrReg (LINE2_ADDR | DD_RAM_PTR);
if(l == 2) WriteInstrReg (LINE3_ADDR | DD_RAM_PTR);
if(l == 3) WriteInstrReg (LINE4_ADDR | DD_RAM_PTR);
}
void KS0066_Init(void){
Delay_ms(15);
WriteInstrReg(ONE_LINE_DISP_OFF);
Delay_ms(5);
WriteInstrReg(ONE_LINE_DISP_OFF);
Delay_ms(100);
WriteInstrReg(ONE_LINE_DISP_OFF);
Delay_ms(15);
WriteInstrReg(TWO_LINE_DISP_OFF);
Delay_ms(5);
WriteInstrReg(DISP_ON_CUR_OFF_BL_OFF);
Delay_ms(15);
WriteInstrReg(INC_MODE);
Delay_ms(15);
WriteInstrReg (CLEAR_DISPLAY);
Delay_ms(15);
}