📄 ocm4x8c.c
字号:
//
//build on 2004/03/16
//2004/04/09 debug draw picture mode.pass.
//ocm4x8c and with character mold lcd(ST7920) compatible provided
//pin4:RS(CS) connect to A1
//pin5:RW connect to A0
//
//!!the follow is important ,please vary the address 0x4000 accord to your hardware!!
//
//pin6:EN=(!A_LCD)&(!(WRn&RDn) ;HARDWARE connect:WRn and RDn is 8031 P3.6,P3.7 respectively;
// A_LCD is 74138 output Y2n,also as 8031 address of 0x4000
// 74138 input A connect to 8031 P2.7(A15),B to P2.6(A14),C to P2.5(A13)
//
//pin7:DB0 connect to D0
//... ...
//pin14:DB7 connect to D7
//pin15:connect to vcc,parallel mode
//pin16:not used
//pin17:RESETn not used
//
//D0-D7 is the data bus,and A0-A15 is the address bus(so you must use a 74373)
//
//
#define OCM4X8C //有字库液晶
#ifdef OCM4X8C
#include <absacc.h>
#include "..\h\OCM4X8C.h"
bit CheckBusy(void) //返回值为1,说明正忙
{
byte i;
if((i=XBYTE[OCM4X8C_READ_INSTRUCTION])>=0x80)return(1);
else return(0);
}
byte ReadAC(void) // AC as the ADDRESS COUNTER
{
return(XBYTE[OCM4X8C_READ_INSTRUCTION]&0x7F);
}
void WaitMode(void)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=CLEAR_DISPLAY; //clear all DDRAM(20h),set AC to 00h
}
void SetToBasicOperation(void) //基本指令集动作
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_FUNCTION_BASIC;
}
void SetToExtendOperation(void) //扩展指令集动作
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_FUNCTION_EXTEND;
}
void OCM4X8C_initial(void)
//if you need the index and index position,add this function.
//note:after draw a picture,index and index position will be set off.
{
WaitMode();
SetToBasicOperation();
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=DISPLAY_STATUS+7; //whole display on,index on,index position on
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_ENTRANCE_POINT+2;//index shift right;whole display no move
}
void IndexShiftLeft(void)
//index shift left 16 pixels,but not clear display,it will be replaced by the follow character.
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=0x10;
}
void IndexShiftRight(void)
//index shift right as 16 pixels,left a space
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=0x14;
}
void SetCGRAM(byte AC)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_CGRAM+AC;
}
void SetDDRAM(byte AC)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_DDRAM+AC;
}
void WholeShiftLeft(void)
//no change in RAM,but need to vary line.
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=0x18;
}
void WholeShiftRight(void)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=0x1c;
}
byte ShiftLeftNumber=0,ShiftRightNumber=0;
void WholeShiftLeft_Clear(void)
{
extern void DisplayEChar(byte);
ShiftLeftNumber%=8;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=DISPLAY_STATUS+4; //whole display on,index off,index position off
SetDDRAM(ShiftLeftNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
SetDDRAM(0x8+ShiftLeftNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
SetDDRAM(0x10+ShiftLeftNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
SetDDRAM(0x18+ShiftLeftNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
ShiftLeftNumber++;
WholeShiftLeft();
}
/*
void WholeShiftLeft_Roll(void)
//can not read the second half byte of the same AC value,
//thus,temp2==temp1;temp4==temp3.
//
{
extern void DisplayEChar(byte);
byte temp1,temp2,temp3,temp4;
ShiftLeftNumber%=8;
SetDDRAM(ShiftLeftNumber);
while(CheckBusy());
temp1=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp2=XBYTE[OCM4X8C_READ_DATA];
SetDDRAM(0x8+ShiftLeftNumber);
while(CheckBusy());
temp3=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp4=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp1;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp2;
SetDDRAM(ShiftLeftNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp3;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp4;
//
SetDDRAM(0x10+ShiftLeftNumber);
while(CheckBusy());
temp1=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp2=XBYTE[OCM4X8C_READ_DATA];
SetDDRAM(0x18+ShiftLeftNumber);
while(CheckBusy());
temp3=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp4=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp1;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp2;
SetDDRAM(0x10+ShiftLeftNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp3;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp4;
ShiftLeftNumber++;
WholeShiftLeft();
}
*/
void WholeShiftRight_Clear(void)
{
extern void DisplayEChar(byte);
ShiftRightNumber%=8;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=DISPLAY_STATUS+4; //whole display on,index off,index position off
SetDDRAM(0x7-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
SetDDRAM(0xf-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
SetDDRAM(0x17-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
SetDDRAM(0x1f-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0x20;
ShiftRightNumber++;
WholeShiftRight();
}
/*
void WholeShiftRight_Roll(void)
{
//extern void DisplayEChar(byte);
byte temp1,temp2,temp3,temp4;
ShiftRightNumber%=8;
SetDDRAM(0x7-ShiftRightNumber);
while(CheckBusy());
temp1=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp2=XBYTE[OCM4X8C_READ_DATA];
SetDDRAM(0xf-ShiftRightNumber);
while(CheckBusy());
temp3=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp4=XBYTE[OCM4X8C_READ_DATA];
SetDDRAM(0xf-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp1;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp2;
SetDDRAM(0x7-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp3;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp4;
//
SetDDRAM(0x17-ShiftRightNumber);
while(CheckBusy());
temp1=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp2=XBYTE[OCM4X8C_READ_DATA];
SetDDRAM(0x1f-ShiftRightNumber);
while(CheckBusy());
temp3=XBYTE[OCM4X8C_READ_DATA];
while(CheckBusy());
temp4=XBYTE[OCM4X8C_READ_DATA];
SetDDRAM(0x1f-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp1;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp2;
SetDDRAM(0x17-ShiftRightNumber);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp3;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=temp4;
ShiftRightNumber++;
WholeShiftRight();
}
*/
void BackWhite(byte line) //扩展指令集动作,line=0--3
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=BACK_WHITE+line;
}
void DrawOn(void) //扩展指令集动作,绘图显示开
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=DRAW_ON;
}
void DrawOff(void)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=DRAW_OFF;
}
void DisplayCGRAM(byte index)
{
//index should be valued in 00h to 03h
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=0;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=2*index;
}
void SetStartPoisition(byte line,byte x)
{
byte line_real;
switch(line)
{
case 1:line_real=0;break;
case 2:line_real=0x10;break;
case 3:line_real=8;break;
case 4:line_real=0x18;break;
}
SetDDRAM(line_real+x-1);
}
void NextLine(void)
{
while(CheckBusy());
switch(ReadAC())
{
case 0x08:SetDDRAM(0x10);break;
case 0x18:SetDDRAM(0x08);break;
case 0x10:SetDDRAM(0x18);break;
case 0x20:WaitMode();break;
}
}
bit CheckOdd;
void DisplayChar(byte Char)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=Char;
CheckOdd^=1;
if(!CheckOdd) NextLine();
}
void DisplayEChar(byte EChar)
{
//EChar should be valued in 01h to 7fh
if((EChar>0)&&(EChar<0x80))
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=EChar;
CheckOdd^=1;
if(!CheckOdd) NextLine();
}
}
void DisplayCChar(word CChar)
{
//CChar should be valued in 0xa1a1 to 0xf7fe,
//in which ,0xa1a0 to 0xa9ff is special characters,
//0xb0a1 to 0xd7fe is the class 1 chinese characters,
//0xd8a1 to 0xf7fe is the class 2 chinese characters.
byte high,low;
high=CChar>>8;
low=CChar;
if((high>0xa0)&&(high<0xf8)&&(low>0xa0)&&(low<0xff))
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=high; //higer 8bit,should be bigger than or equal to 0xa0
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=low; //lower 8bit,should be bigger than or equal to 0xa0
NextLine();
}
}
void DisplayString(byte *string)
{
byte i=0;
while(*(string+i)!=LCD_STRING_END)
{
DisplayChar(*(string+i));
i++;
}
}
void DisplayNumber(word number)
{
byte NumDisplay[5];
byte i,*string;
bit rtn=0;
NumDisplay[0]=number/10000; //最高位
number-=NumDisplay[0]*10000;
NumDisplay[1]=number/1000;
number-=NumDisplay[1]*1000;
NumDisplay[2]=number/100;
number-=NumDisplay[2]*100;
NumDisplay[3]=number/10;
number-=NumDisplay[3]*10;
NumDisplay[4]=number;
string=NumDisplay;
for(i=0;(i<5)&&(rtn==0);i++) //寻找第一个不为0的数字位置//保证至少输出一个数字
{
if(*(string+i)!=0) rtn=1;
}
for(i-=1;i<5;i++) DisplayEChar(*(string+i)+0x30);
}
void DrawPicture(byte *bmpPicture)
//display 128*64 bmp
//对齐方式:左上
//横向取模 高位在左
//位图大小128*64
//点阵由牧马字模输出
{
byte X=0,Y=0;
WaitMode();
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=DISPLAY_STATUS+4; //whole display on,index off,index position off
SetToExtendOperation();
DrawOff();
for(Y=0;Y<32;Y++) //display the above half
{
for(X=0;X<8;X++)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_GDRAM+Y;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_GDRAM+X;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=*(bmpPicture+Y*0x10+X*2);
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=*(bmpPicture+Y*0x10+X*2+1);
}
}
for(Y=0;Y<32;Y++) //display the lower half
{
for(X=8;X<16;X++)
{
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_GDRAM+Y;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_INSTRUCTION]=SET_GDRAM+X;
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=*(bmpPicture+0x1e0+Y*0x10+X*2); //*(bmpPicture+0x1f0+Y*0x10+(X-8)*2)
while(CheckBusy());
XBYTE[OCM4X8C_WRITE_DATA]=*(bmpPicture+0x1e0+Y*0x10+X*2+1);
}
}
DrawOn();
SetToBasicOperation();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -