纠结了2天1602的cgram,请指教

2020-02-05 09:11发布

DD RAM DATA
CHARACTER CODES   CGRAM ADDRESS      CGRAM DATA PETERNS
7 6 5 4 3 2 1 0    5 4 3 2 1 0           7 6 5 4 3 2 1 0
LLLLXLLL                L L L                L H H H H
                        L L H                H L L L L
                        L H L                H L L L L
                        L H H                L H H H L
                   LLL  H L L            XXX L L L L H
                        H L H                L L L L H
                        H H L                H H H H L
                        H H H
    zhey这样显示的就是一个S型
自编字形的列位置对应于CGRA DATA 的0—4 位,行位置对应于
CGRAM ADDRESS 的0—2 位 这个是咋么对应的,还有1602两行5*8的单元格一共有32个,我想问就是自定义的单元格最多是可以定义多少个
希望哪个知道的告诉我一下 ,先谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
Edward3121
2020-02-05 17:37
我正好刚研究完1602的CGRAM。具体是这样的

1602总共有8x8字节的CGRAM,如果用5x8点阵,就只能写8个字,如果用5x11点阵就只有4个字了。
就是说有8个CGRAM,每个CGRAM有8个字节的空间,这8个字节对应着5x8点阵的8行。
定义好的字符对应的DDRAM地址是0x00-0x07,直接调用就好。

我举个例子:

unsigned char code chs[][8]={             //LCD自造字符数据
0x04,0x04,0x04,0x07,0x04,0x04,0x1f,0x00,  //上
0x1f,0x04,0x04,0x06,0x05,0x04,0x04,0x00};//下
unsigned char code cgramaddr[][8]={          //CGRAM地址
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,  //第一个
0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f};//第二个

char i;

for(i=0;i<2;i++)                          //循环写入第一个和第二个CGRAM
{
        for(j=0;j<8;j++)
        {
                lcdwrite_cmd(cgramaddr[j]);//lcdwrite_cmd是1602命令写入子函数
                lcdwrite_dat(chs[j]);      //lcdwrite_dat是1602数据写入子函数
        }
}

//1602经过初始化之后可以直接执行下列函数

lcdwrite_dat('a'); //这是直接写入字符a
lcdwrite_dat(0x61);//通过写入DDRAM地址显示字符a
lcdwrite_dat(0x00);//写入DDRAM地址显示第一个自定义字符
lcdwrite_dat(0x01);//写入DDRAM地址显示第二个自定义字符

一周热门 更多>