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

📄 st7529.c

📁 at91sam9260 lcd驱动st7529
💻 C
字号:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <fcntl.h>#include <sys/mman.h>#include "st7529.h"//#include "gpio.h"unsigned char lcd1[] = 	{		#include "lcd1.dat"	};unsigned char lcd2[] = 	{		#include "lcd2.dat"	};	unsigned char lcd3[] = 	{		#include "lcd3.dat"	};void write_data(unsigned char data){	ioctl(lcd_fd, LCD_WRITE_DATA, &data);}unsigned char read_data(unsigned char data){	ioctl(lcd_fd, LCD_READ_DATA, &data);	return data;}void write_cmd(unsigned char cmd){	ioctl(lcd_fd, LCD_WRITE_CMD, &cmd);}void lcd_reset(void){	ioctl(lcd_fd, LCD_RESET,0);	}void lcd_backlight(unsigned char light){	ioctl(lcd_fd, LCD_BACK_LIGHT,&light);	}void lcd_init(void){	write_cmd(CMD_EXT_MODE_OFF);	// EXT=0	write_cmd(CMD_SLEEP_OUT);		// SLEEP OUT	write_cmd(CMD_OSC_ON);		// INTERNAL OSCILLATION ON	write_cmd(CMD_PWR_CTRL);		// POWER CONTROL SET	write_data(0x08);				// TURN ON BOOSTER first;		usleep(10000);	//10ms		write_cmd(CMD_PWR_CTRL);		// POWER CONTROL SET	write_data(0x0B);				// TURN ON BOOSTER AND REFERENCE VOLTAGE GENERATION CIRCUIT ;0bh	write_cmd(CMD_VOL_CTRL);		// (0x81) REFERENCE VOLTAGE SELECT MODE #ifdef	LCD_1	write_data(0x0a);				// REFERENCE VOLTAGE PARAMETER ;16	write_data(0x05);				// SET REFERENCE VOLTAGE PARAMETER ;04#else	write_data(0xA0);	write_data(0x04);#endif		write_cmd(CMD_DISPLAY_CTRL); 	// DISPLAY CONTROL 	write_data(0x00);				// CL DIVIDING RATIO ,F1 AND F2 DRIVE PATTERN	write_data(0x27);				// DRIVER DUTY 1/160	write_data(0x00);				// FR INVERSE-SET VALUE 16	write_cmd(CMD_DISPLAY_NORMAL );  // DISPLAY NORMAL(0xA6)	write_cmd(CMD_COM_SCAN); 		// (0xBB)C0M0-->COM79,C0M159-->COM81#ifdef	LCD_1	write_data(0x02); #else	write_data(0x01);#endif		write_cmd(CMD_DATASCN_DIRECTION); // (0xBC)data scan direction	#ifdef	LCD_1	write_data(0x02);     //inverse mode	write_data(0x01);     //p3p2p1...#else	write_data(0x01);	write_data(0x00);#endif	write_data(0x02);     //3B3P	write_cmd(CMD_LINEADDR_SET); 	//(0x75)line address set	write_data(0x00);                             //start line	write_data(0x9f);                              //end line	write_cmd(CMD_COLADD_SET);		//(0x15) SET COLUMN ADDRESS #ifdef	LCD_1	write_data(0x1f);// START COLUMN	write_data(0x54);// ENDCOLUMN#else	write_data(0x0F);	write_data(0x44);#endif	write_cmd(CMD_EXT_MODE_ON); // EXT=1	//==================================================== 	write_cmd(CMD_SET_GRAY1);// SET GRAY VALUE	write_data(0X00);// START PARA00	write_data(0X03);// START PARA03 	write_data(0X06);// START PARA06	write_data(0X09);// START PARA09	write_data(0X0B);// START PARA	write_data(0X0D);// START PARA	write_data(0X0E);// START PARA 	write_data(0X0F);// START PARA	 	write_data(0X10);// START PARA	write_data(0X11);// START PARA	write_data(0X12);// START PARA 	write_data(0X14);// START PARA	write_data(0X16);// START PARA	write_data(0X18);// START PARA	write_data(0X1B);// START PARA 	write_data(0X1F);// START PARA	write_cmd(CMD_SET_GRAY2);// SET GRAY VALUE	write_data(0X00);// START PARA00	write_data(0X03);// START PARA03 	write_data(0X06);// START PARA06	write_data(0X09);// START PARA09	write_data(0X0B);// START PARA	write_data(0X0D);// START PARA	write_data(0X0E);// START PARA 	write_data(0X0F);// START PARA	 	write_data(0X10);// START PARA	write_data(0X11);// START PARA	write_data(0X12);// START PARA 	write_data(0X14);// START PARA	write_data(0X16);// START PARA	write_data(0X18);// START PARA	write_data(0X1B);// START PARA 	write_data(0X1F);// START PARA	write_cmd(CMD_ANA_SET);		// ANALOG CIRCUIT SET 	write_data(0x00);				// OSC FREQUENCEY ADJUSTMENT	write_data(0x01);				// BOOSTER EFFICIENCY SET	write_data(0x00);				// BIAS SETTING 1/14	write_cmd(CMD_SOFT_INIT);		// DITHERER OFF	write_cmd(CMD_EXT_MODE_OFF); 	// EXT=0	write_cmd(CMD_DISPLAY_ON); 		// display on;}///////////////////////////////////////////////////设置XY坐标//////////////////////////////////////////////////////void set_addr(unsigned char x_pos,unsigned char y_pos){  	write_cmd(0X30);   //EXT=0      	write_cmd(0X75);   //THIRD  COMMAND SET LINE ADDRESS	write_data(x_pos);  //START LINE	write_data(159);    //END   LINE      	write_cmd(0X15);   //THIRD  COMMAND SET COLUMN ADDRESS	write_data(y_pos);  //START COLUMN 	write_data(0x53);  //END   COLUMN          }//////////////////////在坐标XY处开始写入1个点的数据,并且保持处于这列中的其它两个值不变////////////////////////void write_xy(unsigned char x_pos, unsigned char y_pos, unsigned char data){	unsigned char i, l, j;	unsigned char mem=0;	unsigned char data1, data2, data3, col=0, set=0;	unsigned int  count=0;     	i = l = j = 0;		col = y_pos/3;				//[得到Y轴上的列,一些写一个列,一个列里包含3个数据]	set = y_pos%3;			//[得到块上3个点中的一个]		set_addr( x_pos, col );  	//[因为选择了行不变,而列由3个竖条小列组成,所以一次要写3个点]	write_cmd(0x5D);       //从RAM内读坐标的值   	read_data(data1);  //[空读一个头数据]	data1 = read_data(data1);   //[读取原来的3个点的值]	data2 = read_data(data2);	data3 = read_data(data3);  	set_addr(x_pos, col);  //在指定坐标的RAM内写入显示值		write_cmd(0x5C);		switch(set)	{		case 0:			data1 = data;			break;		case 1:			data2 = data;			break;		case 2:			data3 = data;			break;	}     	write_data(data1);    //[写入新点的值,并且保持原来两个点的值不变]	write_data(data2);	write_data(data3);         }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////char display(unsigned char start_x, unsigned char start_y, const unsigned char data[], unsigned char wide, unsigned char height){	unsigned char line=0, col=0;	unsigned int pos=0;		if( (start_x + wide)>160 || ((start_y + height) >160) )    /*显示边界*/	{		return -1;    	}    	for(line=0; line<height; line++)	{		for(col=0; col<wide; col++)		{			if( (data[(pos>>3)] & (1<<(7-(col%8)))) >0)			{				write_xy(start_x + col, start_y + line, 0xff);			}			pos++;		}			}    	return 0;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////void display_bmp(const unsigned char *pic){	unsigned int i, j, k;	write_cmd(CMD_MEM_WRITE);	//DATA WRITE 		for(j=0; j<160; j++)	{		write_data(0x00);				write_data(0x00);				for(i=0; i<160/8; i++)		{			for(k=0; k<8;++k)			{				if(pic[j*20+i]&(0x80>>k))					write_data(0x00);				else					write_data(0xff);			}		}	}}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////int main (void){	lcd_fd = open("/dev/at91_lcd", O_RDWR);		if ( lcd_fd == -1 )	{		printf("Error Opening at91_lcd. \n");		return -1;	}		lcd_reset();	sleep(1);			lcd_init();		while(1)	{		display_bmp(lcd1);				sleep(1);				display_bmp(lcd2);				sleep(1);				display_bmp(lcd3);				sleep(1);			}		lcd_backlight(0);	sleep(1);	lcd_backlight(1);		close(lcd_fd);}

⌨️ 快捷键说明

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