|
本帖最后由 zj97czb 于 2025-9-23 12:08 编辑
老王家没资料的屏,是不是都是定制屏?买了好几款,觉得都不简单。比如这款:
主控评论区说的是IST3931,IIC通信。但手册对于IIC驱动就写得很简单。等到能点亮了,又发现清屏又是个奇怪活,把清屏搞好,写字符又是个难题。
这个是屏的引脚定义,排线在下,屏 行的 排列,想不明白它为什么要隔行排列。
字库工具就用它
写一条命令
- //写一个命令到ist3931中uchar address,uchar ch
- void Write_ist3931_com(uchar cd)
- {
- iic_start();
- IICSendByte(0x7e);
- check_ACK();
- IICSendByte(0x80);//写命令
- check_ACK();
- IICSendByte(cd);
- check_ACK();
- iic_stop();
- //delay_iic(2);//24c02片内写数据时间 (10毫秒)
- }
复制代码
写一个数据
- /写一个数据到ist3931中uchar address,uchar ch
- void Write_ist3931_dat(uchar dat)
- {
- iic_start();
- IICSendByte(0x7e);
- check_ACK();
- IICSendByte(0xc0);//写数据
- check_ACK();
- IICSendByte(dat);
- check_ACK();
- iic_stop();
- }
复制代码
初始化
- //ist3931初始化
- void Write_ist3931_init1()
- {
- Write_ist3931_com(0x3a);// 开启时钟振荡P27(命令5)
- Write_ist3931_com(0x61);//行排列方式【正常(默认)】P39(命令28
- Write_ist3931_com(0x2f);//升压器开P27;P44(2)
- Write_ist3931_com(0xb1);//设置升压电压P32(17)
- Write_ist3931_com(200);//设置升压电压值(对比度)【0-255】P32(17)
- Write_ist3931_com(0x34);//LCD Blass(亮度)[0X30-0X37]P27(3)
- Write_ist3931_com(0x62);//行、列方向,全亮,正反显【当前全亮(0x60为正常)】P28(8)
- //delay_iic(20);//
- //Write_ist3931_two(0xa2,0x90);//占空比高3位,占空比低4位
- Write_ist3931_com(0x91);//占空比低4位P29(10)//用到多少行,占空比就写多少
- Write_ist3931_com(0xa2);//占空比高3位P29(10)//当前设为【 0x21(33)】
- //Write_ist3931_two(0x41,0x52);
- Write_ist3931_com(0x40);//低4位P28(7)起始行对应硬件的com,用于行没有达到64行的应用场景
- Write_ist3931_com(0x50);//高3位P28(7)起始行对应硬件的com,用于行没有达到64行的应用场景
- Write_ist3931_com(0x3d);//开显示
- //delay_iic(20);//
- }
复制代码 初始化中点亮了所有的点,所以要在清屏前或后,灭掉
- Write_ist3931_com(0x60);//行、列方向,全亮,正反显【当前正常(0x60为正常)】P28(8)
-
复制代码
清屏
- void ist3931_disp_clear(void) //清屏()
- {
- uint i,j;
- Write_ist3931_com(0x10);//设置行地址,高3位(Y)P27(1)
- Write_ist3931_com(0x00);//设置行地址,低4位(Y)P27(1)
- Write_ist3931_com(0xc0);//设置列地址,8个列为一个地址,故地址小于17,P30(11)
-
- for(i=0;i<1170;i++)//18个(8位,一个字节)数组列,65行 P23
- {
- Write_ist3931_dat(0x00);//
- }
-
- }
复制代码
写一个16X8字符 //水平扫描,从左到右,从上到下,高位在前
- void ist3931_font16x8(uchar x,uchar y,uchar num) //写一个16x16汉字
- { //y取值8-0;
- uchar xx,yy,i,j;
- for(i=0;i<16;i++)
- {
- if(i%2==0)
- {
- yy=24-i/2+y;
- Write_ist3931_com(0x10+yy/16);//设置行地址,高3位(Y)P27(1)
- Write_ist3931_com(0x00+yy%16);//设置行地址,低4位(Y)P27(1)
- Write_ist3931_com(0xc0+x);//设置列地址,8个列为一个地址,故地址小于17,P30(11)
-
- Write_ist3931_dat(font16x8[num][i]);//
-
- }
- else
- {
- yy=7-i/2+y;
- Write_ist3931_com(0x10+yy/16);//设置行地址,高3位(Y)P27(1)
- Write_ist3931_com(0x00+yy%16);//设置行地址,低4位(Y)P27(1)
- Write_ist3931_com(0xc0+x);//设置列地址,8个列为一个地址,故地址小于17,P30(11)
-
- Write_ist3931_dat(font16x8[num][i]);//
-
- }
- }
-
- }
复制代码 写一个16x16汉字//水平扫描,从左到右,从上到下,高位在前
- void ist3931_hanzi16x16(uchar x,uchar y,uchar num) //写一个16x16汉字
- { //y取值8-0;
- uchar xx,yy,i,j;
- for(i=0;i<16;i++)
- {
- if(i%2==0)
- {
- yy=24-i/2+y;
- Write_ist3931_com(0x10+yy/16);//设置行地址,高3位(Y)P27(1)
- Write_ist3931_com(0x00+yy%16);//设置行地址,低4位(Y)P27(1)
- Write_ist3931_com(0xc0+x);//设置列地址,8个列为一个地址,故地址小于17,P30(11)
-
-
- Write_ist3931_dat(hanzi16x16[num][i*2]);//
- Write_ist3931_dat(hanzi16x16[num][i*2+1]);//
- }
- else
- {
- yy=7-i/2+y;
- Write_ist3931_com(0x10+yy/16);//设置行地址,高3位(Y)P27(1)
- Write_ist3931_com(0x00+yy%16);//设置行地址,低4位(Y)P27(1)
- Write_ist3931_com(0xc0+x);//设置列地址,8个列为一个地址,故地址小于17,P30(11)
-
-
- Write_ist3931_dat(hanzi16x16[num][i*2]);//
- Write_ist3931_dat(hanzi16x16[num][i*2+1]);//
- }
- }
-
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|