12864编程
clude "intrins.h" 
sbit io_LCD12864_RS = P1^0 ; 
sbit io_LCD12864_RW = P1^1 ; 
sbit io_LCD12864_EN = P1^2 ; 
 
#define io_LCD12864_DATAPORT P0 
 
#define SET_DATA    io_LCD12864_RS = 1 ; 
#define SET_INC      io_LCD12864_RS = 0 ; 
#define SET_READ   io_LCD12864_RW = 1 ; 
#define SET_WRITE io_LCD12864_RW = 0 ; 
#define SET_EN       io_LCD12864_EN = 1 ; 
#define CLR_EN       io_LCD12864_EN = 0 ; 
void v_Lcd12864CheckBusy_f( void )      //忙检测函数 
{ 
        unsigned int nTimeOut = 0 ; 
  SET_INC 
  SET_READ 
  CLR_EN 
  SET_EN 
  while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ; 
  CLR_EN 
  SET_INC 
  SET_READ 
} 
 
void v_Lcd12864SendCmd_f( unsigned char byCmd )     //发送命令 
{ 
  v_Lcd12864CheckBusy_f() ; 
        SET_INC 
  SET_WRITE 
  CLR_EN 
  io_LCD12864_DATAPORT = byCmd ; 
  _nop_(); 
  _nop_(); 
  SET_EN    
  _nop_(); 
  _nop_(); 
  CLR_EN 
  SET_READ 
  SET_INC 
} 
void v_Lcd12864SendData_f( unsigned char byData ) //发送数据 
{ 
  v_Lcd12864CheckBusy_f() ; 
        SET_DATA 
  SET_WRITE 
  CLR_EN 
  io_LCD12864_DATAPORT = byData ; 
  _nop_(); 
  _nop_(); 
  SET_EN    
  _nop_(); 
  _nop_(); 
  CLR_EN 
  SET_READ 
  SET_INC 
} 
 
void v_DelayMs_f( unsigned int nDelay )          //延时 
{ 
  unsigned int i ; 
        for( ; nDelay > 0 ; nDelay-- ) 
  { 
          for( i = 125 ; i > 0 ; i-- ) ; 
  } 
} 
 
void v_Lcd12864Init_f( void )              //初始化 
{ 
  v_Lcd12864SendCmd_f( 0x30 ) ;           //基本指令集 
  v_DelayMs_f( 50 ) ; 
  v_Lcd12864SendCmd_f( 0x01 ) ;           //清屏 
  v_DelayMs_f( 50 ) ; 
  v_Lcd12864SendCmd_f( 0x06 ) ;           //光标右移 
  v_DelayMs_f( 50 ) ; 
  v_Lcd12864SendCmd_f( 0x0c ) ;            //开显示 
} 
void v_Lcd12864SetAddress_f( unsigned char x, y )    //地址转换 
{ 
  unsigned char byAddress ; 
  switch( y ) 
  { 
    case 0 :  byAddress = 0x80 + x ; 
      break; 
    case 1 :  byAddress = 0x90 + x ; 
      break ; 
    case 2 :  byAddress = 0x88 + x ; 
      break ; 
    case 3 :       byAddress = 0x98 + x ; 
      break ; 
    default : 
      break ; 
  } 
  v_Lcd12864SendCmd_f( byAddress ) ; 
} 
void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char *pData ) 
{ 
  v_Lcd12864SetAddress_f( x, y ) ; 
  while( *pData != '\0' ) 
  { 
    v_Lcd12864SendData_f( *pData++ ) ; 
  }            
 
} 
void main( void ) 
{ 
  v_Lcd12864Init_f() ; 
 
  v_Lcd12864PutString_f( 0,0, "快乐随行") ; 
  v_Lcd12864PutString_f( 2,1, "分都不给") ; 
  v_Lcd12864PutString_f( 0,2, "*LCD12864ST7920*") ; 
  v_Lcd12864PutString_f( 0,3, "辛苦回答了半天") ; 
  while( 1 ) ; 
}
㈡ 单片机 12864液晶 我的8位数据线连接了P2.0-P2.5,和P1.2和P1.3,程序里怎么编程啊
这样接程序麻烦一些,执行效率也比较低,原来一条指令可以完成的操作现在需好多条指令才能实现 
原来这条语句  LCD12864_DA_PORT=DATE  要进行修改
如果P2.6-P2.7没有被占用,送数据时(变量名DATE)可以这样写 
P2=DATE;
if(DATE&0x80) P1^3=1;
else  P1^3=0;
if(DATE&0x40) P1^2=1;
else  P1^2=0;
如果P2.6-P2.7已被占用,送数据时(变量名DATE)可以这样写 :
temp1=0xc0&P2;/暂存P2高2位状态
P2=temp1|(0X3F&DATE);//取数据的低6位 加原来的高2位
if(DATE&0x80) P1^3=1;//取数据的第8位D7
else  P1^3=0;
if(DATE&0x40) P1^2=1;//取数据的第7位D6
else  P1^2=0;
以上是C语言程序,看起来不算长,但换成汇编语言又多了好几条指令,因此执行比较慢
㈢ 12864液晶不带字库的用C语言和51单片机编程
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define datawr 0x1200           //写数据通道
#define comwr 0x1000            //写控制命令通道
#define datare 0x1300           //读数据通道
#define comre 0x1100            //读忙通道
uchar code disp_data[]={"    浙江大学    "      //第一行,第一页
                        "04级通信工程一班"      //第三行
                        "  宁波理工学院  "      //第二行
                        "    竞赛小组    "      //第四行
                        "128X64液晶显示器"      //第一行,第二页
                        "    测试程序    "      //第三行
                        "  07年07月25日  "      //第二行
                        "    Tornado     "};    //第四行
void set12864();
void write_command(uchar command);
void write_page(uchar data_add);
void read_page(uchar data_add);
void delays(uchar cont);
void main()
{
    while(1)
    {
        set12864();             //初始化12864
        write_page(0);          //写入一页数据
        read_page(0x30);        //读出一页数据到内部RAM
        delays(2);              //延时2s
        write_page(64);         //写入下一页数据
        delays(2);              //延时2s
    }
}
//初始化12864子程序
void set12864()
{
    write_command(0x30);        //功能设定控制字
    write_command(0x0c);        //显示开关控制字
    write_command(0x01);        //清除屏幕控制字
    write_command(0x06);        //进入设定点控制字
}
//写控制命令子程序
void write_command(uchar command)
{
    bit flag="1";                 //12864空闲标志位
    while(flag)                 //检查12864是否空闲
        flag="XBYTE"[comre]&0x80;
    XBYTE[comwr]=command;       //空闲传送控制字
}
//写一页子程序
void write_page(uchar data_add)
{
    bit flag="1";                 //12864空闲标志位
    uchar num="64";               //64个循环,连续写入32个汉字或是64个西文字符
    write_command(0x80);
    for(;num>0;num--)
    {
        while(flag)             //检查12864是否空闲
            flag="XBYTE"[comre]&0x80;
        XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据
    }
}
//读一页子程序
void read_page(uchar data_add)
{
    bit flag="1";                 //12864空闲标志位
    uchar num="64";               //64个循环,连续写入32个汉字或是64个西文字符
    write_command(0x80);
    for(;num>0;num--)
    {
        while(flag)             //检查12864是否空闲
            flag="XBYTE"[comre]&0x80;
        DBYTE[data_add++]=XBYTE[datare]; //空闲传送数据
    }
}
//延时cont秒子程序
void delays(uchar count)
{
    unsigned char h,i,j,k;
    do
    {
    for(h=5;h>0;h--)
    for(i=4;i>0;i--)
    for(j=116;j>0;j--)
    for(k=214;k>0;k--);
    }while(--count);
}
这是图象显示程序:
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define datawr 0x1200           //写数据通道
#define comwr 0x1000            //写控制命令通道
#define datare 0x1300           //读数据通道
#define comre 0x1100            //读忙通道
uchar code disp_data[] =        // 数据表
{
      0x00,0x01,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
      0x00,0x01,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,
      0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,
      0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,
      0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,
      0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,
      0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,
      0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x80,0x00,0x00,0x00,
      0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,
      0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF,
      0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x0B,0xFF,
      0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x1F,
      0x01,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,
      0x01,0xFF,0xFF,0xFF,0xF3,0x79,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,
      0x03,0xFF,0xFF,0xFF,0xE6,0x62,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x60,0x00,0x68,
      0x01,0xFF,0xFF,0xFE,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x00,0x00,0x0E,
      0x01,0xFF,0xFF,0xF8,0x00,0x4B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x8E,0x08,0x79,
      0x07,0xFF,0xFF,0xF0,0x00,0x41,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6,0xC0,0x07,0x61,
      0xC3,0xFF,0xFE,0xC0,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xEF,0x3F,
      0x83,0xFF,0xFE,0x60,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xC0,0xFF,0xFD,0xFC,0x6C,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xF0,0x7F,0xF3,0xFF,0xFE,0x60,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xF3,0xFF,0xFF,0x50,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,
      0xFB,0xFF,0xF1,0xF8,0x8C,0xD8,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x6F,0xD9,
      0xC2,0x3F,0xF8,0x40,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xDF,0x1E,0xFF,
      0xFF,0x7F,0xFC,0x38,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x64,0x2F,0x6F,0xFF,
      0xFD,0x7B,0xFC,0x1F,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x5F,0x7C,0xEE,0xFF,
      0xC7,0xFF,0xBC,0x0F,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFE,0xEF,0xFF,
      0xFF,0xE7,0xDC,0x07,0xE7,0xF8,0x12,0x7F,0xFF,0xFF,0xFF,0xFF,0x47,0xFF,0xFF,0xFF,
      0xFF,0xE7,0x80,0x03,0xF4,0x00,0x00,0x5F,0xFF,0xFF,0xFE,0xFE,0xE3,0xFF,0xFF,0xFF,
      0xFF,0xFE,0xC0,0x01,0xC0,0x00,0x00,0x1B,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x7F,0xEE,0xC0,0x00,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFE,0x98,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x20,0x0E,0x60,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x05,0x80,0xE0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x09,0x80,0xA0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,
      0x85,0x2A,0xC0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
      0xBF,0xF3,0xC0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,
      0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,
      0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,0x1F,
      0xFF,0xFF,0x80,0x00,0x40,0x00,0x00,0x00,0xFF,0x80,0xFF,0xFF,0xFF,0x80,0x07,0xFF,
      0xFF,0xFF,0xC0,0x00,0xC0,0x00,0x00,0x01,0xFF,0x01,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,
      0xFF,0xFF,0xE0,0x63,0x80,0x00,0x00,0x01,0xFE,0x01,0xFF,0x18,0x00,0x3F,0xFF,0xFF,
      0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x01,0xCC,0x01,0xFE,0x00,0x07,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x07,0xA0,0x03,0xFC,0x00,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x05,0xC0,0x03,0xC8,0x00,0x7F,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x88,0x0C,0x07,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFC,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0,0x7F,0xFF,0xFF,
      0xFF,0xFF,0xF8,0x07,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0F,0xFF,0xFE,
      0xFF,0xFF,0xD0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x03,0xFF,0xF8,
      0xFF,0xFC,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xC0,
      0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xFF,0xF8,
      0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x1F,0xFE,
      0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,
      0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x02,0xFF,
      0xFE,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
      0xF0,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,
      0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,
      0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,
      0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
      0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
      0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01
};
void set12864();
void setxy(uchar x,uchar y);
void write_command(uchar command);
void write_16byte(uint data_add);
void delays(uchar count);
void main()
{
    uchar x,y,i;
    while(1)
    {
        y="0x80";                     //设置液晶上半部分坐标
        x="0x80";
        delays(2);                  //延时2s
        set12864();                 //初始化12864
        delays(2);
        for(i=0;i<32;i++)           //写入液晶上半图象部分
        {                           //写入坐标
            setxy(x,y);
            write_16byte(i*16);     //连续写入16字节数据
            y++;                    //y轴地址加1
        }                           
        y="0x80";                     //设置液晶下半部分坐标
        x="0x88";
        for(i=0;i<32;i++)           //写入液晶下半图象部分
        {
            setxy(x,y);             //写入坐标
            write_16byte((32+i)*16);//连续写入16字节数据
            y++;                    //y轴地址加1
        }
        write_command(0x34);        //写入扩充指令命令
        write_command(0x36);        //显示图象
    }
}
//初始化12864子程序
void set12864()
{
    write_command(0x30);        //功能设定控制字
    write_command(0x0c);        //显示开关控制字
    write_command(0x01);        //清除屏幕控制字
    write_command(0x06);        //进入设定点控制字
}
//设置绘图坐标
void setxy(uchar x,uchar y)
{                               
    write_command(0x34);        //写入扩充指令命令
    write_command(y);           //写入y轴坐标
    write_command(x);           //写入x轴坐标
    write_command(0x30);        //写入基本指令命令
}
//写控制命令子程序
void write_command(uchar command)
{
    bit flag="1";                 //12864空闲标志位
    while(flag)                 //检查12864是否空闲
        flag="XBYTE"[comre]&0x80;
    XBYTE[comwr]=command;       //空闲传送控制字
}
void write_16byte(uint data_add)
{
    bit flag="1";                 //12864空闲标志位
    uchar num="16";               //16个循环,连续写入16个字节
    for(;num>0;num--)
    {
        while(flag)             //检查12864是否空闲
            flag="XBYTE"[comre]&0x80;
        XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据
    }
}
//延时count秒子程序
void delays(uchar count)
{
    unsigned char h,i,j,k;
    do
    {
    for(h=5;h>0;h--)
    for(i=4;i>0;i--)
    for(j=116;j>0;j--)
    for(k=214;k>0;k--);
    }while(--count);
}
㈣ keil中12864编程
这样的函数要自己编的,就是所谓的驱动,keil连数码管的驱动都没有怎么会有12864的驱动呢,主要原因就是因为这样程序是和硬件连接有很大关系的,比如说你数据口用的P0,别人用的P1,你P0.0连的数据口0,别人就连到数据口1这样的程序根本没办法统一,所以keil不提供硬件的驱动函数
㈤ 驰宇微12864液晶屏怎样编程实现任意位置显示字和图形
驰宇微12864液晶屏带字库的LCD模块不需要取字模,只需要向LCD模块写入需要显示的汉字的GB2312代码就可以了,显示位置可用模块手册中的定位指令代码设置,切换到点阵图形模式,并设置好书写规律,在字模相应位置写入对应字模数据就可以了,比如16*16点阵,定义第一组两个8字节数据的起始位置,连续列入两字节,然后定位下一行起始地址,再写,重复上述过程直到写完一个字的全部16行,原理都是一样的,具体命令与实现方法或有不同。
㈥ 单片机 12864 液晶,C语言基本编程完美讲解[跪求]!!!
12864基本上都有八位的地址/数据线,和一些使能、R\W、片选、屏幕负压什么的引脚构成,编程基本思路就是先给送八位地址,在发八位数据,根据你的datasheet里的控制字资料(就是那个好多的表)往里依次写初始化命令,设置显示位置等,然后发数据就行了。。只能这么讲了,你C语言要是基础过关很容易看懂。。
