晶联讯官方不提供JLX19296,官方提供的C51驱动也有很多问题. stm32驱动,为了减少连线数量,使用i2c接口,使用通用字库文件.
单片机源程序如下:
- #include "st75256.h"
- #include "LCMfont.h"
- #include "delay.h"
- #include "myiic.h"
- //LCM的显存
- //-----------------虚拟显存定义----------------
- u8 LCM_GRAM[192][12];
- /**********************************************
- // IIC Write Command
- **********************************************/
- void Write_IIC_Command(u8 IIC_Command)
- {
- IIC_Start();
- IIC_Send_Byte (0x78); //Slave address,SA0=0
- IIC_NAck ();
- IIC_Send_Byte (0x80); //write command
- IIC_NAck ();
- IIC_Send_Byte(IIC_Command);
- IIC_NAck ();
- IIC_Stop();
- }
- /**********************************************
- // IIC Write Data
- **********************************************/
- void Write_IIC_Data(u8 IIC_Data)
- {
- IIC_Start();
- IIC_Send_Byte (0x78); //D/C#=0; R/W#=0
- IIC_NAck ();
- IIC_Send_Byte(0xC0); //write data
- IIC_NAck ();
- IIC_Send_Byte (IIC_Data);
- IIC_NAck ();
- IIC_Stop ();
- }
- void LCM_WR_Byte(u8 dat,u8 cmd)
- {
- if(cmd)
- {
- Write_IIC_Data(dat);
-
- }
- else {
- Write_IIC_Command(dat);
-
- }
- }
- void LCM_Set_Pos(u8 x, u8 y)
- {
- LCM_WR_Byte(0x15,LCM_CMD); //set Column
- LCM_WR_Byte(0X00,LCM_DATA);
- LCM_WR_Byte(x,LCM_DATA);
-
- LCM_WR_Byte(0x75,LCM_CMD);
- LCM_WR_Byte(0,LCM_DATA);
- LCM_WR_Byte(y,LCM_DATA);
- LCM_WR_Byte(0x30,LCM_CMD);
- LCM_WR_Byte(0x5C,LCM_CMD); //写数据到显存
- }
- u8 test_ddr(void)
- {
- u8 vol;
- Write_IIC_Command(0x30); //EXT=0
- LCM_Set_Pos(0,0);
- LCM_WR_Byte(0x01,LCM_DATA);
- LCM_Set_Pos(0,0);
- LCM_WR_Byte(0x5d,LCM_CMD);
- vol = IIC_Read_Byte(1);
- return vol;
- }
-
- //更新显存到LCM
- void LCM_Refresh(void)
- {
- u8 i,j;
- LCM_WR_Byte(0x15,LCM_CMD);
- LCM_WR_Byte(0X00,LCM_DATA);
- LCM_WR_Byte(Max_Column-1,LCM_DATA);
-
- LCM_WR_Byte(0x75,LCM_CMD);
- LCM_WR_Byte(0X08,LCM_DATA); // 页地址偏移8
- LCM_WR_Byte((Max_Page-1)+8,LCM_DATA);
- LCM_WR_Byte(0x30,LCM_CMD);
- LCM_WR_Byte(0x5C,LCM_CMD); //写数据到显存
-
- for(i=0;i<Max_Page;i++)
- {
- for(j=0;j<Max_Column;j++)
- {
- LCM_WR_Byte(LCM_GRAM[j][i],LCM_DATA);
- }
- }
- }
- //清屏函数
- void LCM_Clear(void)
- {
- u8 i,j;
- for(i=0;i<Max_Page;i++)
- {
- for(j=0;j<Max_Column;j++)
- {
- LCM_GRAM[j][i]=0x00;//清除所有数据
- }
- }
- LCM_Refresh();//更新显示
- }
- //画点
- //x:0~255
- //y:0~96
- //t:1 填充 0,清空
- void LCM_DrawPoint(u8 x,u8 y,u8 t)
- {
- u8 i,m,n;
- i=y/8;
- m=y%8;
- n=1<<m;
- if(t){LCM_GRAM[x][i]|=n;}
- else
- {
- LCM_GRAM[x][i]=~LCM_GRAM[x][i];
- LCM_GRAM[x][i]|=n;
- LCM_GRAM[x][i]=~LCM_GRAM[x][i];
- }
- }
- //画线
- //x1,y1:起点坐标
- //x2,y2:结束坐标
- void LCM_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
- {
- u16 t;
- int xerr=0,yerr=0,delta_x,delta_y,distance;
- int incx,incy,uRow,uCol;
- delta_x=x2-x1; //计算坐标增量
- delta_y=y2-y1;
- uRow=x1;//画线起点坐标
- uCol=y1;
- if(delta_x>0)incx=1; //设置单步方向
- else if (delta_x==0)incx=0;//垂直线
- else {incx=-1;delta_x=-delta_x;}
- if(delta_y>0)incy=1;
- else if (delta_y==0)incy=0;//水平线
- else {incy=-1;delta_y=-delta_x;}
- if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
- else distance=delta_y;
- for(t=0;t<distance+1;t++)
- {
- LCM_DrawPoint(uRow,uCol,mode);//画点
- xerr+=delta_x;
- yerr+=delta_y;
- if(xerr>distance)
- {
- xerr-=distance;
- uRow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- uCol+=incy;
- }
- }
- }
- //x,y:圆心坐标
- //r:圆的半径
- void LCM_DrawCircle(u8 x,u8 y,u8 r)
- {
- int a, b,num;
- a = 0;
- b = r;
- while(2 * b * b >= r * r)
- {
- LCM_DrawPoint(x + a, y - b,1);
- LCM_DrawPoint(x - a, y - b,1);
- LCM_DrawPoint(x - a, y + b,1);
- LCM_DrawPoint(x + a, y + b,1);
-
- LCM_DrawPoint(x + b, y + a,1);
- LCM_DrawPoint(x + b, y - a,1);
- LCM_DrawPoint(x - b, y - a,1);
- LCM_DrawPoint(x - b, y + a,1);
-
- a++;
- num = (a * a + b * b) - r*r;//计算画的点离圆心的距离
- if(num > 0)
- {
- b--;
- a--;
- }
- }
- }
- //在指定位置显示一个字符,包括部分字符
- //x:0~255
- //y:0~96
- //size1:选择字体 6x8/6x12/8x16/12x24
- //mode:0,反色显示;1,正常显示
- void LCM_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
- {
- u8 i,m,temp,size2,chr1;
- u8 x0=x,y0=y;
- if(size1==8)size2=6;
- else size2=(size1/8+((size1%8)?1:0))*(size1/2); //得到字体一个字符对应点阵集所占的字节数
- chr1=chr-' '; //计算偏移后的值
- for(i=0;i<size2;i++)
- {
- if(size1==8)
- {temp=asc2_0806[chr1][i];} //调用0806字体
- else if(size1==12)
- {temp=asc2_1206[chr1][i];} //调用1206字体
- else if(size1==16)
- {temp=asc2_1608[chr1][i];} //调用1608字体
- else if(size1==24)
- {temp=asc2_2412[chr1][i];} //调用2412字体
- else return;
- for(m=0;m<8;m++)
- {
- if(temp&0x01)LCM_DrawPoint(x,y,mode);
- else LCM_DrawPoint(x,y,!mode);
- temp>>=1;
- y++;
- }
- x++;
- if((size1!=8)&&((x-x0)==size1/2))
- {x=x0;y0=y0+8;}
- y=y0;
- }
- }
- //显示字符串
- //x,y:起点坐标
- //size1:字体大小
- //*chr:字符串起始地址
- //mode:0,反色显示;1,正常显示
- void LCM_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
- {
- while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
- {
- LCM_ShowChar(x,y,*chr,size1,mode);
- if(size1==8)x+=6;
- else x+=size1/2;
- chr++;
- }
- }
- //m^n
- u32 LCM_Pow(u8 m,u8 n)
- {
- u32 result=1;
- while(n--)
- {
- result*=m;
- }
- return result;
- }
- //显示数字
- //x,y :起点坐标
- //num :要显示的数字
- //len :数字的位数
- //size:字体大小
- //mode:0,反色显示;1,正常显示
- void LCM_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
- {
- u8 t,temp,m=0;
- if(size1==8)m=2;
- for(t=0;t<len;t++)
- {
- temp=(num/LCM_Pow(10,len-t-1))%10;
- if(temp==0)
- {
- LCM_ShowChar(x+(size1/2+m)*t,y,'0',size1,mode);
- }
- else
- {
- LCM_ShowChar(x+(size1/2+m)*t,y,temp+'0',size1,mode);
- }
- }
- }
- //显示汉字
- //x,y:起点坐标
- //num:汉字对应的序号
- //mode:0,反色显示;1,正常显示
- void LCM_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
- {
- u8 m,temp;
- u8 x0=x,y0=y;
- u16 i,size3=(size1/8+((size1%8)?1:0))*size1; //得到字体一个字符对应点阵集所占的字节数
- for(i=0;i<size3;i++)
- {
- if(size1==16)
- {temp=Hzk1[num][i];}//调用16*16字体
- else if(size1==24)
- {temp=Hzk2[num][i];}//调用24*24字体
- else if(size1==32)
- {temp=Hzk3[num][i];}//调用32*32字体
- else if(size1==64)
- {temp=Hzk4[num][i];}//调用64*64字体
- else return;
- for(m=0;m<8;m++)
- {
- if(temp&0x01)LCM_DrawPoint(x,y,mode);
- else LCM_DrawPoint(x,y,!mode);
- temp>>=1;
- y++;
- }
- x++;
- if((x-x0)==size1)
- {x=x0;y0=y0+8;}
- y=y0;
- }
- }
- //num 显示汉字的个数
- //space 每一遍显示的间隔
- //mode:0,反色显示;1,正常显示
- void LCM_ScrollDisplay(u8 num,u8 space,u8 mode)
- {
- u8 i,n,t=0,m=0,r;
- while(1)
- {
- if(m==0)
- {
- LCM_ShowChinese(128,24,t,16,mode); //写入一个汉字保存在LCM_GRAM[][]数组中
- t++;
- }
- if(t==num)
- {
- for(r=0;r<Max_Page*space;r++) //显示间隔
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
以上3个文件下载
JLX19296G.rar
(10.3 KB, 下载次数: 43)
|