📄 lcd.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 + -