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

  • 如何
  • 艾笠调查团
  • LV2工程师
  • |      2016-11-07 21:29:15
  • 浏览量 1985
  • 回复:6
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); } } 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); } }
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:4
huihui163 2017-04-20
你好版主,我用的st7565R,你这个屏怎么看来区别上半屏和下半屏
0   回复
举报
发布
追梦少年 2017-01-07
谢谢楼主分享,楼主屌炸天了。
0   回复
举报
发布
艾笠调查团 2016-11-09
谢谢啦~
0   回复
举报
发布
MOP 2016-11-08
本帖最后由 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);

            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 以上您試看看
1   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子