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

📄 lcd.c

📁 lcd interface code for lpc214x series micro controllers
💻 C
字号:
#include "lcd.h"
#include "lpc210x.h"

void lcd_wait(){
      int loop=2800;  //more than enough
      //busy loop
      while(loop--);
}
void lcd_wait_s(){
      int loop=50;  //more than enough
      //busy loop
      while(loop--);
}
void lcd_out_data4(unsigned char val){
     IOCLR |= (LCD_DATA);
     IOSET |= (val<<4);
}

void lcd_write_nibbles(unsigned char val){

     //higher-order byte
     lcd_en_set();
	 lcd_wait_s(); /////////
     lcd_out_data4((val>>4)&0x0F);
	 lcd_wait_s(); /////////
     lcd_en_clr();

     lcd_wait();

     //lower-order byte
     lcd_en_set();
	 lcd_wait_s(); /////////
     lcd_out_data4((val)&0x0F);
	 lcd_wait_s(); /////////
     lcd_en_clr();
     
     lcd_wait();
}

void lcd_write_control(unsigned char val){
     lcd_rs_clr();
     lcd_write_nibbles(val);
}

void lcd_init(){

        PINSEL0 &= (~LCD_GPIO_SEL0);
        PINSEL1 &= (~LCD_GPIO_SEL1);
        /* we only work on OUTPUT so far */
        IODIR |= LCD_IOALL;
        
        /* IO init complete, init LCD */

       /* init 4-bit ops*/
       lcd_rs_clr();
       lcd_rw_clr();
       lcd_en_clr();


       //wait VDD raise > 4.5V
       lcd_wait();
       
       //dummy inst 
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);

       //FUNCTION SET
       //001DL  N F XX
       //DL=1: 8bit
       //DL=0: 4bit
       //N=0: 1 line display
       //N=1: 2 line display
       //F=0: 5x7 dots
       //F=1: 5x10 dots

       //our case:
       //0010 1000
       lcd_en_set();
       lcd_out_data4(0x2);
       lcd_en_clr();
       lcd_wait();

       lcd_write_nibbles(0x28);
       
       //LCD ON
       lcd_write_nibbles(0x0E);

       //Clear Display
       lcd_write_nibbles(0x01);

       //Entry mode
       lcd_write_nibbles(0x06);

}

void lcd_putchar(unsigned char c){

       lcd_rs_set();
       lcd_write_nibbles(c);
}

void lcd_print(unsigned char* str){
      int i;
	       for (i=0;i<16 && str[i]!=0;i++){
                lcd_putchar(str[i]);
			}
}

//    driver taken from UC51    //

/******************* internal Track XY cursor for NLs ***********************/
//static signed char  lcd_pos_x, lcd_pos_y;
signed char  lcd_pos_x, lcd_pos_y;


/************************ lcd_setxy **************************/
static void lcd_setxy(void){ //reentrant {	// local function!
	//uchar date;
	char date;

	if(lcd_pos_x>19){	// Ensure that all is inside the visible rectangle
		lcd_pos_x=-1;
		lcd_pos_y++;
	}
	if(lcd_pos_y>3){
		lcd_pos_y=0;
		lcd_pos_x=-1;
	}else if(lcd_pos_y<0){
		lcd_pos_y=3;
		lcd_pos_x=-1;
	}

	switch(lcd_pos_y){	// Here for a 4x40 Display
	//	case 1: date=64; break;
	//	case 2: date=20; break;
	//	case 3: date=84; break;
		case 1: date=0x40; break;
		case 2: date=0x14; break;
		case 3: date=0x54; break;
		default: date=0;
	}
	date|=128;
	
	if(lcd_pos_x>0) date+=lcd_pos_x;
	lcd_write_control(date);
	
}

/*********************** lcd_gotoxy() *************************/
void lcd_gotoxy(char nx,char ny){// reentrant{
	lcd_pos_x=nx;
	lcd_pos_y=ny;
	lcd_setxy();
}
///******************** lcd_clear() ****************/
void lcd_clear(void){
	lcd_write_control(1);
	lcd_pos_x=0;
	lcd_pos_y=0;
}

// EOF



⌨️ 快捷键说明

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