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

📄 lcd.c

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

//驱动芯片的C/D端接A0,LCD片选线一直接低
#define COM_LCD XBYTE[0x21FF]  //LCD控制芯片命令端口地址 
#define DATA_LCD XBYTE[0x23FF] //LCD控制芯片数据端口地址 

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

/*----------------------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
*/
BYTE idata uRow;
BYTE idata uCol;        //LCD光标控制变量


typedef idata struct
{
   WORD size;
   BYTE sizeL,sizeH;
   WORD addr;
   BYTE start_addrL,start_addrH;
}LCD;

LCD Text,Figure;

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

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

/*------------------------------------------------
写双字节命令函数 
入口参数:数据Data_A,Data_B;命令Com
出口参数:无 
----------------------------------------------*/
void Write_Word_Command(BYTE Com,BYTE Data_A,BYTE 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(BYTE Data_A,BYTE Com)     //写单参数命令
{
   Check_Status01();
   DATA_LCD = Data_A;
   Check_Status01();
   COM_LCD = Com;
}

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

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

/*----------------------------------------------
设置光标位置函数
入口参数:行位置urow,列位置:ucol
出口参数:无
------------------------------------------------*/
void LCD_SetPos(BYTE  urow, BYTE  ucol) 
{
     WORD idata iPos;
     iPos = urow * 30 + ucol;  //30?                                       
     Write_Word_Command(ADDRESS_SET,iPos%256,iPos / 256);
}


/*------------------------------------------------
清屏函数
入口参数:无
出口参数:无
-------------------------------------------------*/
void Clear_Screen(void)
{
    WORD idata i;
	EA=0;
	Write_Word_Command(ADDRESS_SET,0,0);     //设置地址指针
	Write_Nopara_Command(DATA_AUTO_WRITE);  //数据自动写
	for(i=0;i<30*128;i++)
	{
	   Check_Status3();
	   Write_Nopara_Data(0x00); //置0
	}
	Write_Nopara_Command(RESET_AUTO_WR);  //数据自动写结束
	Write_Word_Command(ADDRESS_SET,0,0);  //重置地址指针
	EA=1;
}

/********************************************************************************
函数原型: 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(BYTE  x,BYTE y,BYTE *shz)
{
  WORD idata length=0;
  WORD idata no;
  WORD idata k;
  BYTE idata uRow;
  BYTE idata uCol;
  EA=0;
  while (*(shz+length)!='\0') //计算汉字字符串长度
  {
    length++;
  }
  for(no=0;no<length/2;no++) //根据索引查找相应的汉子字模
  {
     WORD 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);  
      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--;
	}
   }
   EA=1;
}



//显示字符串
void Display_String(BYTE  x,BYTE  y,BYTE  *ptr)
{
   char idata c1;
   BYTE  idata i=0;
   BYTE  idata j=0;
   WORD  idata uLen;
   BYTE  idata uRow;
   BYTE  idata uCol;
   EA=0;
   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);
 	   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;
	  }
	 }
	 EA=1;
}


void Display_Image(BYTE x,BYTE y)
{
   BYTE  idata uRow;
   BYTE  idata uCol;	
   BYTE  idata i;		 
   BYTE  idata j;
   WORD  idata pos=0;
   EA=0;
 for(i=0;i<64;i++)
 {
   for(j=0;j<8;j++)
    {
	   uRow=y;
       uCol=x;
       LCD_SetPos(uRow*16+i,uCol+j);  
 	   Write_Nopara_Command(DATA_AUTO_WRITE);
       Write_Nopara_Data(logo[pos++]);
       Write_Nopara_Command(RESET_AUTO_WR);
    }
 }
 EA=1;
}




void Init_LCD(void)   //LCD初始化函数
{
   EA=0;
   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 = 0x0000;
   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,0x02,0x00);
   //Write_Word_Command(0x24,0x00,0x14);
   Write_Nopara_Command(0x98);	
   EA=1;
}

⌨️ 快捷键说明

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