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

📄 lcd.h

📁 单片机DDS驱动程序
💻 H
字号:
/*------------液晶显示程序,通过芯片T6963C控制128*64液晶屏-------------*/
//8月19日完成汉字显示
//注意,由于使用T6963C作为液晶驱动,因此,字符ASCII码减32后方为要显示的字符
//例如要显示字母A(65),应向T6963数据端口写入65-32=33=0x21
//完成波形绘制
//需要与8279配合做菜单功能
#include<string.h>
#include"zimo.h"

#define uchar unsigned char
#define uint unsigned int
//驱动芯片的C/D端接A0,LCD片选线一直接低
#define COM_LCD XBYTE[0x3801]  //LCD控制芯片命令端口地址 
#define DATA_LCD XBYTE[0x3800] //LCD控制芯片数据端口地址 

//对不同的液晶屏,可修改下面的参数 
#define SIZE_ROW 64	   //行 
#define SIZE_COL 128   //列 

/*----------------------LCD控制命令---------------------------*/
//寄存器设定命令
#define CURSOR_CONTROL  0x21  //光标位置控制命令字
#define REGISTER_SHIFT  0x22  //寄存器偏移设定
#define ADDRESS_SET     0x24  //地址指针设定

//显示方式设定命令
#define TEXT_START_ADDRESS_SET 0x40 //文本起始地址设定 
#define TEXT_AREA_SET   0x41      //文本区域宽度 
#define FIGURE_START_ADDRESS_SET 0x42  //图形起始地址设定
#define FIGURE_AREA_SET 0x43     //图形区域宽度


//显示方式设置
#define OR_WAY   0x80  //或方式
#define XOR_WAY  0x81  //异或方式
#define AND_WAY  0x83  //与方式
#define TEXT_WAY 0x84  //文本属性方式

#define INNER_CGROM  0x80  //内部CGROM方式
#define EXTERNAL_CGRAM  0x88 //外部CGRAM方式


//显示开关控制
#define DISPLAY_OFF 0x90  //显示关
#define CURSOR_ON_BLINK_OFF 0x92 //光标开闪烁关
#define CURSOR_ON_BLINK_ON	0x93 //光标开闪烁开
#define TEXT_ON_FIGURE_OFF  0x94 //文本模式开,图形模式关
#define TEXT_OFF_FIGURE_ON  0x98 //文本模式关,图形模式开
#define TEXT_ON_FIGURE_ON   0x9F //文本模式开,图形模式开

//光标模式选择
#define CURSOR_ONE 0xA0  //1行光标
#define CURSOR_TWO 0xA1  //2行光标
#define CURSOR_THREE 0xA2 //3行光标
#define CURSOR_FOUR 0xA3 //4行光标
#define CURSOR_FIVE 0xA4 //5行光标
#define CURSOR_SIX  0xA5  //6行光标
#define CURSOR_SEVEN 0xA6 //7行光标
#define CURSOR_EIGHT 0xA7 //8行光标

//数据自动读写选择 
#define DATA_AUTO_WRITE 0xB0 //数据自动写
#define DATA_AUTO_READ  0xB1 //数据自动读
#define RESET_AUTO_WR   0xB2 //复位自动读写


//数据读写控制 
#define WRITE_ADDRESS_ADD 0xC0   //数据写地址自动加1
#define READ_ADDRESS_ADD  0xC1   //数据读地址自动加1
#define WRITE_ADDRESS_SUB 0xC2   //数据写地址自动减1
#define READ_ADDRESS_SUB  0xC3   //数据读地址自动减1
#define WRTIE_ADDRESS_HOLD   0xC4   //数据写地址不变 
#define READ_ADDRESS_HOLD  0xC5  //数据读地址不变 

//屏幕操作
#define SCREEN_GET 0xE0  //屏获取一字节显示数据 
#define SCREEN_COPY 0xE8 //屏拷贝,拷贝一行数据到图形显示区

/*
//位位置操作
#define BIT_CLEAR 0xF0 //bit清零,11110xxx
#define BIT_SET   0xFF //bit置位,11111xxx
#define BIT0      0xF8 //1111x000,LSB,第0位
#define BIT1      0xF9 //1111x001,第1位
#define BIT2      0xFA //1111x010
#define BIT3      0xFB //1111x011
#define BIT4      0xFC //1111x100
#define BIT5      0xFD //1111x101
#define BIT6      0xFE //1111x110
#define BIT7      0xFF //1111x111
*/
uchar gCurRow,gCurCol;  //LCD光标位置变量
uchar uRow,uCol;        //LCD光标控制变量


typedef data struct
{
   uint size;
   uchar sizeL,sizeH;
   uint addr;
   uchar start_addrL,start_addrH;
}LCD;

LCD Text,Figure;

void Check_Status01(void)  //检查Status0/1是否同时为1,必须同时检查这两位
{                          //且每条指令写都需要检查这两位
   uchar temp;
   do
   {
     temp = COM_LCD&0x03;    
   }while(temp!=0x03); 
}

void Check_Status3(void)
{
   uchar temp;
   do
   {
      temp = COM_LCD &0x08;
   }while(temp!=0x08);
}

uchar LCD_GetRow(void)  //获取光标行 
{
    return gCurRow;
}


uchar LCD_GetCol(void)	 //获取光标列 
{
    return gCurCol;
}

/*------------------------------------------------
写双字节命令函数 
入口参数:数据Data_A,Data_B;命令Com
出口参数:无 
----------------------------------------------*/
void Write_Word_Command(uchar Com,uchar Data_A,uchar Data_B) //写双参数命令 
{
    Check_Status01();
	DATA_LCD = Data_A;
	Check_Status01();
	DATA_LCD = Data_B;
	Check_Status01();
	COM_LCD = Com;
}

/*--------------------------------------------
写单参数命令函数
入口参数:数据Data_A;命令Com
出口参数:无
------------------------------------------------*/
void Write_Byte_Command(uchar Data_A,uchar Com)     //写单参数命令
{
   Check_Status01();
   DATA_LCD = Data_A;
   Check_Status01();
   COM_LCD = Com;
}

/*----------------------------------------------
写无参数命令函数
入口参数:命令COMMAND
出口参数:无
-----------------------------------------------*/
void Write_Nopara_Command(uchar COMMAND)  //写无参数命令
{
    Check_Status01();
    COM_LCD = COMMAND;
}

/*----------------------------------------------
写数据函数
入口参数:数据DATA
出口参数:无
---------------------------------------------*/
void Write_Nopara_Data(uchar DATA)     //写无参数数据
{
   Check_Status01();
   DATA_LCD = DATA;
}

/*----------------------------------------------
设置光标位置函数
入口参数:行位置urow,列位置:ucol
出口参数:无
------------------------------------------------*/
void LCD_SetPos(uchar urow, uchar ucol) 
{
     uint iPos;
     iPos = urow * 30 + ucol;  //30?                                       
     Write_Word_Command(ADDRESS_SET,iPos & 0xFF,iPos>>8);
     gCurRow = urow;
     gCurCol = ucol;
}


/*------------------------------------------------
清屏函数
入口参数:无
出口参数:无
-------------------------------------------------*/
void Clear_Screen(void)
{
    uint i;
	Write_Word_Command(ADDRESS_SET,0,0);     //设置地址指针
	Write_Nopara_Command(DATA_AUTO_WRITE);  //数据自动写
	for(i=0;i<240*128;i++)
	{
	   Check_Status3();
	   Write_Nopara_Data(0x00); //置0
	}
	Write_Nopara_Command(RESET_AUTO_WR);  //数据自动写结束
	Write_Word_Command(ADDRESS_SET,0,0);  //重置地址指针
	gCurRow = 0;                          //复位光标变量
    gCurCol = 0;
}
/*-----------------------------------------------
显示单个字符函数(8x8)
入口参数:行y,列x
出口参数:无
------------------------------------------------*/
void Display_Char(uchar x,uchar y,uchar CHAR)
{   

    uRow = y;
	uCol = x;
	Write_Nopara_Command(0x94); //文本显示
	Write_Nopara_Command(TEXT_WAY);
	//Write_Nopara_Command(DATA_AUTO_WRITE);
	LCD_SetPos(y,x);
	//Check_Status3();
	Write_Nopara_Data(CHAR-32);
//	Check_Status3();
//	Write_Nopara_Command(RESET_AUTO_WR);
}

/********************************************************************************
函数原型: void Delay(uchar t)
功     能; (1)延时 T*10 (2) 1MS*k
入口参数: (1) uchar t   (2)uint k
出口参数: 
********************************************************************************/ 
/*void Delay(uchar t)
{ 
   uchar i,j;
   for(i=0;i<t;i++) {   for(j=0;j<10;j++);   }
}*/

void Display_hz(uchar x,uchar y,uchar *shz)
{
  uint  length=0,no,k;
  uchar uRow,uCol;
  while (*(shz+length)!='\0') //计算汉字字符串长度
  {
    length++;
  }
  for(no=0;no<length/2;no++) //根据索引查找相应的汉子字模
  {
     uint j,find;
     for(j=0;j<sizeof(Hz_Index)/2;j++)
    {
	   if(Hz_Index[j*2]==*(shz+no*2)&&Hz_Index[j*2+1]==*(shz+no*2+1))
	   {
	      find=1; //找到字模
		  break;
	   }
	}

   for(k=0;k<16;k++)  //显示
   {
      uRow=y;
      uCol=x+no*2;  //汉字占两个字节(16*16)
      LCD_SetPos(uRow*16+k,uCol); 
      uRow = LCD_GetRow();
      uCol = LCD_GetCol(); 
      Write_Nopara_Command(DATA_AUTO_WRITE);  //自动写,0xB0
      Write_Nopara_Data(CGTAB[j*32+2*k]);  //写入字模数据(一半) 
      Write_Nopara_Command(RESET_AUTO_WR );  //自动写结束
      x++;
      Write_Nopara_Command(DATA_AUTO_WRITE);
      Write_Nopara_Data(CGTAB[j*32+2*k+1]);
      Write_Nopara_Command(RESET_AUTO_WR );
      x--;
	}
   }
}

//显示字符串
void Display_String(uchar x,uchar y,uchar *ptr)
{
   char c1;
   uchar i,j,uLen,uRow,uCol;
   uLen=strlen(ptr);
   for(i=0;i<uLen;i++)
   {
     c1 =ptr[i];
     for(j=0;j<16;j++)
    {
	   uRow=y;
       uCol=x;
       LCD_SetPos(uRow*16+j,uCol);
       uRow = LCD_GetRow();
       uCol = LCD_GetCol(); 
       Write_Nopara_Command(DATA_AUTO_WRITE);
       Write_Nopara_Data(ASC_MSK[(c1-0x20)*16+j]);
       Write_Nopara_Command(RESET_AUTO_WR);}
       if(x<29)
       {
	     x++;
	   }
       else 
      {
	    y++;x=0;
	  }
	 }
}



void Init_LCD(void)   //LCD初始化函数
{
   Text.size = Figure.size= (SIZE_COL>>3)*SIZE_ROW;	  //128*64/8 = 1024 = 0x4000
   Text.sizeL = Text.size;     //0x00
   Text.sizeH = Text.size>>8;  //0x40 

    Figure.sizeL = Text.size;
    Figure.sizeH = Text.size>>8;
  
    Text.addr = 0x01DF;
    Text.start_addrL = Text.addr;   
    Text.start_addrH = Text.addr>>8;

   Figure.addr = 0x0000;
   Figure.start_addrL = Figure.addr;
   Figure.start_addrH = Figure.addr>>8;

   Write_Word_Command(TEXT_START_ADDRESS_SET,Text.start_addrL,Text.start_addrH);//设置文本起始地址 
   Write_Word_Command(TEXT_AREA_SET,0x1E,0x00); //文本区域设定,只需给出行地址(宽度30) 

   Write_Word_Command(FIGURE_START_ADDRESS_SET,Figure.start_addrL,Figure.start_addrH);//设置图形显示起始地址 
   Write_Word_Command(FIGURE_AREA_SET,0x1E,0x00);	//图形区域设定 

   Write_Nopara_Command(OR_WAY);    //图形或文本 
   Write_Nopara_Command(CURSOR_ONE);

   Write_Word_Command(0x22,0x07,0x00);
   Write_Word_Command(0x24,0x00,0x3c);

}

⌨️ 快捷键说明

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