找回密码
 立即注册
楼主: durongze

st7920学习记录

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-9-12 12:38:36 | 显示全部楼层
上面是写的方式的总结,下面我们来看下每个字节是怎么写入的。
/*----------------------------?1???????----------------------------*/
截图202409121238283270.jpg

void LCD12864_Write_Byte(unsigned char temp)
{
        unsigned char i;
        for(i=0; i<8; i++) {
                if((temp<<i)&0x80)
                        LCD12864_SID=1;
                else
                        LCD12864_SID=0;
                LCD12864_SCLK=0;
                LCD12864_SCLK=1;
        }
}

/*----------------------------????????----------------------------*/
void LCD12864_Write(unsigned char Command,unsigned char temp)
{
        LCD12864_Write_Byte(Command);   //   用来区分当前的数据是属于命令还是数据。
        LCD12864_Write_Byte(temp&0xf0);  //  写当前字节的高4位
        LCD12864_Write_Byte((temp<<4)&0xf0); //  写当前字节的低4位
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-9-12 12:43:59 | 显示全部楼层
再强调一次, 要看这个读写操作之前,一定要注意  :
sbit    PSB    = P0^4;               //  PSB 接高时选择并口,接低时选择串口。 这个其实放在第一个位置比较好,它控制着其他所有管脚存在的意义。
PSB = 0;    //  PSB 接高时选择并口,接低时选择串口。 这个其实放在第一个位置比较好,它控制着其他所有管脚存在的意义。
只有先关注psb的值,才知道后面的操作到底是并口还是串口
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-9-12 12:55:28 | 显示全部楼层
在上面的例子中,我们总过做了3次功能设定,用了3种值,分别是0x30,    0x34,      0x36.

功能设定              0               0                 0                   0                       1                    DL               X                    0/RE              X                  X                72us
扩充功能设定      0                0                  0                   0                       1                    DL               X                   1/RE             G                    0              72us

“RE”是基本指令集与扩充指令集的选择控制位,当变更 “RE”的状态后,以后的指
令维持在最后的状态。除非再次变更“RE”的状态,否则使用相同的指令集时,不需要重新
设置“RE”
------------------------------------------
6)功能设定(FUNCTION SET) 初始值:0011 X0XX B (X=0,1)
格式 0 0 1 DL X 0/RE X X
DL:8/4 位接口控制位
DL=1,8 位MPU 接口;DL=1,4 位MPU 接口
RE:指令集选择控制位
RE=1,扩充指令集;RE=0,基本指令集
同一指令的动作不能同时改变DL 和RE,需先改变DL 再改变RE 才能确
保设置正确
-------------------------------------------------
5) 扩充功能设定
初始值:001 DL X100 B (DL=1,8BIT 并口;DL=0,4BIT 并口 X=0,1)
格式 0 0 1 DL X RE G X
DL:8/4 位接口控制位
DL=1,8 位MPU 接口;DL=1,4 位MPU 接口
RE:指令集选择控制位
RE=1,扩充指令集;RE=0,基本指令集
G:绘图显示控制位
G=1,绘图显示开;G=0,绘图显示关
同一指令的动作不能同时改变RE 及DL、G,需先改变DL 或G 再改变RE 才
能确保设置正确
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-9-12 14:50:52 | 显示全部楼层
以上是写字的操作,本楼我们来看一下显示图片的操作。

64×32 个字节的空间(由扩充指令设定绘图 RAM 地址),最多可以控制
256×64 点阵的二维绘图缓冲空间,在更改绘图 RAM 是,由扩充指令设置 GDRAM
地址先垂直地址后水平地址(连续 2 个字节的数据来定义垂直和水平地址),再
2 个字节的数据给绘图 RAM(先高 8 位后低 8 位)。

void Display_Data(unsigned char x,unsigned char y,unsigned char Data1,unsigned char Data2)
{
        LCD12864_Write(Write_Command,Setting_Basic_Instruction_Set);
        switch(y) {
        case 0:
                LCD12864_Write(Write_Command,0x80+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 1:
                LCD12864_Write(Write_Command,0x90+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 2:
                LCD12864_Write(Write_Command,0x88+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        case 3:
                LCD12864_Write(Write_Command,0x98+x);        //??DDRAM??
                Delay_10us();
                LCD12864_Write(Write_Data,Data1);
                LCD12864_Write(Write_Data,Data2);
                break;
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-9-12 15:01:45 | 显示全部楼层
duro*** 发表于 2024-9-12 14:50
以上是写字的操作,本楼我们来看一下显示图片的操作。

64×32 个字节的空间(由扩充指令设定绘图 RAM 地址 ...

怎么感觉这不像是显示图片呢? 感觉和写文字没区别。 写文字函数是遍历字符串地址空间,这个函数像是只写一个字(两字节)。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:233
  • 最近打卡:2025-04-30 16:08:37

61

主题

818

回帖

1490

积分

金牌会员

积分
1490
发表于 2024-9-12 15:32:12 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2024-9-14 09:26:30 | 显示全部楼层
至此, st7920的串行显示字符的流程就介绍完了.  下面我们接着看并行的.  先看8位并行.   再看4位并行.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-05-01 18:20:12

79

主题

631

回帖

1132

积分

金牌会员

积分
1132
发表于 2025-4-13 12:34:58 | 显示全部楼层
今天把这个又看了一遍,感觉有点烧脑。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:47 , Processed in 0.704998 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表