晶聯訊官方不提供JLX19296,官方提供的C51驅動也有很多問題. stm32驅動,為了減少連線數量,使用i2c接口,使用通用字庫文件.
51hei圖片_20220325084108.jpg (210.2 KB, 下載次數: 39)
下載附件
顯示效果
2022-3-25 08:42 上傳
單片機源程序如下:
- #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黑下載附件…………
復制代碼
51hei.png (3.09 KB, 下載次數: 41)
下載附件
2022-3-25 22:22 上傳
以上3個文件下載
JLX19296G.rar
(10.3 KB, 下載次數: 43)
2022-3-25 08:41 上傳
點擊文件名下載附件
源碼
|