找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1485|回复: 0
打印 上一主题 下一主题
收起左侧

12864小程序

[复制链接]
跳转到指定楼层
楼主
ID:182821 发表于 2017-3-23 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include "config.h"


void delayus(uint t)
{
   uint i;
   for(i=0;i<t;i++);
}

void LCD12864_CheckBusy()
{
  uchar BusyFlag,num;
  num=10;
  LCD128_RS=0;
  LCD128_RW=1;
  delayus(10);
  BusyFlag=LCDdat&0x80;
  LCD128_EN=0;
  while(BusyFlag && (num--));
}
void TransferData(uchar dat,uchar mode)
{
LCD12864_CheckBusy();
LCD128_RS=mode;
LCD128_RW=0;
delayus(1);
LCDdat=dat;
LCD128_EN=1;
delayus(1);
LCD128_EN=0;
}
uchar LCD12864_RecData()
{

uchar temp;
  LCD12864_CheckBusy();
  LCD128_RS=1;
  LCD128_RW=1;
  LCD128_EN=1;
  temp=LCDdat;
  LCD128_EN=0;

  return (temp);
}


void LCD12864_SetPos(uchar x,uchar y)
{
  if (y>=64) {CS2=0;CS1=1;y=y-64;}  //右屏显示
  else {CS2=1;CS1=0;}           //左屏显示
  TransferData((0x40 | y),WrCom);  
  TransferData((0xb8 | x),WrCom);
}

void LCD12864_Init()
{
TransferData(LCD_BASIC_FUNCTION,WrCom);
delayus(10);
TransferData(LCD_DISPLAY_SET,WrCom);
delayus(10);
TransferData(LCD_CLEAR_SCREEN,WrCom);
delayus(10);
TransferData(LCD_POSSHIFT_RIGHT,WrCom);
delayus(10);
}

void DisCh(uchar x,uchar y,uchar *p)
{
uchar i;
  for(i=0;i<16;i++)
   {
         LCD12864_SetPos(2*x,16*y+i);
         TransferData(p[i],WrDat);
         LCD12864_SetPos(2*x+1,16*y+i);
         TransferData(p[i+16],WrDat);  
   }
}
void SetLine(uchar line)   //line ->0....7
{
line=line & 0x07;  //max 7
line=line | 0xb8;
TransferData(line,WrCom);
}
void SetColum(uchar colum)  //colum->0....63
{
  colum=colum & 0x3f;   //max 64
  colum=colum | 0x40;
TransferData(colum,WrCom);
}

//以下程序为PROTEUS仿真,带字库的
/***********************
12864设定初始显示位置
X为行的数目
Y为列的数目
***********************/
void LCD12864_SetPoint(uchar X,uchar Y)
{
        uchar pos;
        TransferData(0x30,WrCom);
        if     (X==1){X=0x80;}
        else if(X==2){X=0x90;}
    else if(X==3){X=0x88;}
        else if(X==4){X=0x98;}
        pos=X+Y;
        TransferData(pos,WrCom);
}
/*****************************************
设置图像显示模式
select=0时,关闭图形显示模式
Select=1时,开启图形显示模式
LCD_EXTEND_FUNCTION为 扩展指令集
LCD_GRAPH_ON        打开绘图模式命令
LCD_GRAPH_OFF        关闭绘图模式命令
******************************************/
void LCD12864_SetMode(unsigned char Select)
{
        TransferData(LCD_EXTERND_FUNCTION,WrCom);  
        if(Select){TransferData(LCD_GRAPH_ON,WrCom);}
        else      {TransferData(LCD_GRAPH_OFF,WrCom);}      
}
/*************************************
向LCD指定起始位置写入一个字符串
*************************************/
void LCD12864_DisplayString(unsigned char x,unsigned char y,unsigned char *Str)
{          
        if((y>4)||(x>8)) return;
        LCD12864_SetPoint(x,y);       
        while(*Str>0)
        { TransferData(*Str,WrDat); Str++;}
}
/*********************************************
向LCD写入一个8位的ASCII码
以显示相应的字符
**********************************************/                                                                                                                                               
void LCD12864_SendASCII(uchar hang,uchar lie,char sign)
{

    LCD12864_SetPoint(hang,lie);                 
    TransferData(sign,WrDat);         
         
}
/***************************************
向LCD指定坐标写入一个象素,象素颜色有两种,
0代表白(无显示),1代表黑(有显示)
****************************************/
void LCD12864_WritePixel(unsigned char x,unsigned char y,unsigned char color)
{

    unsigned char x_Dyte,y_Dyte,x_bite;                                //定义列地址的字节位,及在字节中的哪1位
    unsigned char GDRAM_hbit,GDRAM_lbit;                                //定义为上下两个屏(取值为0,1),行地址(取值为0~31)

x_Dyte=x/16;
x_bite=x&0x0f;
if(y<32)
        {
                y_Dyte=y;
        }
else
        {
                y_Dyte=y-32;
                x_Dyte=x_Dyte+8;
        }
TransferData(LCD_EXTERND_FUNCTION,WrCom);
TransferData(LCD_GRAPH_ON,WrCom);
TransferData(0x80+y_Dyte,WrCom);
TransferData(0x80+x_Dyte,WrCom);
LCD12864_RecData();
GDRAM_hbit=LCD12864_RecData();
GDRAM_lbit=LCD12864_RecData();
if(x_bite<8)
          {
          switch(color)
                {
                         case 0 :GDRAM_hbit&=(~(1<<(7-x_bite)));break;   //set 0
                         case 1 :GDRAM_hbit|=(1<<(7-x_bite));   break;   //set 1
                         case 2 :GDRAM_hbit^=(1<<(7-x_bite));        break;   //qufan
                         default :break;
                }
        }
else
        {
                  switch(color)
                {
                         case 0 :GDRAM_lbit&=(~(1<<(15-x_bite)));break;
                         case 1 :GDRAM_lbit|=(1<<(15-x_bite));   break;
                         case 2 :GDRAM_lbit^=(1<<(15-x_bite));        break;
                         default :break;
                }

       

        }
TransferData(0x80+y_Dyte,WrCom);
TransferData(0x80+x_Dyte,WrCom);
TransferData(GDRAM_hbit,WrCom);
TransferData(GDRAM_lbit,WrCom);
TransferData(LCD_EXTERND_FUNCTION,WrCom);
TransferData(LCD_GRAPH_OFF,WrCom);
}
/***********************************************************
函数名:  disp_picture
函数说明: 显示一幅128*64的图画
传入参数:图形指针*img
传出参数:无
返回值:  无
**********************************************************/
void LCD12864_DisplayPicAll(unsigned char *img)
{
  unsigned char i,j;
  LCD12864_SetMode(1);
  for(j=0;j<32;j++)
  {
    for(i=0;i<8;i++)
    {
      TransferData(0X34,WrCom);
      TransferData(0x80+j,WrCom);
      TransferData(0x80+i,WrCom);
      TransferData(0X30,WrCom);

      TransferData(img[j*16+i*2],WrDat);
      TransferData(img[j*16+i*2+1],WrDat);
    }
  }
  for(j=32;j<64;j++)
  {
    for(i=0;i<8;i++)
      TransferData(0X34,WrCom);
      TransferData(0x80+j-32,WrCom);
      TransferData(0x80+i+8,WrCom);
      TransferData(0X30,WrCom);

      TransferData(img[j*16+i*2],WrDat);
      TransferData(img[j*16+i*2+1],WrDat);
    }

    LCD12864_SetMode(1);
}
/***************************************
向LCD指定位置画一条长度为Length的指定颜色的水平线
****************************************/
void LCD12864_DrawLineH(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color)
{
        unsigned char count;
        if(Length==0)return;
        LCD12864_SetMode(0);       
        for(count=0;count<Length;count++)
        {LCD12864_WritePixel(x+count,y,Color);}
        LCD12864_SetMode(1);       
}
/***************************************
向LCD指定位置画一条长度为Length的指定颜色的垂直线
****************************************/
void LCD12864_DrawLineV(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color)
{
        unsigned char count;
        if(Length==0)        return;
        for(count=0;count<Length;count++)
        {LCD12864_WritePixel(x,y+count,Color);}       
}











分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表