⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acm-12864汉字液晶显示驱动程序.txt

📁 ACM-12864汉字液晶显示(lcd显示)驱动程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  qushu(0xe,TAB1A);                 //调用取数函数,共14个数据,保存在数组TAB1A里
}

//-------------------------------------------
//显示学校web函数  
void han_wr2b()
{
  send_i(0x90);                    //设置显示位置:第二行
  qushu(0x10,TAB1B);               //调用取数函数,共16个数据,保存在数组TAB1B里
}  
  
//-------------------------------------------
//显示学校tel函数
void han_wr2c()
{
  send_i(0x88);                   //设置显示位置:第三行
  qushu(0X10,TAB1C);              //调用取数函数,共16个数据,保存在数组TAB1C里
}

//-------------------------------------------
//显示学校fax函数
void han_wr2d()
{
  send_i(0x98);                  //设置显示位置:第四行
  qushu(0X10,TAB1D);             //调用取数函数,共16个数据,保存在数组TAB1D里
}

//有关显示设置函数
void wr_zb()
{
  send_i(lcd_y);
  send_i(lcd_x);
}

//-------------------------------------------
//显示闪烁函数
void flash()
{
  send_i(0x08);                  //关显示
  delay1();                      //延长一定时间
  send_i(0x0c);                  //开显示
  delay1();
  delay1();                      //延长关显示两倍的时间
  send_i(0x08);                  //关显示
  delay1();
  send_i(0x0c);                  //开显示
  delay1();
  delay1();
  send_i(0x08);                  //关显示
  delay1();
  send_i(0x0c);                  //开显示
  delay1();
  delay1();
}






继续

//-------------------------------------------
//清屏函数
void clear_p()
{
  send_i(0x1);                   //清除所有显示
  send_i(0x34);                  //扩展指令操作
  send_i(0x30);                  //基本指令操作
}

//------------------------------------------
//查表函数
void qushu(int counts,const unsigned char *ps)
{
  int i;                         //定义循环变量
  for(i=counts;i>0;i--)          //循环counts次
     {  
        send_d(*ps);             //查表取数并调用显示一个字节数据函数送显示
        delay();                 //延长一定时间,确保能看到数据一个个的显示出来
        ps++;                    //取下一个数据
     }
}

//-------------------------------------------
//显示一字节数据函数
void send_d(unsigned char x)
{
   chk_busy();                  //检测LCD是否工作繁忙
   rs=1;                        //设置该字节数据是显示数据
   rw=0;                        //设置该次操作为写
   PORTD=x;                     //送数据口PORTD
   e=1;                         //使能
   nop();
   nop();
   nop();                       
   e=0;                         //禁止
}

//--------------------------------------------
//送一字节命令代码函数
void send_i(unsigned char x)
{
   chk_busy();                  //检测LCD是否工作繁忙
   rs=0;                        //设置该字节数据为控制命令
   rw=0;                        //设置此次操作为写
   PORTD=x;                     //送数据口PORTD
   e=1;                         //使能
   nop();
   nop();
   nop();
   e=0;                         //禁止
}

//-------------------------------------------
//检测LCD是否工作繁忙
void chk_busy()
{  
   busy=1;                      //先置位繁忙标志位
   TRISD=0XFF;                  //更改通信为输入
   rs=0;                        //设置该字节数据为命令代码
   rw=1;                        //设置此次操作为读
   while(busy)                  
      {
         nop();
         nop();
         nop();
         e=1;                   //使能
         nop();
         nop();
         nop();
         if(!RD7) busy=0;       //检测LCD是否工作繁忙
         nop();
         nop();
         nop();
         e=0;                   //禁止
      }
   e=0;                         //禁止
   TRISD=0X00;                  //恢复通信为输出
 }

//-------------------------------------------
//延时函数
void delay()
{
    int i;
    for(i=0;i<5000;i++)
       {;}
}

//-------------------------------------------
//延时函数1
void delay1()
{
    int i;
    for(i=0;i<10;i++)
      {
        delay();               //调用延时函数
      }
} 














//带中文字库的12864LCD显示程序
#include <reg52.H>
#include <intrins.H>

#define uchar unsigned char
#define uint unsigned int

sbit dula = P2^6;
sbit wela = P2^7;
//SCM12864-05端口定义
#define LCD_DATA P0 //数据口
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
sbit RW = P3^6; //并行读写选择信号, H读, L写
sbit E = P3^4; //并行使能端, H有效, L无效
sbit PSB = P3^7; //并/串接口选择, H并,L串
sbit RET = P3^3; //复位, L有效

uchar code datas1[] = {"广东工业大学"};
uchar code datas2[] = {"自动化学院2004级"};
uchar code datas3[] = {"网络工程 (4)班"};
uchar code datas4[] = {"fengmk2@gmail.com"};

//延时约2us
void delayUs()
{
    _nop_();_nop_();
}
//延时 a * 1ms
void delayMs(uint a)
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
}

//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
bit checkBusy()
{
    bit busy;
    RS = 0;
    RW = 1;
    E = 1;
    delayUs();
    busy = (bit)(LCD_DATA&0x80);
    E = 0;
    return busy;
}

//等待LCD到空闲
void wait()
{
    while(checkBusy());
}

//写命令
void writeCmd(uchar cmd)
{
    wait();
    RS = 0;
    RW = 0;
    E = 0;
    delayUs();
    LCD_DATA = cmd;
    delayUs();
    E = 1;
    delayUs();
    E = 0;
}

//写数据
void writeData(uchar dat)
{
    wait();
    RS = 1;
    RW = 0;
    E = 0;
    delayUs();
    LCD_DATA = dat;
    delayUs();
    E = 1;
    delayUs();
    E = 0;
}

//初始化LCD
void init()
{
    PSB = 1; //并口方式
    writeCmd(0x30); //基本指令, 扩充指令为34H
    delayMs(10);
    writeCmd(0x0c); //显示开, 关光标
    delayMs(10);
    writeCmd(0x01); //清屏
    delayMs(10);
}

void setPosition(uchar x, uchar y)
{
    uchar p;
    switch(x%4)
    {
        case 0: p = 0x80; break; //第一行开始地址
        case 1: p = 0x90; break; //第二行
        case 2: p = 0x88; break; //第三行
        case 3: p = 0x98; break; //第四行
    }
    p += y;
    writeCmd(p);
}

void writeString(uchar * str)
{
    uchar i = 0;
    while(str[i] != '\0')
    {
        writeData(str[i++]);
    }
}

/**//***************************LCD12864***************************************/

void main()
{
    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
    dula = wela = 0;
    init();
    setPosition(0, 0);
    writeString(datas1);
    setPosition(1, 0);
    writeString(datas2);
    setPosition(2, 0);
    writeString(datas3);
    setPosition(3, 0);
    writeString(datas4);
    while(1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -