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

📄 lcd.c

📁 这是几个TMS320F2812应用程序举例
💻 C
字号:
/* lcd.c */
#include "..\def28x.h"
#include "lcd.h"

/*********** LCD interface (4 bit) ************
				   7  6  5  4  3  2  1  0
	Port: Px	=  D7 D6 D5 D4 x  E  0  RS      
	RS = 0(Control), 1(Data)	

Support LCD
// 16 char x 2
// 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F	-- 1st
// 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F	-- 2nd

// 20char x 4
// 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13	-- 1st
// 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53	-- 2nd
// 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27	-- 3rd
// 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67	-- 4th
***********************************************/
#define	CON			0
#define	DAT			1

#define	LCD_PORT(x)	OUT_LCD(x)

void	delay_us(unsigned int d){
	while(d--) DELAY_1us;
}
void	delay_ms(unsigned int d){
	while(d--) delay_us(992);
}

/**************** Data conversion function ************************/
char	asc_to_hex(char asc){
    if((asc >= '0') && (asc <= '9'))    return (asc - '0');
    else if((asc >= 'A') && (asc <= 'F'))   return (asc - 'A' + 0x0a);
    else if((asc >= 'a') && (asc <= 'f'))    return (asc - 'a' + 0x0a);
    else return 0xff;
}       

char	hex_to_asc(char hex){
char	da;
	da = hex & 0x0f;
    if((da >= 0) && (da <= 9))    return  ('0' + da);
    else    return  ('A' + da - 0x0a);
}

WORD	hex2_to_decimal(BYTE b){
WORD	d100,d10,d1;
WORD	dec=0;
	d100 = b/100;
	d10 = (b - d100*100)/10;
	d1 = (b - d100*100 - d10*10); 
	dec = (d100<<8) | (d10<<4) | d1;
	return dec;
}

LONG	hex4_to_decimal(WORD w){
LONG	d10000,d1000,d100,d10,d1;
LONG	dec=0;
	d10000 = w/10000;
	d1000 = (w - d10000 * 10000)/1000;
	d100 = (w - d10000 * 10000 - d1000 * 1000)/100;
	d10 = (w - d10000 * 10000 - d1000 * 1000 - d100 * 100)/10;
	d1 = w - d10000 * 10000 - d1000 * 1000 - d100 * 100 - d10 * 10;
	dec = (d10000<<16) | (d1000<<12) | (d100<<8) | (d10<<4) | d1;
	return dec;
}
//-------------- LCD ---------------
void LCD_out(char data ){
char d;
	d = data << 4;
	LCD_PORT(d);			// RS=0, E=0
	LCD_PORT(d | 0x04);	// RS=0, E=1
	delay_us(1);
	LCD_PORT(d);			// RS=0, E=0
	delay_us(1);
}

void LCD_out2(char rs, char data){
char r;
char d;
	if(rs)	r = 0x01;
	else	r = 0x00;
	delay_us(1);
	d = (data & 0xf0) | r;	// upper 4 bit
	LCD_PORT(d);			// E = 0
	delay_us(1);
	LCD_PORT(d | 0x04);		// E = 1
	delay_us(1);
	LCD_PORT(d);			// E = 0
	delay_us(1);

	d = (data<<4) | r;		// lower 4 bit
	LCD_PORT(d);			// E = 0
	LCD_PORT(d | 0x04);		// E = 1
	delay_us(1);
	LCD_PORT(d);			// E = 0
	delay_us(1);
}

void	init_lcd(void){
	LCD_PORT(0);   				/* 0x00 out */

	delay_ms(15);				/* wait 15ms */
	LCD_out(0x03);				/* function set 1 */
	delay_ms(4);
	LCD_out(0x03);				/* function set 2 */
	delay_ms(4);
	LCD_out(0x03);				/* function set 3 */
	delay_ms(4);
	LCD_out(0x02);				/* function set */
	delay_ms(4);

	LCD_out2(CON, 0x28);		/* function set */
	delay_us(40);
	LCD_out2(CON, 0x0c);		/* display on : Disp=ON, Cursor=OFF, Cursor_Blink=OFF */
	delay_us(40);
	LCD_out2(CON, 0x06);		/* entry mode */
	delay_us(40);
	LCD_out2(CON, 0x01);		/* clear display */
	delay_ms(2);
}

void	lcd_gotoxy(int x, int y){
int	pos;
	switch(y){
		case 0:	// 1st line
			pos = 0x80 | (x & 0x7f);
			break;
		case 1:	// 2nd line
			pos = 0x80 | ((0x40 + x) & 0x7f);
			break;
		case 2:	// 3rd line
			pos = 0x80 | ((0x14 + x) & 0x7f);
			break;
		case 3:	// 4th line
			pos = 0x80 | ((0x54 + x) & 0x7f);
			break;
		default:	break;
	}
	LCD_out2(CON,pos);
	delay_us(40);
}          

void	lcd_clear(void){
	LCD_out2(CON, 0x01);			/* clear display */
	delay_ms(2);
}             

void	lcd_clear_line(char line){	/* 0=1st, 1=2nd, 2=3rd, 3=4th line */
int	i,len=16;
	lcd_gotoxy(0,line);
	if(line >= 2) len=20;
	for(i=0;i<len;i++){
		LCD_out2(DAT, ' ');
		delay_us(40);
	}
}             
                                                                       
void	lcd_cursor_on(void){                                           
								/*        0 0 0 0 1    D            C             B        */
	LCD_out2(CON, 0x0d);		/* display on_off : Disp=ON(1), Cursor=OFF(0), Blink=ON(1) */
	delay_us(40);
}

void	lcd_cursor_off(void){
								/*        0 0 0 0 1    D            C             B        */
	LCD_out2(CON, 0x0c);		/* display on_off : Disp=ON(1), Cursor=OFF(0), Blink=OFF(0) */
	delay_us(40);
}   

void	lcd_putc(char c){
	LCD_out2(DAT, c);
	delay_us(40);
}

void	lcd_puts(char *str){
char	c;
	while(1){
		c = *str++;
		if(!c) break;
		LCD_out2(DAT, c);
		delay_us(40);
	}
} 

void	lcd_hex2(char c){
	lcd_putc(hex_to_asc(c>>4));
	lcd_putc(hex_to_asc(c));
}	

void	lcd_hex4(WORD w){
	lcd_putc(hex_to_asc(w>>12));
	lcd_putc(hex_to_asc(w>>8));
	lcd_putc(hex_to_asc(w>>4));
	lcd_putc(hex_to_asc(w));
}
void	lcd_hex8(LONG l){
	lcd_putc(hex_to_asc(l>>28));
	lcd_putc(hex_to_asc(l>>24));
	lcd_putc(hex_to_asc(l>>20));
	lcd_putc(hex_to_asc(l>>16));
	lcd_putc(hex_to_asc(l>>12));
	lcd_putc(hex_to_asc(l>>8));
	lcd_putc(hex_to_asc(l>>4));
	lcd_putc(hex_to_asc(l));
}

void	lcd_decimal_byte(BYTE b){
WORD	w;
	w = hex2_to_decimal(b);
	lcd_putc(hex_to_asc(w>>8));
	lcd_putc(hex_to_asc(w>>4));
	lcd_putc(hex_to_asc(w));
}

void	lcd_decimal_word(WORD w){
LONG	l;
	l = hex4_to_decimal(w);
	lcd_putc(hex_to_asc(l>>16));
	lcd_putc(hex_to_asc(l>>12));
	lcd_putc(hex_to_asc(l>>8));
	lcd_putc(hex_to_asc(l>>4));
	lcd_putc(hex_to_asc(l));
}

⌨️ 快捷键说明

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