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