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

📄 lcd_display.c

📁 可以驱动240128的大液晶
💻 C
📖 第 1 页 / 共 2 页
字号:
//约定page1(即0X12寄存器为0XB1选择操作图层为page1)为文本层 
//,page2(0XB2选择操作图层为page2)为图层  
//0X00寄存器为0XC5时为图层,为0XCD时为文本层,每次调用函数时选择要用的层面,
//调用完后并不返回,初始化时为文本层。
#include <mega16.h>
#include <delay.h>
#include <math.h> 
#include <string.h> 
#include "stdlib.h"
 
//--------------------------------------------
#define DATA_DIR      DDRA             //定义数据方向入口
#define DATA_OUT      PORTA            //定义数据输出口
#define DATA_IN       PINA             //定义数据输入地址
#define WR_EN  DDRD.3
#define RD_EN  DDRD.4
#define CS_EN  DDRD.5
#define CD_EN  DDRD.6
#define RS_EN  DDRD.0
#define WR              PORTD.3          //定义外地址写使能  底电平有效
#define RD              PORTD.4          //定义外地址读使能  底电平有效
#define CS              PORTD.5          //定义外器件使能 底电平有效
#define CD              PORTD.6
          //即RS 定义液晶TC6393数据/指令通道 高电平为数据,低为指令
#define RS              PORTD.0          //这个为复位RESET

//送一帧数据
void post_msg(unsigned char msg)
{
 DATA_DIR=0xFF;                       //数据方向输出           
 DATA_OUT=msg;                        //输出数据
 CD=1;                                //置数据通道  
 CS=0;                                //选中外设                             
 WR=0;                                //外地址写数据开始
 WR=1;                                //写结束
 delay_us(3);                         //延迟等待
 CS=1;                                //关外设
}

//送一帧命令
void send_com(unsigned char addr,unsigned char data)
{    
   DATA_OUT=addr;                       //输出数据   //地址
   CD=0;                                //置命令通道
   CS=0;                                //选中外设  //可以接受指令
   WR=0;                                //外地址写数据开始 //低电位动作
   WR=1;                                //写结束 
   delay_us(3);                         //延迟等待
   CS=1;                                //关外设
   DATA_OUT=data;                       //输出数据 //指令
   CD=0;                                //置命令通道
   CS=0;                                //选中外设
   WR=0;                                //外地址写数据开始
   WR=1;                                //写结束 
   delay_us(3);                         //延迟等待
   CS=1;                                //关外设
}

//读一帧数据
unsigned char read_com(unsigned char addr)
{
   unsigned char temp;   
   DATA_OUT=addr;                       //输出数据 
   CD=0;                                //置命令通道
   CS=0;                                //选中外设
   WR=0;                                //外地址写数据开始
   WR=1;                                //写结束 
   delay_us(3);                         //延迟等待
   CS=1;                                //关外设
   DATA_DIR=0x00;
   DATA_OUT=0xFF;
   CD=1;
   CS=0;
   RD=0;
   RD=1;
   delay_us(3);
   temp=DATA_IN;
   CS=1;
   DATA_DIR=0xFF; 
   return(temp);             //PINC
}

void LCD_INIT()
{   
 WR_EN =1; 
 RD_EN =1; 
 CS_EN =1; 
 CD_EN =1; 
 RS_EN =1;
 DATA_DIR=0xFF;                         //输出允许
 CS=1;
 WR=1;
 CD=1;
 RD=1;
 RS=0;     
 delay_ms(300);   
 RS=1;
  
 send_com(0x00,0xCD);   //WLCR:电源正常模式,进入文本模式,屏幕开启,屏幕不闪烁,正向显示
 send_com(0x01,0x03);   //MISC:CLKOUT禁止,BUSY高电平触发,12MHz频率      
 send_com(0x02,0x00);   //APSR:ROM/RAM30ns读取速度,禁止ROM直读,开机滚动复位禁止
 send_com(0x03,0x80);   //ADSR:显示数据正序,水平,垂直卷动效显禁止

 send_com(0x10,0x6F);   //?WCCR:读DDRAM定地址,写自加,中英文对齐,正向存储,字体正常粗细,光标ON,闪烁
 send_com(0x11,0x10);   //DWLR:光标高度2Px,行距设定2Px
 send_com(0x12,0xB3);   //操作图层 同时两层图层
 //MAMR:图形方式光标先水平移动后垂直移动,两层或显示,图层1/2运行,灰度显示   
 send_com(0x20,0x1D);   //AWRR:设定右边视窗位置
 send_com(0x21,0x1D);   //DWRR:设定右边显示位置(=240/8-1)
 send_com(0x30,0x7F);   //AWBR:设定底部视窗位置
 send_com(0x31,0x80);   //DWBR:设定底部显示位置(=128-1)
 send_com(0x40,0x00);   //AWLR: 设定左边视窗位置
 send_com(0x41,0x00);   //DWLR: 设定左边显示位置(0x00)
 send_com(0x50,0x00);   //AWTR: 设定上部视窗位置
 send_com(0x51,0x00);   //DWTR: 设定上部显示位置(0x00)
 send_com(0x60,0x00);   //CPXR:  设定光标X坐标
 send_com(0x70,0x00);   //CPYR:  设定光标Y坐标
 send_com(0x71,0x00);   //BGCM: 设定水平移动模式下移动的起始X位置
 send_com(0x72,0xEF);   //EDCM: 设定水平移动模式下移动终止X位置 239
 send_com(0x80,0x60);   //BTMR: 设置光标闪烁频率 闪烁时间 = [80h]Bit[7..0] x (1/Frame_Rate) 
 send_com(0x81,0x40);   //FRCA: 通用寄存器,设置为0x40(must do that when reset the lcd)
 send_com(0x90,0x0F);   //SCCR: 设定XCL周期,即刷新频率,数值越大,刷新越慢
 send_com(0xF0,0xA0);   //简体字型(512kB) 字体ROM选择范围:ASCII自行解码
 send_com(0xF1,0x0F);   //字体大小置    正常
} 

//清屏函数,将文本层和图形层全清空
void clear_screen()
{
 unsigned int i;
 send_com(0x12,0xB3);            //光标先水平移动在垂直移动,显示两个图层
                                  //关系为或,同时存取数据
 send_com(0x60,0x00);            //光标回到左上角
 send_com(0x70,0x00);           //光标回到左上角
 for(i=0;i<3840;i++)post_msg(0x00);
}

//---显示字符串,包括中文字符,可混合中英文即符号 数字*************
//X0:列设置(0-29) Y0:行设置0 to 128=16*8 ****not (0-15)******************
//a chinese word width is 8 byte  for the function ,lt's height is 16 byte***
void show_text(unsigned char x,unsigned char y,unsigned char daxiao,unsigned char *text)
{
 unsigned char temp=0x0f;  
 send_com(0x00,0xcd);                         //到文字模式 
 switch(daxiao)
   {case 0: temp=0x0f; break;
    case 1: temp=0x5f; break;
    case 2: temp=0xaf; break;
    case 3: temp=0xff; break;
   }  
 send_com(0xf1,temp);                        //设定放大倍数
 send_com(0x12,0xB1);                        //光标右移  双层图层  or   操作图层1
 send_com(0xf0,0xa0);                        //换字符表到表0        //进入文本图层
 send_com(0x60,x);                           //光标的位置
 send_com(0x70,y);
 while((*text)>0)
   {
     post_msg(*text);delay_us(50);
     text++;
   }
} 

/**************************************************************************
x表示行坐标,每一个象点表示一行
y表示列坐标,每一个字符表示一列,自动与字符大小匹配
daxiao表示的是字符放大系数,高四位表示横向放大,低四位表示纵向放大倍数
p表示需要显示的字符的ASCII码,所有的显示均使用标准ASCII码
*************************************************************************/ 
void word(unsigned char x,unsigned char y,unsigned char daxiao,unsigned char p)
{unsigned char temp=0;
 temp=daxiao-0x11;//转化为内部的实际寄存器值
 daxiao=temp;
 daxiao=daxiao<<6;
 temp|=0x0f;
 temp|=daxiao;
 send_com(0xf1,temp);
 send_com(0x12,0xB1);
 send_com(0xf0,0xa0);    //换字符表到表0
 send_com(0x60,x);       //x,y与液晶的实际地址刚好是反的
 send_com(0x70,y);
 post_msg(p);
 } 

/*==---显示单个数字============================ 
此函数还可以显示单个的英文字符,对应的为其ASCII值A=17,a=49
/*********************for each chinese or engligh word ,each of x 
     show_num(12,64,7);
     show_num(12,80,'7'-48);  is different
************************8 bite of y,change a state************  
//*** x range 0 to 29,for  y,each 8 bite will change state *****/
void show_num(unsigned char x,unsigned char y,unsigned char num)
{  send_com(0x00,0xcd);                        //到文字模式 
   send_com(0x12,0xB1); 
   send_com(0x60,x);                           //光标的位置
   send_com(0x70,y);
   post_msg(num+48);                          //48+number i=ASCII value     
}

/*************************************************************************

⌨️ 快捷键说明

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