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

📄 lcd.h

📁 128*64液晶显示月历模式万年历
💻 H
字号:
#include <absacc.h>
#include <intrins.h>
#include <reg51.h>
#include "CharCode.h"
#include "Common.h"
#include "1302.h"

#define dataPort P1 //定义P1口为数据口

sbit di = P2^0; //数据/命令选择
sbit en = P2^1; //使能
sbit rw = P2^2; //读写选择
sbit cs1 = P2^3; //左屏片选(低有效)
sbit cs2 = P2^4; //右屏片选(低有效)
uint currentYear = 0;
uchar currentMonth = 0;
uchar currentDay = 0;
uchar n_currentMon = 0;                                                  //当前月的天数
uchar n_lastMon = 0;                                                     //上月的天数
uchar dataBuf[8];//存储1032的数据

//状态检查
void CheckState(void)
{
  uchar dat;
  dat = 0x00;
  di=0;
  rw=1;
/*	do
	{
		P1=0xff;
		en=1;
		dat=P1; 
		en=0;
		dat&=0x80; //仅当第7位为0时才可操作
	}while(dat);*/
}

void nop(void)
{
  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}

//显示数据,写一个直接数据
void WriteByte(uchar wdata)
{
  CheckState();
  di = 1;
  rw = 0;
  dataPort = wdata;
  en = 1;
  en = 0;
}

//发送命令
void SendCMD(uchar cmd)
{
  CheckState();
  di = 0;
  rw = 0;
  dataPort = cmd;
  en = 1;
  en = 0;  	
}

//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
	line &= 0x07; // 0<=line<=7
	line |= 0xb8; //1011 1xxx
	SendCMD(line);
}

//设定列地址--Y 0-63
void SetColumn(uchar column)
{
	column &= 0x3f; // 0=<column<=63
	column |= 0x40; //01xx xxxx
	SendCMD(column);
}

//设定显示开始行--XX
void SetStartLine(uchar startline) //0--63
{
	//startline &= 0x07;
	startline |= 0xc0; //1100 0000
	SendCMD(startline);
}

//开关显示
void SetOnOff(uchar onoff)
{
	onoff |= 0x3e; //0011 111x
	SendCMD(onoff);
}

//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(uchar screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
	switch(screen)
	{ 
		case 0: 
			cs1 = 0;//全屏
			nop();
			cs2 = 0; 
			nop();
			break; 
		case 1: 
			cs1 = 1;//左屏
			nop();
			cs2 = 0;
			nop();
			break;
		case 2: 
			cs1 = 0;//右屏
			nop();
			cs2 = 1;
			nop();
			break;
		default:
			break;
	}
}

//清屏 screen: 0-全屏,1-左屏,2-右
void ClearScreen(uchar screen)
{
  uchar i = 0;
  uchar j = 0;
  SelectScreen(screen);
  for (i = 0; i < 8; i++)
  {
    SetLine(i);
    for (j = 0; j < 64; j++)
    {
      WriteByte(0x00);	
    }	
  }	
}
//初始化屏幕
void InitLCD(void)
{
  uchar i = 2000; //延时
  while (i--);
  SetOnOff(1); //开显示
  ClearScreen(1);//清屏
  ClearScreen(2);
  SetStartLine(0); //开始行:0
}

/*
//显示8*8点阵
//lin:行(0-7), column: 列(0-127)
//address : 字模区首地址
void Show8x8(uchar line, uchar column, uchar *addr)
{
  uchar i = 0;
  
  if (column < 64 ) //如果列数<64则从第一屏上开始写
  {
    SelectScreen(1);
    SetLine(line);
    SetColumn(column);
    
    for (i = 0; i < 8; i++)
    {
      if ((column + i) < 64)
      { 
      	WriteByte( *(addr + i) );
      }
      else
      {
        SelectScreen(2);
        SetLine(line);
        SetColumn(column - 64 + i);
        WriteByte( *(addr + i) );	
      }	
    }	
  }
  else //如果列数>64则从第二屏上开始写
  {
    SelectScreen(2);
    SetLine(line);
    column = column - 64;
    SetColumn(column);
    
    for (i = 0; i < 8; i++)
    {
      if ((column + i) < 64)
      { 
      	WriteByte( *(addr + i) );
      }
      else
      {
        SelectScreen(1);
        SetLine(line);
        SetColumn(column - 64 + i);
        WriteByte( *(addr + i) );	
      }	
    }	    	
  }	
}*/

//显示6*6点阵
//lin:行(0-10), column: 列(0-127)
//address : 字模区首地址
void Show6x6(uchar line, uchar column, uchar *addr)
{
  uchar i = 0;
  
  if (column < 64 ) //如果列数<64则从第一屏上开始写
  {
    SelectScreen(1);
    SetLine(line);
    SetColumn(column);
    
    for (i = 0; i < 6; i++)
    {
      if ((column + i) < 64)
      { 
      	WriteByte( *(addr + i) );
      }
      else
      {
        SelectScreen(2);
        SetLine(line);
        SetColumn(column - 64 + i);
        WriteByte( *(addr + i) );	
      }	
    }	
  }
  else //如果列数>64则从第二屏上开始写
  {
    SelectScreen(2);
    SetLine(line);
    column = column - 64;
    SetColumn(column);
    
    for (i = 0; i < 6; i++)
    {
      if ((column + i) < 64)
      { 
      	WriteByte( *(addr + i) );
      }
      else
      {
        SelectScreen(1);
        SetLine(line);
        SetColumn(column - 64 + i);
        WriteByte( *(addr + i) );	
      }	
    }	    	
  }	
}

//显示6*6点阵
//lin:行(0-10), column: 列(0-127)
//address : 字模区首地址
void ShowOpposite(uchar line, uchar column, uchar *addr)
{
  uchar i = 0;
  
  if (column < 64 ) //如果列数<64则从第一屏上开始写
  {
    SelectScreen(1);
    SetLine(line);
    SetColumn(column);
    
    for (i = 0; i < 6; i++)
    {
      if ((column + i) < 64)
      { 
      	WriteByte( ~(*(addr + i)) );
      }
      else
      {
        SelectScreen(2);
        SetLine(line);
        SetColumn(column - 64 + i);
        WriteByte( ~(*(addr + i)) );	
      }	
    }	
  }
  else //如果列数>64则从第二屏上开始写
  {
    SelectScreen(2);
    SetLine(line);
    column = column - 64;
    SetColumn(column);
    
    for (i = 0; i < 6; i++)
    {
      if ((column + i) < 64)
      { 
      	WriteByte( ~(*(addr + i)) );
      }
      else
      {
        SelectScreen(1);
        SetLine(line);
        SetColumn(column - 64 + i);
        WriteByte( ~(*(addr + i)) );	
      }	
    }	    	
  }	
}

//显示汉字8*8
/*
void ShowChina8(uchar line, uchar column, uchar num)
{
  uchar *address;
  address = &ChinaCode8[num][0];
  
  Show8x8(line, column, address);
  Show8x8(line, column + 8, address + 8);
  Show8x8(line + 1, column, address + 16);
  Show8x8(line + 1, column + 8, address + 24);
}
*/

//显示汉字6*6
void ShowChina6(uchar line, uchar column, uchar num)
{
  uchar *address;
  address = &ChinaCode6[num][0];
  
  Show6x6(line, column, address);
  Show6x6(line, column + 6, address + 6);
  Show6x6(line + 1, column, address + 12);
  Show6x6(line + 1, column + 6, address + 18);
}

//显示数字或字母8*8
/*
void ShowNumber8(uchar line, uchar column, uchar num)
{
  uchar *address;
  address = &NumCode8[num][0];
  
  Show8x8(line, column, address);
  Show8x8(line + 1, column, address + 8); 	
}
*/

//显示数字或字母6*6
void ShowNumber6(uchar line, uchar column, uchar num)
{
  uchar *address;
  address = &NumCode6[num][0];

  Show6x6(line, column, address);
  Show6x6(line + 1, column, address + 6); 	
}

//显示数字或字母12*12
void ShowNumber12(uchar line, uchar column, uchar num)
{
  uint  highNum = 0;
  uint	lowNum = 0;
  uchar *Addr;
  if (num < 10)
  {
    highNum = 11;
	lowNum = num;
	Addr = &NumCode6[lowNum][0];
    Show6x6(line, column + 6, Addr);  
    Show6x6(line + 1, column + 6, Addr + 6);
  }
  else
  {
    highNum = num / 10;
	lowNum = num % 10;
  
    Addr = &NumCode6[highNum][0];
    Show6x6(line, column, Addr);
    Show6x6(line + 1, column, Addr + 6);

    Addr = &NumCode6[lowNum][0];
    Show6x6(line, column + 6, Addr);  
    Show6x6(line + 1, column + 6, Addr + 6);
  } 	
}

//显示反色数字12*12
void ShowOppositeNumber(uchar line, uchar column, uchar num)
{
  uchar *Addr;
  uint  highNum = 0;
  uint	lowNum = 0;
   
  if (num < 10)
  {
    highNum = 11;
	lowNum = num;
	Addr = &NumCode6[lowNum][0];
    ShowOpposite(line, column + 6, Addr);  
    ShowOpposite(line + 1, column + 6, Addr + 6);
  }
  else
  {
    highNum = num / 10;
	lowNum = num % 10;
  
    Addr = &NumCode6[highNum][0];
    ShowOpposite(line, column, Addr);
    ShowOpposite(line + 1, column, Addr + 6);

    Addr = &NumCode6[lowNum][0];
    ShowOpposite(line, column + 6, Addr);  
    ShowOpposite(line + 1, column + 6, Addr + 6);
  }	
}

//清屏固定区域
void ClearScreenSome()
{
  uchar i = 0;
  uchar j = 0;
  uchar *address;
  address = &SpaceCode[0];

  for (i = 3; i < 7; i++)
  {
    for (j = 0; j < 128; j++)
	{
	  Show6x6(i, j, address); 
	}
  }  	
}

//清全屏
void ClearScreenAll()
{
  uchar i = 0;
  uchar j = 0;
  uchar *address;
  address = &SpaceCode[0];

  for (i = 0; i < 8; i++)
  {
    for (j = 0; j < 128; j++)
	{
	  Show6x6(i, j, address); 
	}
  }  	
}

//显示线条
void ShowLine(uchar line)
{
  uchar i = 0;
  uchar *address;
  address = &LineCode[0];
  
  for (i = 0; i < 128; i++)
  {
    Show6x6(line, i, address);
  } 
}

//显示系统时间
void ShowSysDay()
{
  uchar highYear = 0;
  uchar lowYear = 0;
  
  highYear = currentYear / 100;
  lowYear = currentYear % 100;

  ShowNumber12(3, 12 + 10 , highYear);
  if (lowYear < 10)
  {
    ShowNumber6(3, 24 + 10, 0);
	ShowNumber6(3, 30 + 10, lowYear);
  } 
  else
  {
    ShowNumber12(3, 12 * 2 + 10, lowYear);
  }
  ShowChina6(3, 12 * 3 + 10, 8);
  ShowNumber12(3, 12 * 4 + 10, currentMonth);
  ShowChina6(3, 12 * 5 + 10, 9);
  ShowNumber12(3, 12 * 6 + 10, currentDay);
  ShowChina6(3, 12 * 7 + 10, 10);
  delay(2000);
  ClearScreenAll();
}

//显示日历
void ShowCalendar(uint year, uchar month, uchar day)
{
  uchar i = 0;
  uchar j = 0;
  uchar m = 0;
  uchar line = 0;
  uchar column = 0;
  uchar outDay = 1;                                                    // 输出日期
  uchar leapFlag = 0;                                                  // 是否闰年标志位
  uchar dayLastMon = 0;                                                // 本月第一个星期中在上月的天数
  uchar week = 0;                                                      // 周
  uchar a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};                 // 每月天数数组

  ShowSysDay();

  for (m = 0; m < 7; m++)
  {
      ShowChina6(0, (19 * m), m);
  }
  ShowLine(2);
  ShowLine(7);

  leapFlag = isLeapyear( year );                                     // 判断给定年份是否闰年
  if ( leapFlag == 1 )                                               // 如果是闰年,2月为29天
  {
    a[2]++;
  }

  if(day > a[month])
  {
	year = currentYear;
    month = currentMonth;
    day = currentDay;
  }
  
  dayLastMon = GetWeek(year, month, 1);
  for (outDay = 1; outDay <= a[month]; outDay++)
  {
	if (outDay == day)
	{
	  ShowOppositeNumber(2 * (j + 1) + 1, (dayLastMon + i) * 19, outDay);
	}
	else
	{
	  ShowNumber12(2 * (j + 1) + 1, (dayLastMon + i) * 19 , outDay);
	}
	week = GetWeek(year, month, outDay);
	i++;
	if (week == 6)
	{
	  i = 0;
	  j++;
	  if (j == 2)
	  {
	     delay(2000);
		 ClearScreenSome();
		 j = 0;
	  }
	  dayLastMon = 0;
	}	  
  }
  delay(2000);
  ClearScreenAll();
}

⌨️ 快捷键说明

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