11066 发表于 2021-1-24 19:57

基于Proteus学习单片机系列(十一)——LCD12864

本帖最后由 11066 于 2021-1-24 19:58 编辑

#申请原创# #技术资源#
回复本贴,获取更多单片机资料
https://pan.baidu.com/s/15Z8WdZUz2XXd7slChW6NAA原文地址:https://blog.csdn.net/qq_39020934/article/details/80051715

提取码:lgmh

1、电路图


2、驱动代码

#include <intrins.h>
#include<ziku.c>

#define uchar unsigned char
#define uint unsigned int
uchar num[] = "0123456789";      
sbit REST = P2^0;                                                                                                                  //Reset signal, active"L"
sbit C_D = P2^1;                                                                                                                        //L:data   H:code
sbit C_E = P2^2;                                                                                                                        //Chip enable signal, active"L"
sbit R_D = P2^3;                                                                                                                        //read signal, active"L"
sbit W_R = P2^4;                                                                                                                        //write signal, active"L"
#define width                                       15                                                                                        //显示区宽度
#define Graphic                     1
#define TXT                              0
#define LcmLengthDots            128
#define LcmWidthDots             64                                                                                                                                                                                                                                       
/**************************12864液晶的相关函数**********************/                                                                           
void delay_nms(uint i)
{
      while(i)
      i--;
}
void write_commond(uchar com)                                                                                                //对液晶写一个指令
{                                                                                          
      C_E = 0;      
      C_D = 1;
      R_D = 1;
      P0 = com;
      W_R = 0;                                                                                                                              // write         
      _nop_();                                       
      W_R = 1;                                                                                                                              // disable write
      C_E = 1;                                                                              
      C_D = 0;
}
void write_date(uchar dat)                                                                                                      //对液晶写一个数据
{
      C_E = 0;
      C_D = 0;
      R_D = 1;
      P0 = dat;
      W_R = 0;
      _nop_();
      W_R = 1;
      C_E = 1;
      C_D = 1;
}
void write_dc(uchar com,uchar dat)                                                                                        //写一个指令和一个数据
{
      write_date(dat);
      write_commond(com);
}
//写一个指令和两个数据
void write_ddc(uchar com,uchar dat1,uchar dat2)
{
      write_date(dat1);
      write_date(dat2);
      write_commond(com);
}
//LCD初始化函数
void F12864_init(void)
{      
      REST = 0;
      delay_nms(2000);                                       
      REST = 1;
      write_ddc(0x40,0x00,0x00);                                                                                              //设置文本显示区首地址
      write_ddc(0x41,128/8,0x00);                                                                                          //设置文本显示区宽度
      write_ddc(0x42,0x00,0x08);                                                                                              //设置图形显示区首地址0x0800
      write_ddc(0x43,128/8,0x00);                                                                                          //设置图形显示区宽度
      write_commond(0xA0);                                                                                        //设置光标形状 8x8方块
      write_commond(0x80);                                                                                        //显示方式设置 文本and图形(异或)
      write_commond(0x92);                                                                                        //设置光标
      write_commond(0x9F);                                                                                        //显示开关设置 文本开,图形开,光标闪烁关                                                               
}
//**************************//清显示存储器函数
void F12864_clear(void)
{
      unsigned int i;
      write_ddc(0x24,0x00,0x00);                                                                                                 //置地址指针为从零开始
         write_commond(0xb0);                                                                                                         //自动写
      for(i = 0;i < 128 * 64 ;i++)write_date(0x00);                                                         //清一屏
      write_commond(0xb2);                                                                                                         //自动写结束
      write_ddc(0x24,0x00,0x00);                                                                                                 //重置地址指针
}
//设定显示的地址
void goto_xy(uchar x,uchar y,uchar mode)
{
   uinttemp;
   temp = 128 / 8 * y + x;
   if(mode)                                                                                                 //mode = 1为Graphic
   {                                                                                                      //如果图形模式要加上图形区首地址0x0800
         temp = temp + 0x0100;
   }
   write_ddc(0x24,temp & 0xff,temp / 256);                                                                  //地址指针位置
}
//显示一个ASCII码函数
void Putchar(uchar x,uchar y,uchar Charbyte)
{
   goto_xy(x,y,TXT);
   write_dc(0xC4,Charbyte-32);                                                                                     //数据一次读写方式//查字符rom         
}
void display_string(uchar x,uchar y,uchar *p)
{
      while(*p != 0)
      {
                if(x > 15 )                                                                                          //自动换行         128*64
                {                                                                                       
                        x = 0;
                        y++;
                }
                Putchar(x,y,*p);
                ++x;
                ++p;
      }
}
void display_num(uchar x,uchar y,uchar z)
{
      uchar z1,z2;
      z1 = num;
      z2 = num;
      Putchar(x,y,z1);
      Putchar(x+1,y,z2);
}


//显示一串汉字,j = k + n为(n为要显示的字的个数),k为选择从哪个字开始
void dprintf_hanzi_string_1(struct typFNT_GB16 code *GB_16,uint X_pos,uint Y_pos,uchar j,uchar k)
{
      unsigned int address;
      unsigned char m,n;
      while(k < j)
      {
                m = 0;
                address = LcmLengthDots / 8 * Y_pos + X_pos + 0x0800;
                for(n = 0;n < 16;n++)                                                                  //计数值16
            {
                   write_ddc(0x24,(uchar)(address),(uchar)(address>>8));                        //设置显示存储器地址
                   write_dc(0xc0,GB_16.Mask);                                          //写入汉字字模左部
                   write_dc(0xc0,GB_16.Mask);                                             //写入汉字字模右部
                   address = address + 128/8;                                                   //修改显示存储器地址,显示下一列(共16列)
            }
                X_pos += 2;
                k++;
      }
}



caizhiwei 发表于 2021-1-26 21:45

还有人玩这个嗯

lindeijun 发表于 2021-4-16 10:15

初学,赞一个,谢谢啦!!

2669020082 发表于 2024-8-15 18:09

学习学习

dyx8899 发表于 2024-8-17 19:59

感谢分享

zhp7607 发表于 2024-11-28 11:20

初学,赞一个,谢谢啦!感谢分享

夜雨依丁 发表于 2024-12-10 14:53

初学,赞一个,谢谢分享

STCMCUNT018 发表于 2024-12-10 16:26



页: [1]
查看完整版本: 基于Proteus学习单片机系列(十一)——LCD12864