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

📄 lcd.c

📁 单片机通过SPI读写SD卡.使用5v系统操作3.3V的sd卡.很有借鉴价值
💻 C
字号:
//#########################################################################
// File: LCD.C
//
// Ansteuerung einer LCD-Anzeige
// im 8 Bit Daten Mode
//
//#########################################################################
// Last change: 21.04.2003
//#########################################################################
// holger.klabunde@t-online.de
// http://home.t-online.de/home/holger.klabunde/homepage.htm
//#########################################################################
// Compiler: AVR-GCC 3.2
//#########################################################################

#include <io.h>

#include "mydefs.h"
#include "lcd.h"

//*******************************************
// Schreibt ein Datenbyte in die LCD-Anzeige
//*******************************************
void LCDWriteByte(unsigned char data)
{
 LCDCS_OFF();

 PORTC=data;
 
 LCDCS_ON();
 LCDCS_OFF();	

 Delay100us(1); //etwas auf die Anzeige warten
}

//**************************************************
//Schreibt einen Text in die LCD-Anzeige
//**************************************************
void LCDWrite(char *__putstr)
{
 char __ps;
 
  while((__ps = *__putstr))
   {
    __putstr++;
    if (__ps== 0) break;
    LCDWriteByte(__ps);
   }
}

//****************************************************
// Springt auf Zeile x und Position y der LCD-Anzeige 
// G黮tig f黵 2 Zeilen
//****************************************************
void LCDPos(unsigned char zeile,unsigned char position)
{
 unsigned char buff;

 LCDRS_OFF(); //Umschalten auf Kontrollregister

// 0x80 wegen Display Adress Set.
// Erste Position ist bei mir 1, nicht 0.
// Offset's
// Zeile 1 -> 0x00+0x80-0x01=0x7F
// Zeile 2 -> 0x40+0x80-0x01=0xBF 

 switch(zeile)
  {
   case 1: buff=0x7F+position; break;
   case 2: buff=0xBF+position; break;
   default : buff=0x80; break; //1,1
  }

 LCDWriteByte(buff); 
 LCDRS_ON(); //Umschalten auf Datenregister
 Delay100us(1); //etwas auf die Anzeige warten
}

//*****************************************
// L鰏cht die LCD Anzeige
// Cursor steht dann auf Position 1,Zeile 1
// Gilt auch f黵 mehrzeilige Anzeigen
//*****************************************
void LCDCls(void)
{
 LCDRS_OFF(); //Controlregister
 LCDWriteByte(0x01); //CLS
 LCDRS_ON(); //Umschalten auf Datenregister
 Delay1ms(5);
}

//*********************************************
//Stellt die Funktionsweise der LCD Anzeige ein
//*********************************************
void LCDInit(void)
{
 int i;

 LCDRS_OFF();  //Control Register
 LCDCS_OFF();  //LCD-Anzeige anw鋒len

//Software Reset laut Hitachi Datenblatt
 Delay1ms(255); //M鰃lichen Power On Reset abwarten
 for(i=0; i<3; i++)
  {
   PORTC=0x30;	//Auf den Port legen

   LCDCS_ON();	//schreiben
   LCDCS_OFF(); //LCD-Anzeige abw鋒len
   Delay1ms(100); //Ein bi遚hen warten auf die Anzeige
  }
//Ende Software Reset


//Der erste Schreibzugriff nach dem Reset ist ein 8 Bit
//Zugriff!! Also nur einmal schreiben, nicht Low-High Nibble.

//Um die 4Bit Operation einzuschalten
// lcdport=0x02;	//4 Bit Operation
// outp(lcdport,PORTB);	//Auf den Port legen
// LCDCS_ON();	//High Nibble schreiben
// Delay1ms(5);

// LCDWriteByte(0x28);    //4 Bit Operation,2 Line,5x7 Font
 LCDWriteByte(0x38);    //8 Bit Operation,2 Line,5x7 Font
 Delay1ms(5);
 LCDWriteByte(0x14); 	//Cursor Move,Right Shift
 Delay1ms(5);

// LCDWriteByte(0x0F); 	//Display on, Cursor on ,Cursor blink
// LCDWriteByte(0x0E); 	//Display on, Cursor on ,Cursor no blink
 LCDWriteByte(0x0C); 	//Display on, Cursor off ,Cursor no blink
 Delay1ms(5);

 LCDWriteByte(0x06); 	//Increment, Display Freeze
 Delay1ms(5);
 LCDWriteByte(0x02); 	//Cursor Home
 Delay1ms(5);
 LCDRS_ON();		//LCD-Datenregister
}

//#######################################################
//Zeigt ein Byte im HexCode (ohne 0x vorne) an
void ShowHex(unsigned char by)
//#######################################################
{
 unsigned char buff;

 buff=by>>4; //Highnibble zuerst
 if(buff<10) buff+='0'; //ASCII Code erzeugen
 else buff+=0x37;        //Gro遙uchstaben
 LCDWriteByte(buff);

 buff=by&0x0f; //Danach das Lownibble
 if(buff<10) buff+='0'; //ASCII Code erzeugen
 else buff+=0x37;        //Gro遙uchstaben
 LCDWriteByte(buff);
}

//#######################################################
void ShowHexLong(unsigned long l)
//#######################################################
{
 ShowHex((unsigned char)(l>>24));
 ShowHex((unsigned char)(l>>16));
 ShowHex((unsigned char)(l>>8));
 ShowHex((unsigned char)(l));
}

//###################################################################################
//Nicht sonderlich genau !!
void Delay1ms(unsigned int time)
//###################################################################################
{
 unsigned int i;

 for(i=0; i<time; i++) Delay100us(10);
}

//###################################################################################
//Nicht sonderlich genau !!
//time<=255 !!
void Delay100us(unsigned char time)
//###################################################################################
{
 unsigned char k,l;

 for(k=0; k<time; k++)
  {
   for(l=0; l<40; l++)
    {
     //Ein CPU-Clock = 0.125us bei 8MHz
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();  
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();  

#ifdef F_11059
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();  
#endif

#ifdef F_16
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();  
     NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();  
#endif
    }
  }
}

⌨️ 快捷键说明

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