📄 c19264.c
字号:
/******************************************************************************
**
** 西安博控电子科技有限公司.
**
** 文件名: C19264.c
**
** 用途: C19264 LCD Driver
**
** 修改时间: $ 年 月 日 shw $
******************************************************************************/
#include "system.h"
#include <intrins.h>
#include "HANZI.H"
#include <math.h>
//状态检查
void CheckState()
{
Uchar dat;
di=0;
rw=1;
do{
LCD12864DataPort=0xff;
en=1;
dat=LCD12864DataPort;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
en=0;
dat=0x90 & dat; //仅当第4,7位为0时才可操作
}while(!(dat==0x00));
}
/******************************************************************************
** 函数名: void WriteByte(Uchar dat)
** 描述: 写数据
** 修改的全局变量:
** 输入参数:
** 返回值:
*******************************************************************************/
void WriteByte(Uchar dat)
{
CheckState();
di=1; rw=0;
LCD12864DataPort=dat;
en=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
en=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
en=0;
rw=1;
}
/******************************************************************************
** 函数名: void WriteByte(Uchar dat)
** 描述: 写数据
** 修改的全局变量:
** 输入参数:
** 返回值:
*******************************************************************************/
unsigned char ReadByte(void)
{
unsigned char Dat;
CheckState();
di=1; rw=1;
LCD12864DataPort=0xFF;
en=0;
en=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
Dat = LCD12864DataPort;
en=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
//Dat = LCD12864DataPort;
//Dat = LCD12864DataPort;
return Dat;
}
/*-----------------------------------------------------------------------------------------------------*/
/******************************************************************************
** 函数名: void SendCommandToLCD(Uchar command)
** 描述: 写命令
** 修改的全局变量:
** 输入参数:
** 返回值:
*******************************************************************************/
void SendCommandToLCD(Uchar command)
{
CheckState();
rw=0;
LCD12864DataPort=command;
en=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
en=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
rw=1;
}
/*----------------------------------------------------------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(Uchar line)
{
line=line & 0x07; // 0<=line<=7
line=line|0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(Uchar column)
{
column=column &0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
}
void Rst_LCD(void)
{
LCD_RST=0;
delay(2000);
LCD_RST=1;
}
//选择屏幕
//screen: 0-全屏,1-第一屏,2-第二屏,3-第三屏
void SelectScreen(Uchar screen)
{ //北京显示器:负有效
switch(screen)
{
//------------------------------------------------------------------------------------------------
case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs3=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
//------------------------------------------------------------------------------------------------
case 1: cs1=0;//
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs3=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
//------------------------------------------------------------------------------------------------
case 2: cs1=1;//
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs3=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
//------------------------------------------------------------------------------------------------
case 3: cs1=1;//
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs3=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
}
}
/******************************************************************************
** 函数名: void SetOnOff(Uchar onoff)
** 描述: 开/关显示
** 修改的全局变量:
** 输入参数:
** 返回值:
*******************************************************************************/
void SetOnOff(Uchar onoff)
{
onoff=0x3e | onoff; //0011 111x
SelectScreen(1);
SendCommandToLCD(onoff);
SelectScreen(2);
SendCommandToLCD(onoff);
SelectScreen(3);
SendCommandToLCD(onoff);
}
/******************************************************************************
** 函数名: void ClearScreen(Uchar screen)
** 描述:
** 修改的全局变量:
** 输入参数: screen: 0-全屏,1-第一屏,2-第二屏,3-第三屏
** 返回值:
*******************************************************************************/
void ClearScreen(Uchar screen)
{ Uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{ SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/*--------------------------------------------------------------------------------------------------*/
//显示8*8点阵
//旋转90度:字模被竖着切分
//lin:行(0-7), column: 列(0-15)
//address : 字模区首地址
void Show88(Uchar lin,Uchar column,Uchar code *address)
{ Uchar i;
if(column>15) {SelectScreen(3);}
else if(column<8) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7,9,10,11)则写在第一屏上
else {SelectScreen(2);}
SetLine(lin);
if(column>=16)column=column-16;
if(column>=8)column=column-8;
//SetStartLine(lin);
SetColumn(column<<3);
for(i=0;i<8;i++) WriteByte( *(address+i) );
}
/*------------------------------------------------*/
//显示图片
//旋转90度 :字模被竖着切分
//startline :开始行
//startcolumn:开始列
//linechar :图片行点除8(图片以8*8点阵为单位)
//columnchar :图片列点除8(图片以8*8点阵为单位)
//address : 字模区首地址
/******************************************************************************
** 函数名: void ShowPicture(Uchar startline,Uchar startcolumn,
Uchar linechar,Uchar columnchar,Uchar code *address)
** 描述:
** 修改的全局变量:
** 输入参数:
** 返回值:
*******************************************************************************/
void ShowPicture(Uchar startline,Uchar startcolumn,Uchar linechar,Uchar columnchar,Uchar code *address)
{ Uchar i,j;
for(i=0;i<columnchar;i++)
for(j=0;j<linechar;j++)
Show88(startline+i , startcolumn+j , address+(i*linechar+j)*8 );
}
/*----------------------------------------------------------*/
//显示一个汉字
//旋转90度:字模被竖着切分
//lin:行(0-3), column: 列(0-15)
//hzcode: 汉字代码(自定义的)
//uchar code HZtable
void ShowHZ(Uchar lin,Uchar column,Uchar code *address)
{
lin=lin<<1; //lin*2
Show88(lin,column,address);
Show88(lin,column+1,address+8);
Show88(lin+1,column,address+16);
Show88(lin+1,column+1,address+24);
}
void Display_Chinese(unsigned int UniCode,Uchar X,Uint Y)
{
Uchar i;
Uchar * ImgData;
Uint CodeID;
for(i=0;i<hzNum;i++)
{
if( (hzIndex[2*i]==(Uchar)(UniCode>>8)) && (hzIndex[2*i+1]==(Uchar)UniCode) )
{
CodeID=i; break;
}
}
ImgData=&hzdot[CodeID*32];
ShowHZ(X,Y,ImgData);
}
void Display_ASCII(Uchar Char,Uchar X,Uint Y)
{
Uchar code * ImgData;
{
ImgData=&ASC_MSK[(Char-0x20)*16];
Show88(2*X,Y,ImgData);
ImgData=&ASC_MSK[(Char-0x20)*16+8];
Show88(2*X+1,Y,ImgData);
}
}
/******************************************************************************
** 函数名: void Display_Number(Uint Number,Uchar X,Uint Y,Uchar Lenth)
** 描述: 显示一串数字
** 修改的全局变量:
** 输入参数:
** 返回值:
*******************************************************************************/
void Display_Number(Uint Number,Uchar X,Uint Y,Uchar Lenth)
{ Uchar DispNum;
Y=Y+Lenth-1;
for(;Lenth>0;Lenth--)
{
DispNum=Number%10+0x30;
Display_ASCII(DispNum,X,Y);
Y--;
Number=Number/10;
}
}
/******************************************************************************
** 函数名: void Display_String(Uchar code *p,Uchar X,Uint Y,Uchar lenth)
** 描述: 显示一个字符串
** 修改的全局变量:
** 输入参数: Uchar lenth: 字符串长度
** 返回值:
*******************************************************************************/
void Display_String(Uchar code *p,Uchar X,Uint Y,Uchar lenth)
{ Uchar i;
for(i=0;i<lenth;i++)
{
if(p[i]<0x80) {Display_ASCII(p[i],X,Y);Y++;} //ASCII
else
{
Display_Chinese((p[i])*256+p[i+1],X,Y);//中文
i++;
Y++;
Y++;
}
}
}
void Pixel(unsigned int PointX,unsigned int PointY )
{
unsigned char dat;
unsigned char shift;
if(PointX>191)return;
if(PointX>127) {SelectScreen(3);}
else if(PointX<64) SelectScreen(1); //如果列数<8(0,1,2,3,4,5,6,7,9,10,11)则写在第一屏上
else {SelectScreen(2);}
SetLine(PointY/8);
if(PointX>=128)PointX=PointX-128;
if(PointX>=64)PointX=PointX-64;
SetColumn(PointX);
dat=ReadByte();
SetLine(PointY/8);
SetColumn(PointX);
//dat = 0;
shift= PointY%8;
dat |=(1<<shift);
WriteByte(dat);
}
/***************************************************************************************/
/*函数:void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
//描述:划线函数
//参数:x1:起始点横坐标(0-127),y1:起始点纵坐标(0-31)
// x2:终止点横坐标(0-127),y2:终止点纵坐标(0-31)
//
//返回:无
/***************************************************************************************/
void Line( unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
{
unsigned int x,y;
double k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=(float)((float)y2-(float)y1) / (float)((float)x2-(float)x1) ;
b=y1-k*x1;//
if( x1 <= x2 )
{
for(x=x1;x<=x2;x++)
{
y=k*x+b;
Pixel(x, y);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=k*x+b;
Pixel(x, y );
}
}
}
else // abs(y1-y2) > abs(x1-x2) |K|>1
{
k=(float)((float)x2-(float)x1) / (float)((float)y2-(float)y1) ;
b=x1-k*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=k*y+b;
Pixel( x , y );
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=k*y+b;
Pixel( x , y );
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -