📄 lcm320240.c
字号:
WriteDataLCM(OvlayP1); //写入P1参数,L1,L2,L3简单或合成
delay_1us();
WriteCommandLCM(CsrForm); //写入光标形状设定指令
WriteDataLCM(CsrFormP1); //写入P1参数 8列
WriteDataLCM(CsrFormP2); //写入P2参数 8行
delay_1us();
}
void LCMClear(void)
{
uint i=0;
WriteCommandLCM(CsrDirR);
delay_1us();
WriteCommandLCM(CsrW);
WriteDataLCM(0x00);
WriteDataLCM(0x00);
delay_1us();
WriteCommandLCM(mWrite);
for(i=0;i<32768;i++)
WriteDataLCM(0x00); /* 写入数据 */
delay_1us();
}
/*====================================================
; 绘点子程序,携入参数X坐标的最高位决定写或擦点
====================================================*/
void Point(uint Px, uchar Py, uchar attr )
{
uint tempPtr;
uchar tempD,tempP;
tempPtr = (uint)Py * paraP9 + (Px & 0x7fff)/8; // 去除最高位(显示属性)
WriteCommandLCM( CsrDirDn ); // CSRDIR 代码(光标自动下移)
WriteCommandLCM( CsrW ); // 设置光标地址
WriteDataLCM( (uchar)(tempPtr & 0xff) );
WriteDataLCM( (uchar)(tempPtr /256) );
WriteCommandLCM( mRead ); // 读显示ram指令
tempD = ReadDataLCM(); // 读取当前显示数据
tempP = 1<<(uchar)(7-(Px&0x0007));
// 根据预定属性决定写点或擦除
if( attr )tempD |= tempP; // 画点
else tempD &= ~tempP; // 消点
WriteCommandLCM( CsrW ); // 重新设置光标地址
WriteDataLCM( (uchar)(tempPtr & 0xff) );
WriteDataLCM( (uchar)(tempPtr /256) );
WriteCommandLCM( mWrite ); // 代码0x42,数据写入指令
WriteDataLCM( tempD ); // 写入合成数据
}
/*=====================================================
画边框8*8格
=====================================================*/
void DrawRim(void)
{ uchar i,j;
Locatexy(0,0,0); //设置光标地址为(0,0)
WriteCommandLCM(CsrDirR);
WriteCommandLCM(mWrite);
for(i=0;i<30;i++)
WriteDataLCM(0xFF);
Locatexy(29,1,0);
WriteCommandLCM(CsrDirDn);
WriteCommandLCM(mWrite);
for(i=0;i<238;i++)
WriteDataLCM(0x01);
Locatexy(29,239,0);
WriteCommandLCM(CsrDirL);
WriteCommandLCM(mWrite);
for(i=0;i<30;i++)
WriteDataLCM(0xFF);
Locatexy(0,238,0);
WriteCommandLCM(CsrDirUp);
WriteCommandLCM(mWrite);
for(i=0;i<238;i++)
WriteDataLCM(0x80);
for(i=30;i<240;i=i+30)
for(j=1;j<=238;j++)
{if((i==120)&&(j%2==0))
Point(i,j,1);
else if(j%6==0)
Point(i,j,1);
//else Point(i,j,0);
}
for(i=30;i<240;i=i+30)
for(j=1;j<=238;j++)
{if((i==120)&&(j%2==0))
Point(j,i,1);
else if(j%6==0)
Point(j,i,1);
//else Point(i,j,0);
}
}
/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/************************************************/
void circle(uint Ox,uchar Oy,uchar Rx,uchar attr)
{
uint xx,rr,xt,yt,rs,col,row;
yt=Rx;
rr=Rx*Rx+1; //补偿 1 修正方形
rs=(yt+(yt>>1))>>1; //(*0.75)分开1/8圆弧来画
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx))yt--;
col=Ox+xt; //第一象限
row=Oy-yt;
Point(col,row,attr);
col=Ox-xt; //第二象限
Point(col,row,attr);
row=Oy+yt; //第三象限
Point(col,row,attr);
col=Ox+xt; //第四象限
Point(col,row,attr);
/***************45度镜象画另一半***************/
col=Ox+yt; //第一象限
row=Oy-xt;
Point(col,row,attr);
col=Ox-yt; //第二象限
Point(col,row,attr);
row=Oy+xt; //第三象限
Point(col,row,attr);
col=Ox+yt; //第四象限
Point(col,row,attr);
}
}
/*
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区
void TextDisp( uchar Ox,uchar Oy, uchar *ptr )
{
uchar TexLength=0,ii;
uint iTemp;
while(ptr[TexLength]>0x1f) {TexLength++;}; // 获取字串长度
iTemp = Oy*paraP9+Ox;
WriteCommandLCM( CsrForm ); // 光标形状设置,代码0x5d
WriteDataLCM( 0x07 ); // 设置光标水平点为CSX=8
WriteDataLCM( 0x07 ); // 光标为块状形式,垂直点为CSY=8
WriteCommandLCM( Ovlay ); // 显示合成方式设置.代码0x5b
WriteDataLCM( 0x01 ); // 设置参数:显示3区为文本属性,二重xor合成
WriteCommandLCM( DispOn ); // 写入指令DISP ON/OFF代码,后续参数:
WriteDataLCM( 0x56 ); // 01 01 01 10显示1~4区开显示,光标闪烁显示
iTemp = (uint)Oy * paraP9 + Ox; // 光标位置到实际ram地址换算
WriteCommandLCM( CsrDirR ); // 自动右移光标指向
WriteCommandLCM( CsrW ); // 制定光标位置
WriteDataLCM( (uchar)(iTemp &0xff) ); // 设置光标地址CSR
WriteDataLCM( (uchar)(iTemp /256 + BasePart3) ); // 加入显示三区起始地址SAD2H
WriteCommandLCM( mWrite ); // 当前位置写入数据指令
for(ii=0;ii < TexLength;ii++) {
WriteDataLCM( ptr[ii] ); // 写入显示字符代码
}
delay_nms(350);
}*/
/*=============================================================================
ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
输入参数约定:
x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
*ptr...字符串指针,本函数所指的是flash字串
att....显示区标志,0...第一区;1...第二区
返回参数:输出字串长度,留意汉字一个算两个
其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
==============================================================================*/
/*uchar dprintf(uchar x,uchar y, char *ptr, uchar att)
{
uchar c1,c2;
uchar i,j,uLen,uRow,uCol,temp;
uint k;
uRow = x;
uCol = y;
uLen=0;
WriteCommandLCM( CsrDirDn ); // 光标移动方向定义:自动下移
Locatexy(uRow,uCol,att); //起点定位
while ( (uchar)ptr[uLen] >= 0x10 ){uLen++;}; //探测字串长度
i=0;
while(i<uLen)
{
c1 = ptr[i];
c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
if(c1 <=128) // ASCII
{
if (c1 >= 0x10) {
WriteCommandLCM( mWrite ); // 写数据(命令)
for(j=0;j<16;j++) WriteDataLCM( ASC_MSK[(c1-0x20)*16 +j ]);
}
uRow++; // 列数加1
}
else // 中文
{
for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++) // 查找定位
{
if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
break;
}
for(k=0;k<2;k++) // 分16行输出
{
Locatexy(uRow+k,uCol,att);
WriteCommand( mWrite ); // 写数据(命令)
for(temp=0;temp<16;temp++) WriteData( Cdotlib[j].Msk[temp*2 + k]);
}
uRow +=2; // 光标右移一大格
i++;
}
if(uRow >= 40) // 光标后移
{
uCol += 16; // Y坐标
uRow = 0; // X坐标
if( uCol >= 240 ) uCol = 0;
}
Locatexy(uRow,uCol,att);
i++;
}
return uLen; //返回字串长度,汉字按2字节计算
}
*/
/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
==============================================================================*/
void PutCdotInGraph( uint Ox, uchar Oy, uchar Cnumber, uchar DotWidth )
{
uint tempPtr,Optr;
uchar tempCount1,tempCount2,nByte;
Optr = (uint)Oy * paraP9 + Ox;
nByte = DotWidth/8;
WriteCommandLCM( CsrDirDn ); // 自动右移。
tempPtr = (uint)Cnumber * DotWidth*nByte;
for (tempCount1=0;tempCount1<nByte;tempCount1++) {
WriteCommandLCM( CsrW ); // 光标定位指令
WriteDataLCM( (uchar)(Optr &0xFF) ); // 设置光标地址CSR
WriteDataLCM( (uchar)(Optr /256 ) );
WriteCommandLCM( mWrite ); // ram写指令
switch(DotWidth){
case 16: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteDataLCM( Cdotlib[Cnumber][tempCount2*2+tempCount1] ); // 写入数据
}
break;
case 24: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteDataLCM( Cdot24lib[tempPtr] ); // 写入数据
tempPtr += nByte;
}
break;
}
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
}
}
/*============================================================================
光标位定位,用于在1区图形方式下。
输入参数约定: x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
y...垂直方向以行线定位的坐标,可以定位到点单位。
左上角约定坐标为( 0, 0 )
============================================================================*/
void Locatexy(uchar x,uchar y, uchar attribs)
{
uint temp;
temp = (uint)y*paraP9+x;
if(attribs)temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首地址
WriteCommandLCM( CsrW ); // 光标Locate,定位
WriteDataLCM( (uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteDataLCM( (uchar)(temp /256 ) ); // 写入参数CSRH设置参数光标指针高8位
}
/*************************************
延时函数
*************************************/
void delay_1us(void)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void delay_nus(uint n)
{
for(;n>0;n--)
delay_1us();
}
void delay_nms(uint n)
{
for(;n>0;n--)
delay_nus(1000);
}
void delay_ns(uint n)
{
for(;n>0;n--)
delay_nms(1000);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -