• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

Proteus中的12864如何显示想要显示的字

艾笠调查团 2016-11-07 浏览量:1320
RT,我用的是元器件中的12864没字库的,纵向取模,字节倒序,搞清了原理就写了一个程序,但有很大问题...哪里有问题呢?
顺便再问一下,这个Proteus中的12864和现实中带字库的12864有什么主要区别,比如Proteus中是分页,现实中是可以控制输入模式等...
求大家帮帮忙~
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit en=P3^4;
sbit rs=P3^5;
sbit rw=P3^6;
sbit cs1=P3^0;
sbit cs2=P3^1;
uchar code chen[]={0x40,0x42,0xCC,0x00,0x00,0x40,0x30,0x1E,0x10,
0xF0,0x10,0x10,0x18,0x10,0x00,0x00, 0x00,0x00,0x3F,0x10,0x08,0x01,
0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x00,0x00};

void delay(uchar z)
{
uchar a;
for(z=z;z>0;z--)
for(a=114;a>0;a--);
}

void read()
{
uchar r;
rs=0;
rw=1;
en=0;
do
{
P2=0x00;
en=1;
r=P2;
delay(2);
en=0;
delay(2);
r=0x80&r;
}
while(!(r==0x00));

}

void write_com(uchar com)
{
read();
rw=0;
rs=0;
en=0;
P2=com;
delay(2);
en=1;
delay(2);
en=0;
}

void write_dat(uchar dat)
{
read();
rw=0;
rs=1;
en=0;
P2=dat;
delay(2);
en=1;
delay(2);
en=0;
}

void hanzi(uchar ye,uchar lie,uchar *daima)
{
uchar i,j;
for(i=0;i<2;i++)
{
write_com(0xb8+ye+i);
delay(5);
write_com(0x40+lie);
for(j=0;j<16;j++)
write_dat(daima[i*16+j]);
}
}

void clear()
{
uchar i,j;
cs1=0;
cs2=0;
for(i=0;i<8;i++)
{
write_com(0xb8+i);
delay(5);
write_com(0x40);
for(j=0;j<64;j++)
write_dat(0x00);
}
}

void init()
{
delay(10);
cs1=cs2=1;
delay(10);
write_com(0x3e);
delay(5);
write_com(0xc0);
delay(5);
write_com(0xb8);
delay(5);
write_com(0x40);
delay(5);
write_com(0x3f);
}

void main()
{
init();
clear();
while(1)
{
cs1=0;
cs2=1;
hanzi(0,0,chen);
}
}

1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
其他答案 数量:3
  • 本帖最后由 MOP 于 2016-11-8 23:45 编辑

    就是分有無字庫,就是看控制IC是不是ST7920,是的話指令集會不同,會有擴展跟非擴展,我看了指令都跟原本的無字庫(KS0108)控制IC不同,另外Proteus的LCD12864是無字庫的

    ST7920的普通指令集


    ST7920的擴展指令集


    無字庫的指令集(KS0108)

    另外看Code的話,您的CS是有問題的
    void hanzi(uchar ye,uchar lie,uchar *daima)
    {
         uchar i,j,col;
         col=lie;
         for(i=0;i<2;i++)
         {
            if(col>63)//起始點判斷
            {
               cs1=0;
               cs2=1;
               col=col-64;
            }
           else
           {
               cs1=1;
               cs2=0;
            }
            
            write_com(0xb8+ye+i);
            delay(5);
            write_com(0x40+col);
            for(j=0;j<16;j++)
            {
                write_dat(daima[i*16+j]);
                col=col+8;
                if(col>63)//寫數據中,超過邊界時
                {
                   col=col-64;
                   if(lie>63)
                   {
                      cs1=1;
                      cs2=0;
                   }
                   else
                   {
                      cs1=0;
                      cs2=1;
                   }
                   write_com(0xb8+ye+i);
                   delay(5);
                   write_com(0x40+col);
                }
            }
            col=lie;
         }       
    }
    
    改過的函式假設您的參數範圍Page(ye)0~7,Column(lie)0~127,這樣顯示時,會在同一行,但這寫法只保證lie為8的倍數才不會截斷任何data,另外字串長度一個Page也不可超過8字

    void init()
    {
       delay(10);
       cs1=1;
       cs2=1;
    分成兩行才不會cs1去讀取cs2的值來指派

    void clear()
    {
        uchar i,j;
        cs1=1;
        cs2=1;
        for(i=0;i<8;i++)
        {
             write_com(0xb8+i);
             delay(5);
             write_com(0x40);
             for(j=0;j<64;j++)
                 write_dat(0x00);
        }
    }
    清除時,兩個cs應都設為1

    void read()
    {
       volatile uchar r;
    習慣給I/O變數加上volatile

    void main()
    {
        init();
        clear();
        while(1)
        {
            hanzi(0,0,chen);
        }
    }
    更改main函式,讓函式自己依照起始位置來決定cs1和cs2

    以上您試看看
    • 发布于2016-11-08
    • 举报
    • 评论 0
    • 1
    • 0

  • MOP 发表于 2016-11-8 03:14
    就是分有無字庫,就是看控制IC是不是ST7920,是的話指令集會不同,會有擴展跟非擴展,我看了指令都跟原本的無字 ...

    您好,看了您的回复之后我立刻去试了试,但还是不对...今天一天我又写了两遍,但还是出现这种毛病,另外我去问了一下,数据是按照我想的那样写入的,默认开始的Y坐标是0x40+16*n,您加的col作用就不太不懂了...我明天去实验室拿实物再试试吧
    • 发布于2016-11-08
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

Proteus中的12864如何显示想要显示的字