微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD显示汉字

LCD显示汉字

时间:10-02 整理:3721RD 点击:
/*---LCD128*64---T6963C*/
#include  <reg51.h>
#include  <absacc.h>
#define uchar unsigned char
#define uint unsigned int
   
#define C_ADD XBYTE  [0x3fff]      /*设置LCD指令口地址*/
#define D_ADD XBYTE  [0x3ffe]      /*设置LCD数据口地址*/
uchar code zka[]={0x20,0x21,0x22,0x23,0x24,0x25,0xee};
uchar code zkb[]={0x26,0x27,0x28,0xee};
uchar code zkc[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xee};
uchar code zkd[]={0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0xee};
uchar code   *hzp;
bdata  uchar  flag;
sbit   flag0=flag^0;   
sbit   flag1=flag^1;
sbit   flag2=flag^2;
sbit   flag3=flag^3;
sbit   flag4=flag^4;
sbit   flag5=flag^5;
sbit   flag6=flag^6;
sbit   flag7=flag^7;  
bdata  uchar  STA;                 /*设置LCD状态字,将变量定位在片内RAM中*/
sbit   STA0=STA^0;                 /*设置LCD状态字位s0*/
sbit   STA1=STA^1;                 /*设置LCD状态字位s1*/
sbit   STA2=STA^2;                 /*设置LCD状态字位s2*/
sbit   STA3=STA^3;                 /*设置LCD状态字位s3*/
void   chinese();
void wait1 (void) {              /*查LCD状态字s0,s1位*/
   do {STA=C_ADD;} while(!(STA0&STA1)); /*s0,s1位与(指令,数据读写)为0则忙*/
}
/*void wait2 (void) {              查状LCD态字s2位
   do {STA=C_ADD;} while(!STA2);s2自动读为0则忙
}*/
void wait3 (void) {             /*查状LCD态字s3位*/
   do {STA=C_ADD;} while(!STA3);/*s3自动写为0则忙*/
}
void wcode0(uchar y)                   /*写LCD无参数指令代码*/
   {
    wait1();
    C_ADD=y;
   }

void wcode1(uchar x1,y)              /*写LCD单参数指令代码*/
   {
    wait1();
    D_ADD=x1;
    wait1();
    C_ADD=y;
   }
void wcode2(uchar x1,x2,y)          /*写LCD双参数指令代码*/
   {
    wait1();
    D_ADD=x1;
    wait1();
    D_ADD=x2;
    wait1();
    C_ADD=y;
   }
void init_lcd(void) {        /*LCD初始化设置*/
/*  wcode0(0xb2);                     关自动写*/
/*  wcode0(0x9c);                     文本开,图形开,光标闪烁、显示关闭*/
/*  wcode0(0x80);                    文本,图形或合成,选CGR0M*/
  wcode2 (0x00,0x00,0x40);
  wcode2 (0x10,0x00,0x41);  
  wcode2 (0x00,0x08,0x42);         /*设置图形显示区域首地址*/
  wcode2 (0x10,0x00,0x43);         /*设置图形显示区域宽度16字节*/
/*  wcode2 (0x00,0x08,0x42);         设置图形显示区域首地址*/
/*  wcode2 (0x20,0x00,0x43);         设置图形显示区域宽度*/
/*  wcode2 (0x00,0x00,0x24);         设置地址指针为0000H*/
/*  wcode2 (0x04,0x00,0x22);         设置CG偏移指针使CGRAM首地址为2000H*/
  wcode0 (0xa7);                    /*光标形状为一行(底线)*/
  wcode0 (0x80);
  wcode0 (0x9f);
}

void qp_lcd(void) {       /*清屏*/        
  uchar i;
  uint j;
  wcode2 (0x00,0x00,0x24);         /*设置显示缓冲区地址指针为0000H*/
  wcode0(0xb0);                     /*设置自动写*/
  for(i=0;i<32;i++) {
           for(j=0;j<256;j++) {
                 wait3();        
                 D_ADD=0x0;       /*写入0*/
           }
    }
  wcode0(0xb2);                     /*关自动写*/
}
dispaline(linex,roly,hz)               /*显示一个汉字子程序*/
    uchar linex;                     /*LCD上开始显示的字符列数:0--15*/
    uchar roly;                      /*LCD上开始显示的字符行数:0--8*/
    uchar code *hz;   
    {
    uchar i;
    uchar w,j;
    uchar shu;
    uint  add;
    uint  chadd;         
    uchar  addl;
    uchar  addh;
    w=*hz;                            /*取该句的第一个汉字*/
    while(w!=0xee){        /*该句未结束则等待*/   
      add=linex*256+2*roly;           /*w*roly为LCD行首在显示缓冲器中的列偏移地址*/
      chadd=w*32+(uint)&chinese;      /*linex*256为LCD行首在显示缓冲器中的行偏移地址*/
                /*256为128*64一行汉字所占的字节数*/
                /*480为240*64一行汉字所占的字节数*/                  
      addl=2*roly;        /*取汉字库地址*/
      for (i=0;i<16;i++){
            addl=add%256;             /*LCD上所在的行列在显示缓冲器中低地址*/  
            addh=add/256+8;            /*LCD上所在的行列在显示缓冲器中高地址*/  
            wcode2(addl,addh,0x24);   /*写入显示缓冲器的地址*/
            shu=CBYTE[chadd];         /*取该汉字的32个字节*/  
            if(!flag0) shu=~shu;  
//            for(j=0;j<16;j++)
            wcode1(shu,0xc0);         /*数据一次写*/
            chadd++;        /*汉字库地址加1*/
            shu=CBYTE[chadd];       /*取该汉字的32个字节*/  
            if(!flag0) shu=~shu;            
            wcode1(shu,0xc0);       /*数据一次写*/
            chadd++;        /*汉字库地址加1*/  
            add=add+16;        /*显示该汉字的下一行*/  
       }
        hz++;roly++;   /*取下一个汉字,字数加1*/
        w=*hz;  
     }
}
void main (void){
    uchar O_x;           /*行号*/
    uchar O_y;           /*列号*/
    init_lcd();                  /*LCD初始化设置*/
    qp_lcd();                    /*清屏*/        
    O_x=0x00;    /*第一行*/
    O_y=0x01;
    hzp=zka;           /*第一句*/
    flag0=0;    /*反写*/
    dispaline(O_x,O_y,hzp);  /*显示第一句*/
    O_x=0x02;    /*第二行*/
    O_y=0x02;
    hzp=zkb;    /*第2句*/
    flag0=1;
    dispaline(O_x,O_y,hzp);  /*显示第2句*/  
    while(1){;}      
    O_x=0x02;    /*第三行*/
    O_y=0x00;
    hzp=zkc;
    dispaline(O_x,O_y,hzp);     
    O_x=0x03;    /*第四行*/
    O_y=0x00;
    hzp=zkd;
    dispaline(O_x,O_y,hzp);
    while(1){}      
}
32

支持一下……

这个程序是不是就有点复杂啊!

这个程序下载进去好像不显示哦

我们公司的LCD 里面自带字库 可以节省很多开发时间
我司是专业生产单片机接口 的TFT-LCD 液晶模块  主要应用于工业自动化,仪表,仪器,医疗设备和军工产品。
武汉谷鑫科技有限公司 QQ1026821311   手机;18702705869  欢迎咨询

不错哦,小编挺好的,现在学习中

支持一下

不错的文档,值得收藏

棒,好帖子,不知道好不好用

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top