STM32液晶屏驱动程序
SSD1289主控液晶的STM32驱动程序
SSD1289主控液晶的STM32驱动程序#include "GLCD.h"#include "AsciiLib.h"#include "Hzlib.h"#include "win7.h"/************************************************************** ****************** Function Name : Lcd_Configuration* Description : Configures LCD Control lines* Input : None* Output : None* Return : None* Attention : None*************************************************************** ****************/static void LCD_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);/*GPIOE=DATABUS*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOE, &GPIO_InitStructure);/* PD.13(RS), PD.14(WR), PD.15(RD),PD.12(CS) ,PD11(RST)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : LCD控制器寄存器地址* Input : - index: 寄存器地址* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_WriteIndex(uint16_t index){Clr_Rs;Set_nRd;GPIOE->ODR = index;Clr_nWr;Set_nWr;}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : LCD寄存器数据* Input : - index: 寄存器数据* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_WriteData(uint16_t data){Set_Rs;GPIOE->ODR = data;Clr_nWr;Set_nWr;}/************************************************************** ****************** Function Name : LCD_ReadData* Description : 读取控制器数据* Input : None* Output : None* Return : 返回读取到的数据* Attention : None*************************************************************** ****************/uint16_t LCD_ReadData(void){uint16_t value;Set_Rs;Set_nWr;Clr_nRd;GPIOE->CRH = 0x44444444;GPIOE->CRL = 0x44444444;value = GPIOE->IDR;value = GPIOE->IDR;GPIOE->CRH = 0x33333333;GPIOE->CRL = 0x33333333;Set_nRd;return value;}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : Writes to the selected LCD register.* Input : - LCD_Reg:address of the selected register.* - LCD_RegValue: value to write to the selected register.* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue){LCD_WriteIndex(LCD_Reg);LCD_WriteData(LCD_RegValue);}/************************************************************** ****************** Function Name : LCD_WriteReg* Description : Reads the selected LCD Register.* Input : None* Output : None* Return : LCD Register Value.* Attention : None*************************************************************** ****************/uint16_t LCD_ReadReg(uint16_t LCD_Reg){uint16_t LCD_RAM;LCD_WriteIndex(LCD_Reg);LCD_RAM = LCD_ReadData();return LCD_RAM;}/************************************************************** ****************** Function Name : LCD_SetCursor* Description : Sets the cursor position.* Input : - Xpos: specifies the X position.* - Ypos: specifies the Y position.* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_SetCursor( uint16_t Xpos, uint16_t Ypos ){LCD_WriteReg(0x004e, Ypos );LCD_WriteReg(0x004f, Xpos );}/************************************************************** ****************** Function Name : LCD_Delay* Description : Delay Time* Input : - nCount: Delay Time* Output : None* Return : None* Return : None* Attention : None*************************************************************** ****************/static void delay_ms(uint16_t ms){uint16_t i,j;for( i = 0; i < ms; i++ ){for( j = 0; j < 1141; j++ );}}/************************************************************** ****************** Function Name : LCD_Initializtion* Description : Initialize TFT Controller.* Input : None* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Initializtion(void){LCD_Configuration();Clr_Cs;Clr_Rst;delay_ms(100);Set_Rst;delay_ms(100);LCD_WriteReg(0x0000,0x0001);//打开晶振LCD_WriteReg(0x0010,0x0000);//退出休眠delay_ms(50);LCD_WriteReg(0x0001,0x293F);//横屏显示LCD_WriteReg(0x0007,0x0033);//LCD_WriteReg(0x0011,0x6838);//横屏显示LCD_WriteReg(0x0002,0x0600);/*gamma*/LCD_WriteReg(0x0030,0x0101);LCD_WriteReg(0x0031,0x0101);LCD_WriteReg(0x0032,0x0101);LCD_WriteReg(0x0033,0x0101);LCD_WriteReg(0x0034,0x0101);LCD_WriteReg(0x0035,0x0101);LCD_WriteReg(0x0036,0x0101);LCD_WriteReg(0x0037,0x0101);LCD_WriteReg(0x003A,0x0101);LCD_WriteReg(0x003B,0x0101);/*Pixel*/LCD_WriteReg(0x0044,0xEF00);LCD_WriteReg(0x0045,0x0000);LCD_WriteReg(0x0046,0x013F);}/************************************************************** ****************** Function Name : LCD_Clear* Description : 将屏幕填充成指定的颜色,如清屏,则填充 0xffff * Input : - Color: Screen Color* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Clear(uint16_t Color){uint32_t index=0;LCD_Window(0,319,0,239);for( index = 0; index <76800; index++ )LCD_WriteData(Color);}/************************************************************** ****************** Function Name : LCD_Window* Description : LCD窗口显示* Input : xs,xe,ys,ye窗口坐标* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Window(uint16_t xs,uint16_t xe,uint16_t ys,uint16_t ye){LCD_WriteReg(0x0044,ys+(ye<<8));LCD_WriteReg(0x0045,xs);LCD_WriteReg(0x0046,xe);LCD_SetCursor(xs,ys);LCD_WriteIndex(0x0022);}/************************************************************** ***************** Function Name : LCD_GetPoint* Description : 获取指定座标的颜色值* Input : - Xpos: Row Coordinate* - Xpos: Line Coordinate* Output : None* Return : Screen Color* Attention : None*************************************************************** ****************/uint16_t LCD_GetPoint(uint16_t Xpos,uint16_t Ypos){uint16_t dummy;LCD_SetCursor(Xpos,Ypos);LCD_WriteIndex(0x0022);dummy = LCD_ReadData(); /* 空读一次 */dummy = LCD_ReadData();return dummy;}/************************************************************** ***************** Function Name : LCD_SetPoint* Description : 在指定座标画点* Input : - Xpos: Row Coordinate* - Ypos: Line Coordinate* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_SetPoint(uint16_t Xpos,uint16_t Ypos,uint16_t point){if( Xpos >= MAX_X || Ypos >= MAX_Y )return;LCD_SetCursor(Xpos,Ypos);LCD_WriteReg(0x0022,point);}/************************************************************** ***************** Function Name : LCD_DrawLine* Description : Bresenham's line algorithm* Input : - x1: A点行座标* - y1: A点列座标* - x2: B点行座标* - y2: B点列座标* - color: 线颜色* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_DrawLine( uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1 , uint16_t color ){short dx,dy; /* 定义X Y轴上增加的变量值 */short temp; /* 起点终点大小比较交换数据时的中间变量 */if( x0 > x1 ) /* X轴上起点大于终点交换数据 */{temp = x1;x1 = x0;x0 = temp;}if( y0 > y1 ) /* Y轴上起点大于终点交换数据 */{temp = y1;y1 = y0;y0 = temp;}dx = x1-x0; /* X轴方向上的增量 */dy = y1-y0; /* Y轴方向上的增量 */if( dx == 0 ) /* X轴上没有增量画垂直线 */{do{LCD_SetPoint(x0, y0, color); /* 逐点显示描垂直线 */ y0++;}while( y1 >= y0 );return;}if( dy == 0 ) /* Y轴上没有增量画水平直线 */{do{LCD_SetPoint(x0, y0, color); /* 逐点显示描水平线 */ x0++;}while( x1 >= x0 );return;}/* 布兰森汉姆(Bresenham)算法画线 */if( dx > dy ) /* 靠近X轴 */{temp = 2 * dy - dx; /* 计算下个点的位置 */while( x0 != x1 ){LCD_SetPoint(x0,y0,color); /* 画起点 */x0++; /* X轴上加1 */if( temp > 0 ) /* 判断下下个点的位置 */{y0++; /* 为右上相邻点,即(x0+1,y0+1) */temp += 2 * dy - 2 * dx;}elsetemp += 2 * dy; /* 判断下下个点的位置 */}LCD_SetPoint(x0,y0,color);}else{temp = 2 * dx - dy; /* 靠近Y轴 */while( y0 != y1 ){LCD_SetPoint(x0,y0,color);y0++;if( temp > 0 ){x0++;temp+=2*dy-2*dx;}elsetemp += 2 * dy;}LCD_SetPoint(x0,y0,color);}}/************************************************************** ***************** Function Name : DrawCircle* Description : 在屏幕任意位置画圆* Input : - X0: 水平坐标* - Y0: 垂直坐标* - R: 圆半径* - Color: 圆颜色* Output : None* Return : None* Attention : None*************************************************************** ****************/void DrawCircle(uint16_t X0,uint16_t Y0,uint16_t R,uint16_t color){uint16_t a=0,b=0;int16_t di=0;b=R;di=1-R;while(a<=b){LCD_SetPoint(X0+b,Y0-a,color);//0LCD_SetPoint(X0-a,Y0+b,color);//1LCD_SetPoint(X0-a,Y0-b,color);//2LCD_SetPoint(X0-b,Y0-a,color);//3LCD_SetPoint(X0+b,Y0+a,color);//4LCD_SetPoint(X0+a,Y0-b,color);//5LCD_SetPoint(X0+a,Y0+b,color);//6LCD_SetPoint(X0-b,Y0+a,color);//7a++;if(di<0){di+=(a<<1)+3;}else{di+=((a-b)<<1)+5;b--;}}}/************************************************************** ***************** Function Name : PutChar* Description : 将Lcd屏上任意位置显示一个字符* Input : - Xpos: 水平坐标* - Ypos: 垂直坐标* - ASCI: 显示的字符* - charColor: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void PutChar( uint16_t Xpos, uint16_t Ypos, uint8_t ASCI, uint16_t charColor, uint16_t bkColor,uint8_t ack){uint16_t i, j;uint8_t buffer[16], tmp_char;GetASCIICode(buffer,ASCI); /* 取字模数据 */LCD_Window(Xpos,Xpos+7,Ypos,Ypos+15); LCD_WriteIndex(0x0022);if(ack==0){for( i=0; i<16; i++ ){tmp_char = buffer[i];for(j=0;j<8;j++){if( (tmp_char >> 7 - j) & 0x01 == 0x01 ) LCD_WriteData(charColor); /* 字符颜色 */ elseLCD_ReadData();/*无背景色*/}}}else{for( i=0; i<16; i++ ){tmp_char = buffer[i];for(j=0;j<8;j++){if( (tmp_char >> 7 - j) & 0x01 == 0x01 ) LCD_WriteData(charColor); /* 字符颜色 */ elseLCD_WriteData(bkColor); /* 背景颜色 */}}}}/************************************************************** ***************** Function Name : GUI_Text* Description : 在指定座标显示字符串* Input : - Xpos: 行座标* - Ypos: 列座标* - str: 字符串* - charColor: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void GUI_Text(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor,uint8_t ack){uint8_t TempChar;do{TempChar = *str++;PutChar( Xpos, Ypos, TempChar, Color, bkColor ,ack);if( Xpos < MAX_X - 8 )Xpos += 8;else if ( Ypos < MAX_Y - 16 ){Xpos = 0;Ypos += 16;}else{Xpos = 0;Ypos = 0;}}while ( *str != 0 );}/************************************************************** ***************** Function Name : PutChinese* Description : 将Lcd屏上任意位置显示一个中文字* Input : - Xpos: 水平坐标* - Ypos: 垂直坐标* - str: 显示的中文字* - Color: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void PutChinese(uint16_t Xpos,uint16_t Ypos,uint8_t *str,uint16_t Color,uint16_tbkColor,uint8_t ack){uint8_t i,j;uint8_t buffer[32];uint16_t tmp_char=0;GetGBKCode(buffer,str); /* 取字模数据 */ LCD_Window(Xpos,Xpos+15,Ypos,Ypos+15); if(ack==0){for ( i = 0; i < 16; i++ ){tmp_char = buffer[i*2];tmp_char = ( tmp_char << 8 );tmp_char |= buffer[2*i+1];for (j = 0; j < 16; j++ ){if ( (tmp_char >> 15-j ) & 0x01 == 0x01 ) LCD_WriteData(Color); /* 字符颜色 */elseLCD_ReadData(); /* 无背景颜色 */}}}else{for ( i = 0; i < 16; i++ ){tmp_char = buffer[i*2];tmp_char = ( tmp_char << 8 );tmp_char |= buffer[2*i+1];for (j = 0; j < 16; j++ ){if ( (tmp_char >> 15-j ) & 0x01 == 0x01 )LCD_WriteData(Color); /* 字符颜色 */elseLCD_WriteData(bkColor); /* 背景颜色 */}}}}/************************************************************** ***************** Function Name : GUI_Chinese* Description : 在指定座标显示字符串* Input : - Xpos: 行座标* - Ypos: 列座标* - str: 字符串* - charColor: 字符颜色* - bkColor: 背景颜色- ack:背景色控制(0:无背景色;1:有背景色;)* Output : None* Return : None* Attention : None*************************************************************** ****************/void GUI_Chinese(uint16_t Xpos, uint16_t Ypos, uint8_t *str,uint16_t Color, uint16_t bkColor,uint8_t ack){do{PutChinese(Xpos,Ypos,str++,Color,bkColor,ack);str++;if ( Xpos < MAX_X - 16 )Xpos += 16;else if ( Ypos < MAX_Y - 16 ){Xpos = 0;Ypos += 16;}else{Xpos = 0;Ypos = 0;}}while(*str!=0);}/************************************************************** ****************** Function Name : LCD_Picture* Description : LCD显示图片* Input : xs,xe,ys,ye* Output : None* Return : None* Attention : None*************************************************************** ****************/void LCD_Picture(uint16_t xs,uint16_t xe,uint16_t ys,uint16_t ye){uint32_t temp;LCD_Window(xs,xe,ys,ye);for(temp=0;temp<(xe-xs+1)*(ye-ys+1);temp++)LCD_WriteData((win7[2*temp]<<8)+win7[2*temp+1]);}/************************************************************** *******************************************END FILE*************************************************************** ******************************************/。
STM32驱动12864液晶屏
STM32驱动12864液晶屏#include "stm32f10x_lib.h"#define uint unsigned int#define uchar unsigned char#define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0)#define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0)#define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1)#define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1)#define ENH GPIO_SetBits(GPIOA,GPIO_Pin_2)#define ENL GPIO_ResetBits(GPIOA,GPIO_Pin_2)#define CS1H GPIO_SetBits(GPIOA,GPIO_Pin_3)#define CS1L GPIO_ResetBits(GPIOA,GPIO_Pin_3)#define CS2H GPIO_SetBits(GPIOA,GPIO_Pin_4)#define CS2L GPIO_ResetBits(GPIOA,GPIO_Pin_4)void RCC_Configuration(void);void NVIC_Configuration(void);void GPIO_Configuration(void);void Delay();uchar table[][16]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00 ,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00 ,/*-- 文字: 爸 --*//*-- 文字: 一 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,/*-- 文字: 天 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00 ,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00 ,/*-- 文字: 的 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00 ,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00 ,/*-- 文字: 成 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0xC8,0x08,0xFF,0x08,0x09,0x0A,0xC8,0x88,0x08,0x00 ,0x40,0x30,0x0F,0x00,0x08,0x50,0x4F,0x20,0x10,0x0B,0x0C,0x12,0x21,0x40,0xF0,0x00 ,/*-- 文字: 果 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x3E,0x2A,0x2A,0x2A,0xFE,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00 ,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x09,0x11,0x31,0x11,0x00 ,};void Write_cmd_left(uchar cmd) {RSL;RWL;CS1H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_cmd_right(uchar cmd) {RSL;RWL;CS2H;GPIO_Write(GPIOF,cmd);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void Write_data_left(uchar data) {RSH;RWL;CS2L;CS1H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS1L;}void Write_data_right(uchar data) {RSH;RWL;CS1L;CS2H;GPIO_Write(GPIOF,data);ENL;Delay(50);ENH;Delay(50);ENL;Delay(50);CS2L;}void led_disp(uchar *p,uchar lr) {uchar i,cl,cr;if(lr=='L'){for(i=0;i<16;i++){cl=*p;p++;Write_data_left(cl);}}if(lr=='R'){for(i=0;i<16;i++){cr=*p;p++;Write_data_right(cr);}}}void clear(){uchar i,j,disp_page;for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_left(disp_page);Write_cmd_left(0x40);for(j=0;j<64;j++)Write_data_left(0x00);}for(i=0;i<8;i++){disp_page=0xb8+i;Write_cmd_right(disp_page);Write_cmd_right(0x40);for(j=0;j<64;j++)Write_data_right(0x00);}}void init(){Write_cmd_left(0x30);Delay(10);Write_cmd_right(0x30);Delay(10);Write_cmd_left(0x3f);Delay(10);Write_cmd_right(0x3f);Delay(10);Write_cmd_left(0xc0);Delay(10);Write_cmd_right(0xc0);}int main(void){/* Infinite loop */RCC_Configuration();NVIC_Configuration();GPIO_Configuration();clear();Delay(10);init();Delay(10);uchar i;while(1){Write_cmd_left(0xb8);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i],'L');Write_cmd_left(0xb8+1);Write_cmd_left(0x40);for(i=0;i<4;i++)led_disp(table[2*i+1],'L');Write_cmd_right(0xb8);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+8],'R');Write_cmd_right(0xb8+1);Write_cmd_right(0x40);for(i=0;i<2;i++)led_disp(table[2*i+9],'R');}}/*******************************************************************************Function Name :RCC_Configuration.*Descriprion :configures the different system clocks.*Input :None*Output :None*Return :None******************************************************************************* /void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/*RCC system reset(for debug purpose)*/RCC_DeInit();/*Enable HSE 打开外部时钟*/RCC_HSEConfig(RCC_HSE_ON);/*Wait till HSE is read */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS)//起振成功{/*Enable PrefetchBuffer 打开flash的预存储功能*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值/*HCLK=syclk*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*RCLK1=HCLK*/RCC_PCLK1Config(RCC_HCLK_Div2);/*PLLCLK=8MHZ*9=72MHZ*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*Select PLL as system clock source*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till pll used as system clock source*/while(RCC_GetSYSCLKSource() !=0x80){}/*打开相应的外部时钟:GPIOF*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); }else{}}/*******************************************************************************Function Name :NVIC_Configuration.*Descriprion :configures Vector Table base location.*Input :None*Output :None*Return :None******************************************************************************* /void NVIC_Configuration(void){#ifdef VECT_TAB_RAM/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);#else/*Set the vector table base location at 0x20000000*/NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endif}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//设置GPIO的工作状态GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; / /设置GPIO的速度GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_Init(GPIOA, &GPIO_InitStructure);}/******************************************************************************延时函数******************************************************************************/void Delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=100;y>0;y--);}以上是鑫洪泰的小编为你带来的液晶屏ST7565R IC驱动程序演示代码介绍,如果你想有更进一步的了解,请您关注我们微信,或者点击我们官网了解我们,也可以在线咨询或者拨打我们的热线电话与我们联系!我们会有专业的工作人员为你实时解答。
STM32液晶屏驱动程序
附录2整个设计全部源程序:/*以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin3.0版环境下均测试通过。
*/ #include <AT89x51.H>unsigned int zimo,xx=0; //zimo是字模计数器,xx为分屏显示的时候的字数。
unsigned char yid,h; //yid为移动计数器,h为行段计数器unsigned char code hanzi[]; //汉字字模unsigned char BUFF[18],BUFF2[18]; //左移显示的缓存void qing(void); void xianshi(void);void fen(void); void zuo(void);void in_data(void); //调整数据void rxd_data(void); //左移发送数据void out_rxd(unsigned char *d); //分屏、上移发送数据char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*//***********主程序******************/void main(void){ unsigned char ee;SCON=0;P1=0;yid=0;zimo=0;while(1){ fen(); //分屏显示for(ee=30;ee>0;ee--)//清屏幕3秒{qing();}zuo(); //左移显示for(ee=30;ee>0;ee--){qing();}}}/**********清屏幕*******************/void qing (void){ unsigned char zz,xx=0x0ff;for (zz=33;zz>0;zz--){out_rxd(&xx);}P1=0xff; P1=0; //锁存为高,74HC595锁存信号P2=0; //清74LS138的使能端}/**********分屏显示***********/void fen(void){ do{ xianshi(); }while(xx++<=5); //调用单屏显示xx=0;}/************单屏显示*************/void xianshi(void){ unsigned char ii,jj; unsigned int kk,aa;for (kk=500;kk>0;kk--) //每屏显示500次{for(ii=1;ii<16;ii+=2) //每个汉字分8行扫描{for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次{ aa=(xx*8+jj)*32+ii;out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。
STM32单片机对TFTLCD的驱动设计
STM32单片机对TFTLCD的驱动设计STM32单片机对TFTLCD(TFT液晶屏)的驱动设计是一种基于STM32单片机的液晶显示技术。
TFTLCD是一种高分辨率、高色彩鲜艳的显示技术,常用于嵌入式设备的显示界面。
在设计STM32单片机对TFTLCD的驱动时,需要考虑到单片机的硬件资源和软件设计。
一、硬件设计:1.接口设计:根据TFTLCD的规格书,确定TFTLCD的接口类型(如SPI、RGB等),然后根据接口类型选择合适的引脚来连接TFTLCD与STM32单片机。
2.时钟设计:TFTLCD需要一个稳定的时钟信号来提供时序控制,可以使用STM32单片机的定时器来生成时钟信号。
3.电源设计:TFTLCD需要一定的电压供应,可以通过外部的电源模块提供合适的电压给TFTLCD。
二、软件设计:1.初始化:在驱动设计的开始阶段,需要初始化TFTLCD的相关参数,如分辨率、颜色格式等。
2.数据传输:根据TFTLCD的接口类型,使用合适的通信协议进行数据传输。
如果是SPI接口,可以使用STM32的SPI外设来传输数据;如果是RGB接口,可以通过GPIO口来控制数据线的高低电平。
3.显示控制:通过向TFTLCD发送相应的控制指令,来实现对显示内容的控制,如清屏、画点、画线、显示图像等。
4.刷新机制:TFTLCD的驱动需要实现刷新机制,即在TFTLCD的刷新周期内,不断向TFTLCD发送新的数据。
可以使用双缓冲机制,先将数据写入一个缓冲区,再将缓冲区的数据一次性发送给TFTLCD,以提高刷新效率。
在STM32单片机对TFTLCD的驱动设计中,需要根据具体的TFTLCD型号和规格书来进行具体的硬件和软件设计。
每个TFTLCD的驱动设计都是独特的,需要根据具体的需求和要求来进行设计。
同时,也需要根据单片机的性能和资源来进行合理的设计,以确保驱动的效率和稳定性。
总结来说,STM32单片机对TFTLCD的驱动设计需要同时考虑硬件和软件的设计。
STM32的LCD19264-12864经典程序
现在STM32越来越流行,在学校搞的很火,本人最近也在学习,做了一个LCD19264的程序,先与大家分享,多谢关注!本程序是有LCD12864该进的,液晶驱动为ST7920。
可以稍微改动即可用于12864一、以下是LCD19264头文件/////////////////////////////////////////////////////////////////////////////////******************************************************************** ************ 函数功能:STM32F103VET6 19264-1液晶显示,串---并口19264* 编写时间:2012.07.22* 作者:ZhouGanJin* 版本:V1.1* 液晶19264-1简介:并口不多说;串口引脚4根RW(SID),E1(CLK1),E2(CLK2),PSB=0, RS(CS)=1,* 通过预编译选择串并口方式********************************************************************* **********/#ifndef _LCD19264_H#define _LCD19264_H/* 端口定义---------------------------本程序只用了GPIOA-----------------------------------*//* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/#define LCD_RS_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //GPIOA->BSRR=GIOP_pin_0 #define LCD_RS_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) //GPIOA->BRR=GIOP_pin_0#define LCD_RW_H GPIO_SetBits(GPIOA, GPIO_Pin_1)#define LCD_RW_L GPIO_ResetBits(GPIOA, GPIO_Pin_1)#define LCD_E1_H GPIO_SetBits(GPIOA, GPIO_Pin_2)#define LCD_E1_L GPIO_ResetBits(GPIOA, GPIO_Pin_2)#define LCD_E2_H GPIO_SetBits(GPIOA, GPIO_Pin_3)#define LCD_E2_L GPIO_ResetBits(GPIOA, GPIO_Pin_3)#define LCD_PSB_H GPIO_SetBits(GPIOA, GPIO_Pin_4)#define LCD_PSB_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)#define LCD_DATA_PORT GPIOD#define LCD_DATA GPIOD->BSRR //BSRR高十六位是复位,低十六位是置位void Lcm_Wr_Dat(u8 wrdata,u8 enable); //写数据void Lcm_Wr_Com(u8 wrcommand,u8 enable); //写指令void Lcm_Rd_Status(u8 enable);//读忙状态void Lcm_Init(u8 enable); //液晶初始化void Lcm_GotoXY(u8 pos_X,u8 pos_y); //设定坐标void Lcm_SETXY(u8 pos_X,u8 pos_y,u8 enable);void Lcm_Disp_Char(u8 onechar,u8 enable);//显示单个字符void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable); //定坐标显示单个字符void Lcm_Disp_Str(u8 *string,u8 enable);//显示字符串void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable);//定坐标显示字符串void Delay_ms(u32 m);//1ms延时void Lcm_Delay(void);/*function all ------函数定义-------------以下函数包含19264液晶的串并行方式----------------------------------------*/#define PSB_SERIAL 0#ifdef PSB_SERIAL// -------以下为串口函数-------- serial transmission------/////-----------传送8bits 数据----void Send_byte(u8 bbyte,u8 enable){u8 i;for(i=0;i<8;i++){LCD_E1_L; LCD_E2_L;if(0x80&bbyte) LCD_RW_H; //SID=1;else LCD_RW_L;if(!enable) //CLK = 01 ; 串行用下降沿{LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}bbyte<<=1;Lcm_Delay(); //?}}//-----------写指令函数----void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Delay();Send_byte(0xf8,enable); //1111_1,RW(0),RS(0),0 -----------指令Send_byte(0xf0&wcomd,enable); //high 4bitsSend_byte(0xf8&(wcomd<<4),enable); //low 4bits}//-----------写数据函数----void Lcm_Wr_Dat(u8 wdata,u8 enable){Lcm_Delay();Send_byte(0xfa,enable); //1111_1,RW(0),RS(1),0 ---------数据Send_byte(0xf0&wdata,enable); //high 4bitsSend_byte(0xf8&(wdata<<4),enable); //low 4bits}#else// -------以下为并口函数-------- parallel Transmission-------/// //---------读忙函数----------------void Lcm_Rd_Status(u8 enable){u16 getd;while(1){Lcm_Delay();LCD_RS_L; //命令LCD_RW_H; //读取Lcm_Delay();//LCD_DATA=0xFFFF0000; //LCD_DATA=0xFF; 高16位为复位,即写入0使其不忙GPIO_Write(LCD_DATA_PORT, 0XFFFF) ; //准备读取数据, 写0x0000则与上相同Lcm_Delay();if(!enable){LCD_E1_L;Lcm_Delay();LCD_E1_H;getd=GPIO_ReadInputData(LCD_DATA_PORT);if((getd&0x0080)==0)break;}else{LCD_E2_L;Lcm_Delay();LCD_E2_H;if((getd&0x0080)==0)break;}}}//-----写指令----------------void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_L;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wcomd|(~wcomd<<16); //Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}// Lcm_Delay();}//------写数据----------------void Lcm_Wr_Dat(u8 wdata,u8 enable) {Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_H;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wdata|(~wdata<<16);Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}}#endif//----选定坐标,全屏选择---------- void Lcm_GotoXY(u8 pos_x,u8 pos_y) {u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;Lcm_Wr_Com(addr,0);//设定DDRAM地址Lcm_Wr_Com(addr,1);//设定DDRAM地址}//---选定坐标,分屏选择------------void Lcm_SETXY(u8 pos_x,u8 pos_y,u8 enable){u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;if(enable==0)Lcm_Wr_Com(addr,0);//设定DDRAM地址elseLcm_Wr_Com(addr,1);//设定DDRAM地址}//----------初始化----------------void Lcm_Init(u8 enable){#ifdef PSB_SERIALLCD_PSB_L; //选择串口#elseLCD_PSB_H; //选择并口#endifLcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x0c,enable); //开显示及光标设置Delay_ms(2);Lcm_Wr_Com(0x01,enable); //显示清屏Delay_ms(3);Lcm_Wr_Com(0x06,enable); //显示光标移动设置Delay_ms(3);}/*--------- display function----------以下为各种显示函数---------------------------------------*/void Lcm_Disp_Char(u8 onechar,u8 enable)//显示单个字符{Lcm_Wr_Dat(onechar,enable);}void Lcm_Disp_Str(u8 *strings,u8 enable)//显示字符串{while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable) //指定坐标显示字符{Lcm_GotoXY(x, y);Lcm_Wr_Dat(ch,enable);}void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable)//指定坐标显示字符串{Lcm_GotoXY(x, y);while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}二、以下是STM32配置函数/* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void WWDG_Configuration(void);/********************************************************************** ************* 函数名称:RCC_Configuration(void)** 函数功能:时钟初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* PLLCLK = 8MHz * 9 = 72 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}}/********************************************************************** ************* 函数名称:GPIO_Configuration(void)** 函数功能:端口初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void GPIO_Configuration(void){//定义端口结构体GPIO_InitTypeDef GPIO_InitStructure;//将GPIOA端口使能有效RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | //GPIOAGPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口}/********************************************************************** ************* 函数名称:NVIC_Configuration(void)** 函数功能:中断初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Init(&NVIC_InitStructure);}/******************************************************************************** *函数功能:延时函数/*--- Delay function-----------------延时函数定义********************************************************************* ************///------1ms延时------------void Delay_ms(u32 m){u32 i;for(; m != 0; m--)for (i=0; i<25000; i++); //clk=50MHz ,25_000000 分频得1s,25000分频得1ms}//---------液晶延时----------void Lcm_Delay(void){u8 j,i=100;while(i--){for(j=0;j<100;j++){;}}}#endif/*************结束***************/。
基于STM32的LCD驱动程序设计与实现
基于STM32的LCD驱动程序设计摘要:本文主要是对TFT-LCD(薄膜晶体管液晶显示器)进行相关的驱动程序设计,不同于以往常规的点阵屏和最原始的黑白显示屏,它的优点在于显示出的图像更亮、色彩更加艳丽、成像速度更快。
相当符合当前我们的主流产品,例如现在的各种电子产品,特别是汽车行业更是使用广泛。
近些年在不断更新电子技术的同时我们本身的基础技术也是一天一天的变化。
因为我们对现在的电子产品要求变高,使得对LCD显示成像的要求就变高,再加上我们对嵌入式工程的进一步推进。
因此,对于将嵌入式系统移植到所需要的驱动模块上去也就成为主流,正因为于此,对LCD 的驱动设计是很有意义和价值的。
关键词:TFT-LCD;显示;彩色界面Abstract:This paper is mainly about the design of TFT-LCD (thin film transistor liquid crystal display),which is different from the conventional dot matrix screen and the most original black and white display screen. Its advantages are that the image is brighter,the color is brighter,and the speed of the imaging is faster. It is quite consistent with our current mainstream products,for example,various electronic products,especially the automotive industry,are widely used.In recent years, while constantly updating the electronic technology, our basic technology is also changing day by day. Because our requirements for current electronic products are higher, the requirement for LCD display imaging becomes higher, and our embedded engineering is further pushed forward. Therefore, it is also the mainstream for the embedded system to be transplanted to the required driver modules. Because of this, the driver design of LCD is of great significance and value.Key words:TFT-LCD;Display;Color shape interface目录摘要 (I)Abstract (I)目录 (II)1 绪论 (1)1.1 研究背景 (1)1.2 选题目的 (1)1.3 研究内容 (1)2 开发环境与技术 (2)2.1 开发环境 (2)2.1.1 MDK软件安装 (2)2.1.2 USB串口驱动安装 (2)2.2 开发技术 (2)2.2.1 C语言 (3)2.2.2 ILI9341 液晶控制器 (3)2.2.3 ILI9341指令 (4)3 TFT-LCD简介 (8)3.1 TFT-LCD特点 (8)3.2 外观图如下 (9)3.3 原理图如下 (9)3.4 接口定义图如下 (9)3.5 TFT-LCD 模块的使用流程如图如下 (10)4 系统设计 (11)4.1 硬件设计 (11)4.2 软件设计 (12)4.2.1 关键结构体 (12)4.2.2 ILI9341.c 里面的一些重要函数 (13)4.2.3 lcd.h 文件相关配置 (24)4.2.4 main()主函数代码 (25)5 系统功能实现及测试 (27)5.1 测试目的 (27)5.2 测试过程 (27)5.3 测试结果 (28)总结 (30)参考文献 ................................................................................................... 错误!未定义书签。
STM32的LCD1602显示程序
STM32的LCD1602显⽰程序STM32的LCD1602显⽰程序以下为课设期间为1602显⽰屏驱动写的stm32的程序,其中参考了许多⼤佬的例⼦程序设计:硬件原理:D0-D7⽤的是PD0-PD7,RS为PB10,E为PB11,RW为PB12,使⽤的板⼦是STM32F103VET6下⾯是我的程序,只完成了基础功能,并没有⾃定义字模部分的代码lcd.h#ifndef __LCD_H#define __LCD_H#include "stm32f10x.h"/////////////////////////////////////////////////////////#define D0_1 GPIO_SetBits(GPIOD,GPIO_Pin_0)#define D0_0 GPIO_ResetBits(GPIOD,GPIO_Pin_0)#define D1_1 GPIO_SetBits(GPIOD,GPIO_Pin_1)#define D1_0 GPIO_ResetBits(GPIOD,GPIO_Pin_1)#define D2_1 GPIO_SetBits(GPIOD,GPIO_Pin_2)#define D2_0 GPIO_ResetBits(GPIOD,GPIO_Pin_2)#define D3_1 GPIO_SetBits(GPIOD,GPIO_Pin_3)#define D3_0 GPIO_ResetBits(GPIOD,GPIO_Pin_3)#define D4_1 GPIO_SetBits(GPIOD,GPIO_Pin_4)#define D4_0 GPIO_ResetBits(GPIOD,GPIO_Pin_4)#define D5_1 GPIO_SetBits(GPIOD,GPIO_Pin_5)#define D5_0 GPIO_ResetBits(GPIOD,GPIO_Pin_5)#define D6_1 GPIO_SetBits(GPIOD,GPIO_Pin_6)#define D6_0 GPIO_ResetBits(GPIOD,GPIO_Pin_6)#define D7_1 GPIO_SetBits(GPIOD,GPIO_Pin_7)#define D7_0 GPIO_ResetBits(GPIOD,GPIO_Pin_7)#define RS_1 GPIO_SetBits(GPIOB,GPIO_Pin_10)#define RS_0 GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define RW_1 GPIO_SetBits(GPIOB,GPIO_Pin_12)#define RW_0 GPIO_ResetBits(GPIOB,GPIO_Pin_12)#define E_1 GPIO_SetBits(GPIOB,GPIO_Pin_11)#define E_0 GPIO_ResetBits(GPIOB,GPIO_Pin_11)/////////////////////////////////////////////////////////void LCD_Init(void);//初始化void LCD_Clear(void);//清除显⽰void LCD_CursorReset(void);//光标返回void LCD_SetInput(u16,u16);//置输⼊模式void LCD_Display(u16,u16,u16);//显⽰开关控制void LCD_COD(u16,u16);//光标或显⽰移动指令void LCD_Mode(u16,u16,u16);//⼯作⽅式设置void LCD_CGRAM_Addr(u8);//设置CGRAN地址,除置位位以外共六位void LCD_DDRAM_Addr(u8);//设置DDRAM地址,除置位位以外共七位void LCD_RB(void);//当1602处于忙状态时,不接受指令,当不忙时,接受指令void LCD_Write(u8);//写⼊数据void LCD_Read(void);//读取数据void LCD_WriteStr(u8*,int);//写⼊字符串#endiflcd.c#include "lcd.h"#include "stm32f10x_gpio.h"void LCD_Init(void){GPIO_InitTypeDef GPIO_LCDStr;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_LCDStr.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_LCDStr.GPIO_Speed=GPIO_Speed_50MHz;GPIO_LCDStr.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOD,&GPIO_LCDStr);GPIO_LCDStr.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_10;GPIO_Init(GPIOB,&GPIO_LCDStr);}//////////////////////////////////////////////////////////////////////////////void LCD_Clear(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x01);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_CursorReset(void){E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x02);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////void LCD_SetInput(u16 ID,u16 S){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_0;D2_1;if(ID==1)/*⾼电平光标右移,低电平左移*/D1_1;else if(ID==0)D1_0;if(S==1)/*屏幕上所有的⽂字是否左移或右移,⾼电平有效,低电平⽆效*/ D0_1;else if(S==0)D0_0;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Display(u16 D,u16 C,u16 B){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_0;D3_1;if(D==1)//⾼电平开,低电平关D2_1;else if(D==0)D2_0;if(C==1)//⾼电平有光标,低电平⽆光标D1_1;else if(C==0)D1_0;if(B==1)//光标是否闪烁,⾼电平闪烁,低电平⽆D0_1;else if(B==0)D0_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_COD(u16 SC,u16 RL){E_0;LCD_RB();RS_0;RW_0;D7_0;D6_0;D5_0;D4_1;D1_1;D0_1;if(SC==1)//⾼电平显⽰移动的⽂字,低电平移动坐标D3_1;else if(SC==0)D3_0;if(RL==1)//⾼电平右移,低电平左移D2_1;else if(RL==0)D2_0;E_1;E_0;}////////////////////////////////////////////////////////////////////////////////////////////void LCD_Mode(u16 DL,u16 N,u16 F){E_0;LCD_RB();E_1;RS_0;RW_0;D7_0;D6_0;D5_1;D1_1;D0_1;if(DL==1)//⾼电平⼋位数据接⼝,低电平四位数据接⼝D4_1;else if(DL==0)D4_0;if(N==1)//⾼电平两⾏显⽰,低电平⼀⾏显⽰D3_1;else if(N==0)D3_0;if(F==1)//⾼电平5x10点阵,低电平5x8点阵D2_1;else if(F==0)D2_0;E_0;}////////////////////////////////////////////////////////////////////////////////////////void LCD_CGRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;D6_1;E_1;E_0;}//////////////////////////////////////////////////////////////////////////////void LCD_DDRAM_Addr(u8 addr)//{E_0;LCD_RB();RS_0;RW_0;GPIO_Write(GPIOD,0x0000);//清空地址GPIO_Write(GPIOD,addr);E_1;E_0;}//////////////////////////////////////////////////////////////////////////////////void LCD_RB(void)//{GPIO_InitTypeDef pp;RS_0;RW_1;pp.GPIO_Mode=GPIO_Mode_IN_FLOATING;pp.GPIO_Speed=GPIO_Speed_50MHz;pp.GPIO_Pin=GPIO_Pin_7;GPIO_Init(GPIOD,&pp);//将端⼝设为输⼊E_1;while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7));//若忙信号存在,则⼀直循环,直⾄忙信号结束E_0;pp.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; pp.GPIO_Mode=GPIO_Mode_Out_PP;pp.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&pp);//将端⼝重新设为输出}//////////////////////////////////////////////////////////////////////////////////////////void LCD_Write(u8 data)//{LCD_RB();RS_1;RW_0;E_1;GPIO_Write(GPIOD,data);E_0;}////////////////////////////////////////////////////////////////////////////void LCD_Read(void)//{LCD_RB();RS_1;RW_1;E_1;E_0;}////////////////////////////////////////////////////////////////////////////void LCD_WriteStr(u8 *str,int length)//{int i=0;for(i=0;i<length;i++){if(i<=15){LCD_DDRAM_Addr(0x80+i);LCD_Write(str[i]);}else{LCD_DDRAM_Addr(0xc0+i-16);LCD_Write(str[i]);}}}main.c#include "lcd.h"#include "string.h"int main(){u8 strMCU[]=" **** YOU 1602! TEST TEST "; LCD_Init();LCD_Clear();LCD_SetInput(1,0);LCD_Display(1,0,0);LCD_Mode(1,1,0);LCD_WriteStr(strMCU,strlen(strMCU));。
STM3212864显示驱动程序,,寄存器版
头文件#ifndef __12864_H_#define __12864_H_#include"sys.h"//管脚定义,移植修改区//***************************************************************************** *********************************************//#define LCD12864_GPIO GPIOB//#define GPIOCLK RCC_APB2Periph_GPIOB#define RS PBout(0)#define RW PBout(1)#define EN PBout(2)//#define PSB GPIO_Pin_4//#define RST GPIO_Pin_5//#define Busy GPIO_Pin_15//#define LCD_GPIO_DAT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15//#define LCD_GPIO_CMD GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5//#define LCD_RS(x) x ? GPIO_SetBits(LCD12864_GPIO,RS): GPIO_ResetBits(LCD12864_GPIO,RS)//#define LCD_RW(x) x ? GPIO_SetBits(LCD12864_GPIO,RW): GPIO_ResetBits(LCD12864_GPIO,RW)//#define LCD_EN(x) x ? GPIO_SetBits(LCD12864_GPIO,EN): GPIO_ResetBits(LCD12864_GPIO,EN)//#define LCD_PSB(x) x ? GPIO_SetBits(LCD12864_GPIO,PSB): GPIO_ResetBits(LCD12864_GPIO,PSB)//#define LCD_RST(x) x ? GPIO_SetBits(LCD12864_GPIO,RST): GPIO_ResetBits(LCD12864_GPIO,RST)//#define Text_Busy GPIO_ReadInputDataBit(LCD12864_GPIO ,Busy) //PBin(7)#define LCD_WriteData(x) {GPIOC->BSRR = x & 0x00ff;GPIOC->BRR = ((~x)) & 0x00ff;} //高8位的数据//#define LCD_WriteData(x) {LCD12864_GPIO->BSRR = x & 0x00ff;LCD12864_GPIO->BRR = ((~x)<<8) & 0x00ff;} //低8位的数据void LCD12864_Init(void); //硬件端口初始化void LCD12864_InitPort(void); //硬件端口初始化void NOP(void); //延时函数u8 LCD12864_busy(void); //检测忙状态void LCD12684_Wcmd(u8 dat); //写指令void LCD12684_Wdat(u8 dat); //写数据void LCD12864_Init(void); //液晶初始化void LCD12864_Clr(void); // 清屏void LCD12864_Pos(u8 x,u8 y); //设置显示位置void LCD12864_PhotoDis(u8 *bmp); // 显示图片void LCD_ShowString(u8 x,u8 y,const u8 *p); // 显示字符串void LCD_Shownum(u8 x,u8 y,u8 num);void LCD_Shownum1(u8 num);//***************************************************************************** *****************************************#endif//#include "stm32f10x.h"#include"12864.h"#include"delay.h"/****************************************************************************** ******************//FILE:液晶12864驱动程序//VERS:1.0//AUTHOR:福建师范大学林木泉//DATE:2012/07/11******************************************************************************* *****************//****************************************************************************** ******************@f_name: void LCD12864_InitPort(void)@brief: 初始化硬件端口配置@param: None@return: None******************************************************************************* *****************//*void LCD12864_InitPort(void){GPIO_InitTypeDef GPIO_InitStructure; //定义结构体RCC_APB2PeriphClockCmd(GPIOCLK|RCC_APB2Periph_AFIO, ENABLE); //使能功能复用IO时钟,不开启复用时钟不能显示GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); //把调试设置普通IO 口GPIO_InitStructure.GPIO_Pin = LCD_GPIO_DAT; //数据口配置成开漏输出模式,此模式下读输入寄存器的值得到IO口状态GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //IO口初始化函数(使能上述配置)GPIO_InitStructure.GPIO_Pin = LCD_GPIO_CMD;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure);//GPIO_Init(LCD12864_GPIO , &GPIO_InitStructure); //初始化IO口配置GPIO_Write(LCD12864_GPIO ,0xffff);} *//****************************************************************************** *************///数据口:PB8~PB15; 命令口:PB0~PB2void LCD12864_InitPort(void){RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟RCC->APB2ENR|=1<<0; //开启辅助时钟GPIOC->CRL&=0X00000000;GPIOC->CRL|=0X33333333;GPIOB->CRL&=0XFFFFF000;GPIOB->CRL|=0X00000333;GPIOB->ODR|=0XFF07;}C文件/****************************************************************************** ******************@f_name: void NOP(void)@brief: 延时函数@param: None@return: None******************************************************************************* *****************/void NOP(void){ u8 i; for(i=0; i<100; i++); }/****************************************************************************** ******************@f_name: u8 LCD12864_busy(void)@brief: 检测忙状态@param: None@return: None******************************************************************************* *****************///u8 LCD12864_busy(void)//{// u8 x;// RS=0;// RW=1;// EN=1;// NOP();// NOP();// x=Text_Busy;// EN=1;// return x;//}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写指令@param: u8 dat 输入指令@return: None******************************************************************************* *****************/void LCD12684_Wcmd(u8 dat){//while(LCD12864_busy()); //忙检测RS=0;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;NOP();NOP();}/****************************************************************************** ******************@f_name: void LCD12684_Wcmd(u8 dat)@brief: 写数据@param: u8 dat 输入数据@return: None******************************************************************************* *****************/void LCD12684_Wdat(u8 dat){//while(LCD12864_busy()); //忙检测RS=1;RW=0;EN=0;NOP();NOP();LCD_WriteData(dat);NOP();NOP();EN=1;NOP();NOP();EN=0;}/****************************************************************************** ******************@f_name: void LCD12864_Init(void)@brief: 液晶初始化@param: None@return: None******************************************************************************* *****************/void LCD12864_Init(void){//LCD_PSB(1); //并口方式//LCD_RST(0); //液晶复位低电平有效//delay_ms(3);// LCD_RST(1); //置高电平等待复位//delay_ms(3);LCD12864_InitPort();LCD12684_Wcmd(0x34); //扩充指令操作delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x0c); //显示开,关光标delay_ms(5);LCD12684_Wcmd(0x01); //清除LCD的显示内容delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Clr(void)@brief: 清屏@param: None@return: None******************************************************************************* *****************/void LCD12864_Clr(void){LCD12684_Wcmd(0x34); //扩充指令操作“绘图”delay_ms(5);LCD12684_Wcmd(0x30); //基本指令操作delay_ms(5);LCD12684_Wcmd(0x01); //清屏delay_ms(5);}/****************************************************************************** ******************@f_name: void LCD12864_Pos(u8 x,u8 y)@brief: 设置显示位置@param: u8 x:X轴u8 y:Y轴@return: None******************************************************************************* *****************/void LCD12864_Pos(u8 x,u8 y){u8 pos;if (x==0) {x=0x80;}else if (x==1) {x=0x90;}else if (x==2) {x=0x88;}else if (x==3) {x=0x98;}else x=0x80;pos = x+y ;LCD12684_Wcmd(pos); //显示地址}/****************************************************************************** ******************@f_name: void LCD12864_PhotoDis(u8 *bmp)@brief: 显示图形@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD12864_PhotoDis(u8 *bmp){u8 i,j;LCD12684_Wcmd(0x34); //关闭图形显示for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i); //先写入水平坐标值LCD12684_Wcmd(0x80); //写入垂直坐标值for(j=0;j<16;j++) //再写入两个8位元的数据LCD12684_Wdat(*bmp++);delay_ms(1);}for(i=0;i<32;i++){LCD12684_Wcmd(0x80+i);LCD12684_Wcmd(0x88);for(j=0;j<16;j++)LCD12684_Wdat(*bmp++);delay_ms(1);}LCD12684_Wcmd(0x36); //写完数据,开图形显示}/****************************************************************************** ******************@f_name: void LCD_ShowString(u8 x,u8 y,const u8 *p)@brief: 显示字符串@param: u8 *bmp 图形数组@return: None******************************************************************************* *****************/void LCD_ShowString(u8 x,u8 y,const u8 *p){u8 temp;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);temp=*p;while(temp!='\0'){LCD12684_Wdat(temp);temp=*(++p);}}void LCD_Shownum(u8 x,u8 y,u8 num){ u8 number;u8 shi;u8 ge;if(x>3) {x=0;}if(y>7) {y=0;}LCD12864_Pos(x,y);number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}void LCD_Shownum1(u8 num){ u8 number;u8 shi;u8 ge;number=num;shi=number/10+0x30;ge=number%10+0x30;LCD12684_Wdat(shi);LCD12684_Wdat(ge);}。
STM32液晶显示HT1621驱动原理及程序代码
STM32液晶显⽰HT1621驱动原理及程序代码1、HT1621电路分析HT1621为32×4即128点内存映像LCD驱动器,包含内嵌的32×4位显⽰RAM内存和时基发⽣器以及WDT看门狗定时器.HT1621驱动电路如下图所⽰:图1与单⽚机相连接控制的有9脚CS,3脚WR,12脚DATA,其功能描述如下表。
图22、字符显⽰原理液晶管点亮和熄灭原理分别为在对应的RAM地址中写1和写0.⾸先需要清楚所驱动控制的液晶的COM-SEG对应关系,然后需要了解HT1621的32×4RAM地址映射。
例如要控制的液晶的装脚成品图部分如下:图3着重看⼀个液晶数码管,我们了解原理就⾏。
可以看到图3中是第2个液晶数码管,有7段,分别为A,B,C,D,E,F,G。
也就分别为下⾯COM\SEG地址对应关系图中的2A,2B,2C,2D,2E,2F,2G。
液晶的显⽰字符的部分COM公共端输出⼝和SEG段输出⼝的分布如下表所⽰,同理我们可以看到例如:2D对应(SEG5,COM0),2E对应(SEG5,COM1),2F对应(SEG5,COM2),2A对应(SEG5,COM3),2C对应(SEG4,COM1),2G对应(SEG4,COM2),2B对应(SEG4,COM3)。
图4搞清楚我们要控制的对象之后那, HT1621的RAM 地址映射如下图所⽰:图5可以清楚的看到要控制液晶段对应SEG号作为6位地址,COM号对应作为4位数据写⼊,此时注意4位数据的⾼低位。
写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号.例如我们在图3的第⼆个液晶数码管上显⽰数字,⾸先我们根据图3得到地址映射关系,先写⼊地址SEG4中的四位数据(COM3,COM2,COM1,COM0),再写如地址SEG5中的四位数据(COM3,COM2,COM1,COM0),对应关系如下:SEG4SEG5COM3COM2COM1COM0COM3COM2COM1COM02B2G2C T102A2F2E2D所以如果在图3中显⽰“5”,则在显⽰的液晶段对应地址上写1,不显⽰写0,如下图所⽰。
STM32串行驱动12864液晶
自己参考大神们的程序改写的液晶驱动,希望对有需要的人能有帮助#include "stm32f10x.h"static __IO uint32_t TimingDelay;void RCC_Configuration(void);void Delay(__IO uint32_t nTime);#define Line1 0x80//液晶第一行#define Line2 0x90//液晶第二行#define Line3 0x88//液晶第三行#define Line4 0x98//液晶第四行#define LCD_IO GPIOE //我用的是E.2 E.3 E.4 E.5 E.6#define CS GPIO_Pin_2#define RW GPIO_Pin_3#define CLK GPIO_Pin_4#define PSB GPIO_Pin_5#define RST GPIO_Pin_6#define SET(n) GPIO_SetBits(GPIOE,n) //将对应管脚输出高电平#define RESET(n) GPIO_ResetBits(GPIOE,n)//输出低电平#define CMD (uint32_t)0xf8000000 //串行写入的是命令要先写入0xf8 #define DATE (uint32_t)0xfa000000 // 串行写入数据要先写入0xfavoid LCD_IOinit_OUT() //推挽输出模式,管脚配置,不多解释,库函数有{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin =CS|RW|CLK|PSB|RST;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LCD_IO, &GPIO_InitStructure);}void LCD_Write(uint32_t cmd,uint8_t ddata)//LCD 写函数{uint32_t temp=cmd;uint32_t i;RESET(CS); //片选拉低temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);SET(CS); //片选拉高,开始传输数据for(i=0;i<24;i++){if(temp&0x80000000)SET(RW); //取出最高位,如果是1,那么RW就写1else RESET(RW); //如果是0 RW就写0SET(CLK);//向液晶写数据是在下降沿写入的Delay(2);//稍作延时RESET(CLK);//拉低产生下降沿,写入数据temp=temp<<1;//左移一位,写入下一位}RESET(CS); //拉低片选,写入数据完毕}void Display(uint8_t addr,uint8_t *hz){LCD_Write(CMD,addr);Delay(3);while(*hz!='\0'){LCD_Write(DA TE,*hz);hz++;Delay(3);}}void LCD_init()//液晶初始化{RESET(CS); //拉低片选RESET(PSB);//PSB拉低,表示是串行,拉高则是并行RESET(RST);//拉低RSTDelay(100);SET(RST);Delay(40);LCD_Write(CMD,0x30);//8位数据传输Delay(40);LCD_Write(CMD,0x0c);//显示开,游标开Delay(40);LCD_Write(CMD,0x01);//清屏Delay(40);LCD_Write(CMD,0x06);//进入点设定AC+1Delay(40);}int main(){RCC_Configuration();SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次LCD_IOinit_OUT();LCD_init();while(1){Display(Line1,"你妹");Display(Line2,"你妹");Display(Line3,"你妹妹");Display(Line4,"完事了,哈哈哈哈哈");}}void RCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);}void Delay(__IO uint32_t nTime){TimingDelay = nTime;while(TimingDelay != 0);}void TimingDelay_Decrement(void){if (TimingDelay != 0x00){TimingDelay--;}}/*temp|=((uint32_t)(ddata&(uint8_t)0xf0)<<16)+((uint32_t)(ddata&(uint8_t)0x0f)<<12);重点解释一下这里,从串行时序图中可以看出,发送一个指令需要三个字节,第一个是0xf8或者0xfa这个根据你要发送的是命令还是数据而定,然后发送下一个数据的高四位和第四位,但是数据都是在高四位上面,用51的话我们要分三次发送,但是32的话一个字节可以是32位的/所以我们一次就能完成,这也是为什么下面的i<24的原因因为最后的8位没有用,例如:我们发送指令0x35,则应该是这样0xf8然后0x30然后0x50,这个应该很好理解所以看一下上面的语句首先我们cmd的值应该为0xf8000000,这个宏定义有的,这是发送命令然后我们让cmd=temp;在把temp和后面的计算结果做按位或运算.首先看这个(uint32_t)(ddata&(uint8_t)0xf0)<<16)我们的ddtate是0x35他和0xf0按位与之后/变为0x30然后左移16位变成0x30 0000;再强制转换为32位,就把高位补零变为0x00 30 0000再看这句话(uint32_t)(ddata&(uint8_t)0x0f)<<12)我们的ddtate是0x35他和0x0f按位与/之后变为0x05,左移12位0x05 000 强制转换为32位高位补零0x000 05 000 /在和前面的相加就是0x00 30 0000+0x000 05 000=0x0030 5000然后在和前面的0xf8000000按位或变为0xf830 5000 液晶读这个数据的时候是八位八位的读取所以在液晶看来是分四次的0xf8 0x30 0x50 0x00显然后八位没用所以我们只取前面的24位//应该能看懂了把结合时序图还有延时一定要精确大家有看不懂的可以给我留言*/。
基于STM32F103VB下12864LCD驱动
初学STM32,写一个简单的128*64LCD驱动程序/**************************************************************************** 【功能说明】I/O端口功能、方向设定****************************************************************************/ voidLCD_Port_OutConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置所用管脚为推免输出,端口速度为50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|\GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|\GPIO_Pin_13|GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LCD, &GPIO_InitStructure);}voidLCD_Port_InConfig(void){GPIO_InitTypeDef GPIO_InitStructure;/* 配置所用管脚为推免输出,端口速度为50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|\GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIO_LCD, &GPIO_InitStructure);}/**************************************************************************** 【功能说明】LCD 写字节函数入口参数data:" 命令/数据标志(data:写显示数据)****************************************************************************/LCD_WriteData(u16 data){u16 ReadValue;LCD_Port_InConfig();do{LCD_I();LCD_R();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_7));LCD_Port_OutConfig();LCD_D();LCD_W();ReadValue = GPIO_ReadOutputData(GPIO_LCD);data=0xff00&ReadValue|data;GPIO_Write(GPIO_LCD,data);ReadValue = GPIO_ReadOutputData(GPIO_LCD);GPIO_Write(GPIO_LCD,ReadValue);LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}/**************************************************************************** 【功能说明】LCD 写指令函数入口参数inst="cmd" 命令(cmd:写控制指令)****************************************************************************/ voidLCD_WriteCmd(u16 cmd){u16 ReadValue;LCD_Port_InConfig();doLCD_I();LCD_R();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}while(GPIO_ReadInputDataBit(GPIO_LCD,GPIO_Pin_7));//读忙标志LCD_Port_OutConfig();LCD_I();LCD_W();ReadValue = GPIO_ReadOutputData(GPIO_LCD);cmd=0xff00&ReadValue|cmd;GPIO_Write(GPIO_LCD,cmd);ReadValue = GPIO_ReadOutputData(GPIO_LCD);GPIO_Write(GPIO_LCD,ReadValue);LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);}/************************************************************************** 【功能说明】读Lcd 显示数据**************************************************************************/ u16LCD_ReadData(void){u16 ReadValue;LCD_Port_InConfig();LCD_E_1();Delay_us(dly);LCD_E_0();Delay_us(dly);LCD_E_1();LCD_D();LCD_R();ReadValue = GPIO_ReadInputData(GPIO_LCD);ReadValue = ReadValue&0x00ff;return ReadValue;}/*****************************************************************************清屏*********************************************************************/voidLCD_Clear(void){u8 i,k;LCD_CS1_H();LCD_CS2_H();for(i=0;i<8;i++){LCD_WriteCmd(0xb8+i);LCD_WriteCmd(0xc0);for(k=0;k<64;k++){LCD_WriteCmd(0x40+k);LCD_WriteData(0x00);LCD_WriteCmd(0x3f);}}}/**************************************************************************** 【功能说明】复位LCD子程序****************************************************************************/ voidLCD_Rest(void){LCD_RET_0();Delay_ms(20);LCD_RET_1();}/*--------------写屏点阵------------------*/voidlat_disp (u8 data1,u8 data2){u8 i,j;LCD_CS1_H();LCD_CS2_H();for(j=0;j<8;j++){LCD_WriteCmd(0xb8+j);LCD_WriteCmd(0xc0);LCD_WriteCmd(0x40);for(i=0;i<32;i++){LCD_WriteData(data1);LCD_WriteCmd(0x3f);LCD_WriteData(data2);LCD_WriteCmd(0x3f);//Delay_us(4);}}}/*******************************************************x:显示字体高度(1~8)y:字显示在第y列(点阵16*16,0~3,8*8,0~7)****x1:显示第x1个字y1:字体宽度,宽为y1的点阵row_x显示字体起始行0~7 ****row_y:显示字体高度定义一个字为y1*row_y的点阵***************************************************/voidLCD_disp(u8 x,u8 y,u8 x1,u8 row_x,u8 y1,u8 row_y,u8 *data){u8 i,j;for(j=0;j<x;j++){LCD_WriteCmd(0xb8+j+row_x);LCD_WriteCmd(0xc0);LCD_WriteCmd(0x40+y*y1);for(i=0;i<y1;i++){LCD_WriteData(data[i+(x1*row_y+j)*y1]);//Delay_us(4);LCD_WriteCmd(0x3f);}}}。
基于STM32驱动IIC0.96寸OLED屏底层驱动+菜单程序源码
基于STM32驱动IIC0.96寸OLED屏底层驱动+菜单程序源码本文针对IIC OLED屏底层驱动相关代码16X32,32X32,128X48等下面附带相关实物图内置简单的菜单程序,下面附带实物图相关资料已经上传stm32单片机OLED菜单源程序如下:1.#define OLED_IIC_SCL PBout(4) //SCL 串行时钟2.#define OLED_IIC_SDA PBout(3) //SDA 串行数据3.4.}5.void OLED_P16x32Ch(unsigned char x,unsigned char y,unsigned int N)6.{7.unsigned char wm=0;8.unsigned int adder=64*N;9.OLED_Set_Pos(x , y);10.for(wm = 0;wm < 16;wm++)11.{12.OLED_WrDat(F16x32[adder]);13.adder += 1;14.}15.OLED_Set_Pos(x,y+1 );16.for(wm = 0;wm <16;wm++)17.{18.OLED_WrDat(F16x32[adder]);19.adder += 1;20.}21.OLED_Set_Pos(x , y+2);22.for(wm = 0;wm < 16;wm++)23.{24.OLED_WrDat(F16x32[adder]);25.adder += 1;26.}27.OLED_Set_Pos(x,y+3 );28.for(wm = 0;wm <16;wm++)29.{30.OLED_WrDat(F16x32[adder]);31.adder += 1;32.}34.void OLED_P32x32Ch(unsigned char x,unsigned char y,unsigned int N)35.{36.unsigned char wm=0;37.unsigned int adder=128*N;38.OLED_Set_Pos(x , y);39.for(wm = 0;wm < 32;wm++)40.{41.OLED_WrDat(F32x32[adder]);42.adder += 1;43.}44.OLED_Set_Pos(x,y+1 );45.for(wm = 0;wm <32;wm++)46.{47.OLED_WrDat(F32x32[adder]);48.adder += 1;49.}50.OLED_Set_Pos(x , y+2);51.for(wm = 0;wm < 32;wm++)52.{53.OLED_WrDat(F32x32[adder]);54.adder += 1;55.}56.OLED_Set_Pos(x,y+3 );57.for(wm = 0;wm <32;wm++)58.{59.OLED_WrDat(F32x32[adder]);60.adder += 1;61.}63.void OLED_P128x48Ch(unsigned char x,unsigned char y,unsigned int N)64.{65.unsigned char wm=0;66.unsigned int adder=768*N;67.OLED_Set_Pos(x , y);68.for(wm = 0;wm < 128;wm++)69.{70.OLED_WrDat(F128x48[adder]);71.adder += 1;72.}73.OLED_Set_Pos(x,y+1);74.for(wm = 0;wm <128;wm++)75.{76.OLED_WrDat(F128x48[adder]);77.adder += 1;78.}79.OLED_Set_Pos(x , y+2);80.for(wm = 0;wm < 128;wm++)81.{82.OLED_WrDat(F128x48[adder]);83.adder += 1;84.}85.OLED_Set_Pos(x,y+3 );86.for(wm = 0;wm <128;wm++)87.{88.OLED_WrDat(F128x48[adder]);89.adder += 1;90.}91.OLED_Set_Pos(x,y+4 );92.for(wm = 0;wm <128;wm++)93.{94.OLED_WrDat(F128x48[adder]);95.adder += 1;96.}97.OLED_Set_Pos(x,y+5 );98.for(wm = 0;wm <128;wm++)99.{100.OLED_WrDat(F128x48[adder]);101.adder += 1;102.}103.}104.105.106.107.// IIC协议 OLED屏人机界面108.void lnterface(void) //人机界面109.{110.111.Status_Bar();112.switch(Page_Sgin)113.{114.case 0:115.Main_Menu(); break;116.case 2:117.Menu_2(); break;118.case 3:119.Menu_3();break;120.121.122.default : break;123.}124.125.}126.127.128.//主菜单129.void Main_Menu(void)130.{131.WhenTheDisplay(); //显示时分秒132.DayAndDayDisplay(); //显示年月日133.OLED_P16x16Ch(0*16,6,11); //显示 //菜134.OLED_P16x16Ch(1*16,6,12); //显示 //单135.OLED_P16x16Ch(6*16,6,13); //显示 //退136.OLED_P16x16Ch(7*16,6,14); //显示 //出137.if(KEY_Scan(Key_Selectio)==Determine_Choice)//判断是否按下确定按键138.{139.Page_Sgin=2; //页面选择置2140.OLED_P128x48Ch(0,2,0); //清除内容栏141.}142.}143.144.void Menu_2(void)145.{146.if(Choice==2||Choice==4||Choice==6)147.{148.149.OLED_P16x16Ch(0*16,Choice,44); //选择150.Display(2,0,0);151.152.153.switch(KEY_Scan(Key_Selectio))154.{155.case Superior_Choice: //上翻156.OLED_P16x16Ch(0*16,Choice,37);157.Choice-=2;158.break;159.case Subordinate_Choice: //下翻160.OLED_P16x16Ch(0*16,Choice,37);161.Choice+=2;162.break;163.case Determine_Choice: //确定164.OLED_P128x48Ch(0,2,0); //清除内容栏165.Page_Sgin=3;Choice=2;166.break;167.case Return_Choice: //返回168.OLED_P128x48Ch(0,2,0);169.Page_Sgin=0;170.break;171.default :172.break;173.}174.175.}176.else if(Choice>6)Choice=2;177.else if(Choice<2)Choice=6;178.179.OLED_ShowNum(6*16,6,Choice/2,1,12);180.OLED_P6x8Str(6.5*16,7,"/");181.OLED_P6x8Str(7*16,7,"10");182.}183.void Menu_3(void)184.{185.if(Choice==2||Choice==4||Choice==6) 186.{187.OLED_P16x16Ch(0*16,Choice,44); //选择188.Display(2,0,0);189.190.switch(KEY_Scan(Key_Selectio))191.{192.case Superior_Choice: //上翻193.OLED_P16x16Ch(0*16,Choice,37);194.Choice-=2;195.break;196.case Subordinate_Choice: //下翻197.OLED_P16x16Ch(0*16,Choice,37);198.Choice+=2;199.break;200.case Determine_Choice: //确定201.OLED_P128x48Ch(0,2,0); //清除内容栏202.Page_Sgin=3;Choice=2;203.break;204.case Return_Choice: //返回205.OLED_P128x48Ch(0,2,0);206.Page_Sgin=2;Choice=2;207.break;208.default :209.break;210.}211.212.}213.else if(Choice>6)Choice=2;214.else if(Choice<2)Choice=6;215.216.OLED_ShowNum(6*16,6,Choice/2,1,12); 217.OLED_P6x8Str(6.5*16,7,"/");218.OLED_P6x8Str(7*16,7,"10"); 219.}。
基于STM32的LCD驱动程序设计与实现
基于STM32的LCD驱动程序设计摘要:本文主要是对TFT-LCD(薄膜晶体管液晶显示器)进行相关的驱动程序设计,不同于以往常规的点阵屏和最原始的黑白显示屏,它的优点在于显示出的图像更亮、色彩更加艳丽、成像速度更快。
相当符合当前我们的主流产品,例如现在的各种电子产品,特别是汽车行业更是使用广泛。
近些年在不断更新电子技术的同时我们本身的基础技术也是一天一天的变化。
因为我们对现在的电子产品要求变高,使得对LCD显示成像的要求就变高,再加上我们对嵌入式工程的进一步推进。
因此,对于将嵌入式系统移植到所需要的驱动模块上去也就成为主流,正因为于此,对LCD 的驱动设计是很有意义和价值的。
关键词:TFT-LCD;显示;彩色界面Abstract:This paper is mainly about the design of TFT-LCD (thin film transistor liquid crystal display),which is different from the conventional dot matrix screen and the most original black and white display screen. Its advantages are that the image is brighter,the color is brighter,and the speed of the imaging is faster. It is quite consistent with our current mainstream products,for example,various electronic products,especially the automotive industry,are widely used.In recent years, while constantly updating the electronic technology, our basic technology is also changing day by day. Because our requirements for current electronic products are higher, the requirement for LCD display imaging becomes higher, and our embedded engineering is further pushed forward. Therefore, it is also the mainstream for the embedded system to be transplanted to the required driver modules. Because of this, the driver design of LCD is of great significance and value.Key words:TFT-LCD;Display;Color shape interface目录摘要 ................................................................................................................................... I Abstract ...................................................................................................................................... I 目录 .................................................................................................................................. II 1 绪论 . (1)1.1 研究背景 (1)1.2 选题目的 (1)1.3 研究内容 (1)2 开发环境与技术 (2)2.1 开发环境 (2)2.1.1 MDK软件安装 (2)2.1.2 USB串口驱动安装 (2)2.2 开发技术 (2)2.2.1 C语言 (3)2.2.2 ILI9341 液晶控制器 (3)2.2.3 ILI9341指令 (4)3 TFT-LCD简介 (8)3.1 TFT-LCD特点 (8)3.2 外观图如下 (9)3.3 原理图如下 (9)3.4 接口定义图如下 (9)3.5 TFT-LCD 模块的使用流程如图如下 (10)4 系统设计 (11)4.1 硬件设计 (11)4.2 软件设计 (12)4.2.1 关键结构体 (12)4.2.2 ILI9341.c 里面的一些重要函数 (13)4.2.3 lcd.h 文件相关配置 (24)4.2.4 main()主函数代码 (25)5 系统功能实现及测试 (27)5.1 测试目的 (27)5.2 测试过程 (27)5.3 测试结果 (28)总结 (30)参考文献 ................................................................................................... 错误!未定义书签。
0.96寸OLED显示屏STM32F103C8T6IIC驱动程序
0.96⼨OLED显⽰屏STM32F103C8T6IIC驱动程序0.96⼨OLED显⽰屏的IIC驱动程序有很多现成的⽰例,但⼤部分编程风格实在是让程序阅读起来很困难,所以本伽椰⼦重新梳理了⼀下驱动程序,使得其更⽅便阅读,具体代码内容如下:1、滴答时钟DRIVE_SYSTICK.h1 #ifndef _DRIVE_SYSTICK_H_2#define _DRIVE_SYSTICK_H_3 #include "stm32f10x.h"45void LibDriveSystickInit(void);6void LibDriveSystickDelay_us(uint32_t Dus);7void LibDriveSystickDelay_ms(uint32_t Dms);8#endifDRIVE_SYSTICK.c1 #include "DRIVE_SYSTICK.h"234/*************************************************5函数名称 : LibDriveSystickInit6功能描述 : 滴答时钟初始化7被调⽤清单 : ⽆8调⽤清单 :9输⼊参数 : ⽆10输出参数 : ⽆11返回参数 : ⽆12其他 : ⽆13*************************************************/14void LibDriveSystickInit(void)15 {16 SysTick->LOAD = 1000;17 SysTick->VAL = 0;18 SysTick->CTRL = 0;19 }2021/*************************************************22函数名称 : LibDriveSystickDelay_us23功能描述 : 滴答时钟微妙级延时24被调⽤清单 : ⽆25调⽤清单 :26输⼊参数 : dus待延时微妙数27输出参数 : ⽆28返回参数 : ⽆29其他 : ⽆30*************************************************/31void LibDriveSystickDelay_us(uint32_t Dus)32 {33if((Dus == 0) || (Dus > 700000))34 {35return;36 }37 SysTick->LOAD = Dus*22-1;38 SysTick->VAL = 0;39 SysTick->CTRL |= 1;4041while((SysTick->CTRL & (1<<16)) == 0);42 SysTick->CTRL = 0;43 }4445/*************************************************46函数名称 : LibDriveSystickDelay_ms47功能描述 :滴答时钟毫秒级延时48被调⽤清单 : ⽆49调⽤清单 :50输⼊参数 : dms待延时毫秒数51输出参数 : ⽆52返回参数 : ⽆53其他 : ⽆54*************************************************/55void LibDriveSystickDelay_ms(uint32_t Dms)56 {57while(Dms >= 700)58 {59 LibDriveSystickDelay_us(700000);60 Dms -= 700;61 }62if(Dms < 700)63 {64 LibDriveSystickDelay_us(Dms*1000);65 }66 }APP_SYSTICK.h1 #ifndef _APP_SYSTICK_H_2#define _APP_SYSTICK_H_3 #include "DRIVE_SYSTICK.h"45void FunAppSystickInit(void);67#endifAPP_SYSTICK.c1 #include "APP_SYSTICK.h"23/*************************************************4函数名称 : FunAppOledDisplayTurn5功能描述 : 屏幕旋转180°6被调⽤清单 : ⽆7调⽤清单 :8输⼊参数 : Mode == 0正常显⽰ Mode == 1反转显⽰9输出参数 : ⽆10返回参数 : ⽆11其他 : ⽆12*************************************************/13void FunAppSystickInit(void)14 {15 LibDriveSystickInit();16 }2、IIC通讯驱动程序DRIVE_I2C2.h1 #ifndef _DRIVE_I2C2_H_2#define _DRIVE_I2C2_H_3 #include "stm32f10x.h"4 #include "DRIVE_SYSTICK.h"56#define SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_11)7#define SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_11)8#define SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_10)9#define SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_10)10#define SDA_IN GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)1112void LibDriveI2c2Init(void);13void LibDriveI2c2Start(void);14void LibDriveI2c2Stop(void);15void LibDriveI2c2SendAck(uint8_t Ack);16void LibDriveI2c2WriteByte(uint8_t Data);17 uint8_t LibDriveI2c2Read(void);18 uint8_t LibDriveI2c2CheckAck(void);1920#endifDRIVE_I2C2.c1 #include "DRIVE_I2C2.h"23/*************************************************4函数名称 : LibDriveI2c2Init5功能描述 : I2C2初始化6被调⽤清单 : ⽆7调⽤清单 :8输⼊参数 : ⽆9输出参数 : ⽆10返回参数 : ⽆11其他 : ⽆12*************************************************/13void LibDriveI2c2Init(void)14 {15 GPIO_InitTypeDef GPIO_InitStruct;16 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 1718 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;19 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;20 GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;21 GPIO_Init(GPIOB, &GPIO_InitStruct);22 }2324/*************************************************25函数名称 : LibDriveI2c2Start26功能描述 : I2C2开始信号27被调⽤清单 : ⽆28调⽤清单 :29输⼊参数 : ⽆30输出参数 : ⽆31返回参数 : ⽆32其他 : ⽆33*************************************************/34void LibDriveI2c2Start(void)35 {36 SCL_L;37 SDA_H;3839 SCL_H;40 LibDriveSystickDelay_us(5);41 SDA_L;42 LibDriveSystickDelay_us(5);43 SCL_L;44 }4546/*************************************************47函数名称 : LibDriveI2c2Stop48功能描述 : I2C2停⽌信号49被调⽤清单 : ⽆50调⽤清单 :51输⼊参数 : ⽆52输出参数 : ⽆53返回参数 : ⽆54其他 : ⽆55*************************************************/56void LibDriveI2c2Stop(void)57 {58 SCL_L;59 SDA_L;6061 SCL_H;62 LibDriveSystickDelay_us(5);63 SDA_H;64 LibDriveSystickDelay_us(5);65 }6667/*************************************************68函数名称 : LibDriveI2c2SendAck69功能描述 : I2C2发送回复70被调⽤清单 : ⽆71调⽤清单 :72输⼊参数 : Ack 回复状态73输出参数 : ⽆74返回参数 : ⽆75其他 : ⽆76*************************************************/77void LibDriveI2c2SendAck(uint8_t Ack)78 {79if (Ack) //不应答80 {81 SCL_L;82 LibDriveSystickDelay_us(5);83 SDA_H;84 LibDriveSystickDelay_us(1);85 SCL_H;86 LibDriveSystickDelay_us(5);87 }88else if (Ack == 0) //应答89 {90 SCL_L;91 LibDriveSystickDelay_us(5);92 SDA_L;93 LibDriveSystickDelay_us(1);94 SCL_H;95 LibDriveSystickDelay_us(5);96 }97 SCL_L;98 }99100/*************************************************101函数名称 : LibDriveI2c2WriteByte102功能描述 : I2C2写⼀个字节103被调⽤清单 : ⽆104调⽤清单 :105输⼊参数 : Data 待发送数据106输出参数 : ⽆107返回参数 : ⽆108其他 : ⽆109*************************************************/110void LibDriveI2c2WriteByte(uint8_t Data)111 {112 uint8_t localIte = 0;113for (localIte = 0; localIte < 8; localIte++)114 {115 SCL_L; //可以改变数据线116 LibDriveSystickDelay_us(5);117if (Data & 0x80)118 {119 SDA_H;120 }121else122 {123 SDA_L;124 }125 LibDriveSystickDelay_us(1);126 SCL_H; //从机时钟线拉⾼从机才可以读此位数据127 LibDriveSystickDelay_us(5);128 Data = Data << 1;129 }130 SCL_L; //安全131 }132133/*************************************************134函数名称 : LibDriveI2c2Read135功能描述 : I2C2读取数据136被调⽤清单 : ⽆137调⽤清单 :138输⼊参数 : ⽆139输出参数 : ⽆140返回参数 : 所读取到的数据(⼀个字节)141其他 : ⽆142*************************************************/143 uint8_t LibDriveI2c2Read(void)144 {145 uint8_t localData = 0;146 uint8_t localIte = 0;147148/*把数线的模式改为输⼊模式*/149 SCL_L; //可以改变数据线150 SDA_H; //输⼊模式151152/*接收⼋位数据*/153for (localIte = 0; localIte < 8; localIte++)154 {155 SCL_L; //拉低时钟线,从机发送⼀个位数据156 LibDriveSystickDelay_us(5);157 SCL_H; //主机读158 LibDriveSystickDelay_us(5);159 localData = localData << 1;160if (SDA_IN)161 {162 localData = localData | 0x01;163 }164 }165 SCL_L; //安全166return localData;167 }168169/*************************************************170函数名称 : LibDriveI2c2CheckAck171功能描述 : I2C2检查回复状态172被调⽤清单 : ⽆173调⽤清单 :174输⼊参数 : ⽆175输出参数 : ⽆176返回参数 : 应答返回1 ⽆应答放回0177其他 : ⽆178*************************************************/179 uint8_t LibDriveI2c2CheckAck(void)180 {181 uint8_t Ack = 0;182/*将数据线的模式改变为输⼊模式*/183 SCL_L;184 SDA_H;185/*检测应答位信号*/186 SCL_L; //从机可以发送应答信号/不应答信号187 LibDriveSystickDelay_us(5);188189 SCL_H; //主机可以读应答信号190 LibDriveSystickDelay_us(5);191if (SDA_IN) //应答192 {193 Ack = 1;194 }195 SCL_L; //安全196return Ack;197 }3、OLED驱动程序APP_OLED.h1 #ifndef _APP_OLED_H_2#define _APP_OLED_H_3 #include "DRIVE_I2C2.h"4 #include <stdlib.h>56#define OLED_CMD 0//写命令7#define OLED_DATA 1//写数据89void FunAppOledInit(void);10void FunAppOledWriteByte(uint8_t Data, uint8_t Mode);11void FunAppOledDisPlayOn(void);12void FunAppOledDisPlayOff(void);13void FunAppOledClear(void);14void FunAppOledRefresh(void);15void FunAppOledDrawPoint(uint8_t X, uint8_t Y);16void FunAppOledClearPoint(uint8_t X, uint8_t Y);17void FunAppOledDrawLine(uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2);18void FunAppOledDrawCircle(uint8_t X, uint8_t Y, uint8_t R);19void FunAppOledShowChar(uint8_t X, uint8_t Y, uint8_t Chr, uint8_t Size); 20void FunAppOledShowString(uint8_t X, uint8_t Y, uint8_t * Chr, uint8_t Size);21void FunAppOledShowNum(uint8_t X, uint8_t Y, uint32_t Num, uint8_t Len, uint8_t Size);22void FunAppOledShowChinese(uint8_t X, uint8_t Y, uint8_t Num, uint8_t Size);23void FunAppOledScrollDisplay(uint8_t Num, uint8_t Space);24void FunAppOledWriteBP(uint8_t X, uint8_t Y);25void FunAppOledShowPicture(uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2, uint8_t *Bmp);26void FunAppOledColorTurn(uint8_t Mode);27void FunAppOledDisplayTurn(uint8_t Mode);28 uint32_t FunAppOledPow(uint8_t Num, uint8_t Index);29#endifAPP_OLED.c1 #include "APP_OLED.h"2 #include "OLED_FONT.h"34static uint8_t OLED_GRAM[144][8];56/*************************************************7函数名称 : FunAppOledInit8功能描述 : OLED初始化9被调⽤清单 : ⽆10调⽤清单 :11输⼊参数 : ⽆12输出参数 : ⽆13返回参数 : ⽆14其他 : ⽆15*************************************************/16void FunAppOledInit(void)17 {18 LibDriveI2c2Init();19 LibDriveSystickDelay_ms(100);20 FunAppOledWriteByte(0xAE,OLED_CMD);//--turn off oled panel21 FunAppOledWriteByte(0x00,OLED_CMD);//---set low column address22 FunAppOledWriteByte(0x10,OLED_CMD);//---set high column address23 FunAppOledWriteByte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)24 FunAppOledWriteByte(0x81,OLED_CMD);//--set contrast control register25 FunAppOledWriteByte(0xCF,OLED_CMD);// Set SEG Output Current Brightness26 FunAppOledWriteByte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常27 FunAppOledWriteByte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常28 FunAppOledWriteByte(0xA6,OLED_CMD);//--set normal display29 FunAppOledWriteByte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)30 FunAppOledWriteByte(0x3f,OLED_CMD);//--1/64 duty31 FunAppOledWriteByte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)32 FunAppOledWriteByte(0x00,OLED_CMD);//-not offset33 FunAppOledWriteByte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency34 FunAppOledWriteByte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec35 FunAppOledWriteByte(0xD9,OLED_CMD);//--set pre-charge period36 FunAppOledWriteByte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock37 FunAppOledWriteByte(0xDA,OLED_CMD);//--set com pins hardware configuration38 FunAppOledWriteByte(0x12,OLED_CMD);39 FunAppOledWriteByte(0xDB,OLED_CMD);//--set vcomh40 FunAppOledWriteByte(0x40,OLED_CMD);//Set VCOM Deselect Level41 FunAppOledWriteByte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)42 FunAppOledWriteByte(0x02,OLED_CMD);//43 FunAppOledWriteByte(0x8D,OLED_CMD);//--set Charge Pump enable/disable44 FunAppOledWriteByte(0x14,OLED_CMD);//--set(0x10) disable45 FunAppOledWriteByte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)46 FunAppOledWriteByte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)47 FunAppOledWriteByte(0xAF,OLED_CMD);48 FunAppOledClear();49 }5051/*************************************************52函数名称 : FunAppOledWriteByte53功能描述 : OLED写⼊⼀字节54被调⽤清单 : ⽆55调⽤清单 :56输⼊参数 : Data待写⼊数据,Mode数据写⼊模式,为0为写指令为1为写数据57输出参数 : ⽆58返回参数 : ⽆59其他 : ⽆60*************************************************/61void FunAppOledWriteByte(uint8_t Data, uint8_t Mode)62 {63 uint8_t localAck = 0;64 LibDriveI2c2Start();65 LibDriveI2c2WriteByte(0x78);66 localAck = LibDriveI2c2CheckAck();67if(localAck)68 {69 LibDriveI2c2Stop();70 }71if(Mode)72 {73 LibDriveI2c2WriteByte(0x40);74 }75else76 {77 LibDriveI2c2WriteByte(0x00);78 }7980 localAck = LibDriveI2c2CheckAck();81if(localAck)82 {83 LibDriveI2c2Stop();84 }85 LibDriveI2c2WriteByte(Data);8687 localAck = LibDriveI2c2CheckAck();88if(localAck)89 {90 LibDriveI2c2Stop();91 }92 LibDriveI2c2Stop();93 }9495/*************************************************96函数名称 : FunAppOledDisPlayOn97功能描述 : 开启OLED显⽰98被调⽤清单 : ⽆99调⽤清单 :100输⼊参数 : ⽆101输出参数 : ⽆102返回参数 : ⽆103其他 : ⽆104*************************************************/105void FunAppOledDisPlayOn(void)106 {107 FunAppOledWriteByte(0x8D, OLED_CMD);//电荷泵使能108 FunAppOledWriteByte(0x14, OLED_CMD);//开启电荷泵109 FunAppOledWriteByte(0xAE, OLED_CMD);//点亮屏幕110 }111112/*************************************************113函数名称 : FunAppOledDisPlayOn114功能描述 : 关闭OLED显⽰115被调⽤清单 : ⽆116调⽤清单 :117输⼊参数 : ⽆118输出参数 : ⽆119返回参数 : ⽆120其他 : ⽆121*************************************************/122void FunAppOledDisPlayOff(void)123 {124 FunAppOledWriteByte(0x8D, OLED_CMD);//电荷泵使能125 FunAppOledWriteByte(0x10, OLED_CMD);//关闭电荷泵126 FunAppOledWriteByte(0xAF, OLED_CMD);//关闭屏幕127 }128129/*************************************************130函数名称 : FunAppOledRefresh131功能描述 : 更新显⽰132被调⽤清单 : ⽆133调⽤清单 :134输⼊参数 : ⽆135输出参数 : ⽆136返回参数 : ⽆137其他 : ⽆138*************************************************/139void FunAppOledRefresh(void)140 {141 uint8_t localIte = 0;142 uint8_t localNum = 0;143144for (localIte = 0; localIte < 8; localIte++)145 {146 FunAppOledWriteByte(0xB0 + localIte, OLED_CMD);147 FunAppOledWriteByte(0x00 , OLED_CMD);148 FunAppOledWriteByte(0x10 , OLED_CMD);149for (localNum = 0; localNum < 128; localNum++)150 {151 FunAppOledWriteByte(OLED_GRAM[localNum][localIte], OLED_DATA); 152 }153 }154 }155156/*************************************************157函数名称 : FunAppOledClear158功能描述 : 清屏159被调⽤清单 : ⽆160调⽤清单 :161输⼊参数 : ⽆162输出参数 : ⽆163返回参数 : ⽆164其他 : ⽆165*************************************************/166void FunAppOledClear(void)167 {168 uint8_t localIte = 0;169 uint8_t localNum = 0;170171for (localIte = 0; localIte < 8; localIte++)172 {173for (localNum = 0; localNum < 128; localNum++)174 {175 OLED_GRAM[localNum][localIte] = 0;176 }177 }178 FunAppOledRefresh();179 }180181/*************************************************182函数名称 : FunAppOledDrawPoint183功能描述 : 画点184被调⽤清单 : ⽆185调⽤清单 :186输⼊参数 : X(0 ~ 127) , Y(0 ~ 63)187输出参数 : ⽆188返回参数 : ⽆189其他 : ⽆190*************************************************/191void FunAppOledDrawPoint(uint8_t X, uint8_t Y)192 {193 uint8_t localI = 0;194 uint8_t localM = 0;195 uint8_t localN = 0;196197 localI = Y / 8;198 localM = Y % 8;199 localN = 1 << localM;200 OLED_GRAM[X][localI] |= localN;201 }202203/*************************************************204函数名称 : FunAppOledClearPoint205功能描述 : 清除⼀个点206被调⽤清单 : ⽆207调⽤清单 :208输⼊参数 : X(0 ~ 127) , Y(0 ~ 63)209输出参数 : ⽆210返回参数 : ⽆211其他 : ⽆212*************************************************/213void FunAppOledClearPoint(uint8_t X, uint8_t Y)214 {215 uint8_t localI = 0;216 uint8_t localM = 0;217 uint8_t localN = 0;218219 localI = Y / 8;220 localM = Y % 8;221 localN = 1 << localM;222223 OLED_GRAM[X][localI] = ~OLED_GRAM[X][localI];224 OLED_GRAM[X][localI] |= localN;225 OLED_GRAM[X][localI] = ~OLED_GRAM[X][localI];226 }227228/*************************************************229函数名称 : FunAppOledDrawLine230功能描述 : 画线231被调⽤清单 : ⽆232调⽤清单 :233输⼊参数 : X(0 ~ 127) , Y(0 ~ 63) (X1 , Y1)第⼀个点坐标(X2 , Y2)第⼆个点坐标234输出参数 : ⽆235返回参数 : ⽆236其他 : ⽆237*************************************************/238void FunAppOledDrawLine(uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2)239 {240 uint8_t localIte = 0;241 uint8_t localK0 = 0;242 uint8_t localK1 = 0;243 uint8_t localK2 = 0;244245if ((X2 > 128)|| (Y2 > 64) || (X1 > X2) || (Y1 > Y2))246 {247return ;248 }249250if (X1 == X2) //竖线251 {252for (localIte = 0; localIte < (Y2 - Y1); localIte++)253 {254 FunAppOledDrawPoint(X1, (Y1 + localIte));255 }256 }257else if (Y1 == Y2)//横线258 {259for (localIte = 0; localIte < (X2 - X1); localIte++)260 {261 FunAppOledDrawPoint((X1 + localIte), Y1);262 }263 }264else//斜线265 {266 localK0 = Y2 - Y1;267 localK1 = X2 - X1;268 localK2 = (localK0 * 10) / localK1;269for (localIte = 0; localIte < (X2 - X1); localIte++)270 {271 FunAppOledDrawPoint((X1 + localIte), (Y1 + ((localIte * localK2) / 10)));272 }273 }274 }275276/*************************************************277函数名称 : FunAppOledDrawCircle278功能描述 : 画圆279被调⽤清单 : ⽆280调⽤清单 :281输⼊参数 : X(0 ~ 127) , Y(0 ~ 63) (X , Y)圆⼼坐标 R半径282输出参数 : ⽆283返回参数 : ⽆284其他 : ⽆285*************************************************/286void FunAppOledDrawCircle(uint8_t X, uint8_t Y, uint8_t R)287 {288int localA = 0;289int localB = 0;290int localN = 0;291292 localB = R;293while((2 * localB * localB) >= (R * R))294 {295 FunAppOledDrawPoint(X + localA, Y - localB);296 FunAppOledDrawPoint(X - localA, Y - localB);297 FunAppOledDrawPoint(X - localA, Y + localB);298 FunAppOledDrawPoint(X + localA, Y + localB);299300 FunAppOledDrawPoint(X + localB, Y - localA);301 FunAppOledDrawPoint(X - localB, Y - localA);302 FunAppOledDrawPoint(X - localB, Y + localA);303 FunAppOledDrawPoint(X + localB, Y + localA);304305 localA++;306 localN = ((localA * localA) + (localB * localB)) - (R * R);//计算画的点离圆⼼的距离307if (localN > 0 )308 {309 localA--;310 localB--;311 }312 }313 }314315/*************************************************316函数名称 : FunAppOledShowChar317功能描述 : 显⽰⼀个字符318被调⽤清单 : ⽆319调⽤清单 :320输⼊参数 : X(0 ~ 127) , Y(0 ~ 63) (X , Y)起点坐标 Chr待显⽰字符 Size字体⼤⼩321输出参数 : ⽆322返回参数 : ⽆323其他 : ⽆324*************************************************/325void FunAppOledShowChar(uint8_t X, uint8_t Y, uint8_t Chr, uint8_t Size)326 {327 uint8_t localIte = 0;328 uint8_t localIte1 = 0;329 uint8_t localTemp = 0;330 uint8_t localSize = 0;331 uint8_t localChr = 0;332 uint8_t localY = 0;333334 localY = Y;335 localSize = ((Size / 8) + ((Size % 8) ? 1 : 0)) * (Size / 2);//得到字体⼀个字符对应点阵集所占字节数336 localChr = Chr - ''; //计算偏移后的值337for (localIte = 0; localIte < localSize; localIte++)338 {339if (Size == 12)340 {341 localTemp = asc2_1206[localChr][localIte];//调⽤1206字体342 }343else if (Size == 16)344 {345 localTemp = asc2_1608[localChr][localIte];//调⽤1608字体346 }347else if (Size == 24)348 {349 localTemp = asc2_2412[localChr][localIte];//调⽤2412字体350 }351else352 {353return ;354 }355356for (localIte1 = 0; localIte1 < 8; localIte1++)357 {358if (localTemp & 0x80)359 {360 FunAppOledDrawPoint(X, Y);361 }362else363 {364 FunAppOledClearPoint(X, Y);365 }366 localTemp <<= 1;367 Y++;368if ((Y - localY) == Size)369 {370 Y = localY;371 X++;372break;373 }374 }375 }376 }377378/*************************************************379函数名称 : FunAppOledShowString380功能描述 : 显⽰字符串381被调⽤清单 : ⽆382调⽤清单 :383输⼊参数 : X(0 ~ 127) , Y(0 ~ 63) (X , Y)起点坐标 Chr待显⽰字符串 Size字体⼤⼩384输出参数 : ⽆385返回参数 : ⽆386其他 : ⽆387*************************************************/388void FunAppOledShowString(uint8_t X, uint8_t Y, uint8_t * Chr, uint8_t Size)389 {390while((*Chr >= '') && (*Chr <= '~'))//判断是不是⾮法字符391 {392 FunAppOledShowChar(X, Y, *Chr, Size);393 X += Size / 2;394if (X > (128 - Size)) //换⾏395 {396 X = 0;397 Y += 2;398 }399 Chr++;400 }401 }402403/*************************************************404函数名称 : FunAppOledPow405功能描述 : 计算⼀个数据的次⽅406被调⽤清单 : ⽆407调⽤清单 :408输⼊参数 : Num底数,Index指数409输出参数 : ⽆410返回参数 : 计算后的值411其他 : ⽆412*************************************************/413 uint32_t FunAppOledPow(uint8_t Num, uint8_t Index)414 {415 uint32_t localRes = 1;416while(Index--)417 {418 localRes *= Num;419 }420return localRes;421 }422423/*************************************************424函数名称 : FunAppOledShowNum425功能描述 : 显⽰数字426被调⽤清单 : ⽆427调⽤清单 :428输⼊参数 : (X , Y)起点坐标 Len数字的位数 Size字体⼤⼩429输出参数 : ⽆430返回参数 : ⽆431其他 : ⽆432*************************************************/433void FunAppOledShowNum(uint8_t X, uint8_t Y, uint32_t Num, uint8_t Len, uint8_t Size) 434 {435 uint8_t localIte = 0;436 uint8_t localTemp = 0;437438for (localIte = 0; localIte < Len; localIte++)439 {440 localTemp = (Num / FunAppOledPow(10, Len - localIte - 1)) % 10;441if (localTemp == 0)442 {443 FunAppOledShowChar((X + (Size / 2) * localIte), Y, '0', Size);444 }445else446 {447 FunAppOledShowChar((X + (Size / 2) * localIte), Y, (localTemp + '0'), Size); 448 }449 }450 }451452/*************************************************453函数名称 : FunAppOledShowChinese454功能描述 : 显⽰汉字455被调⽤清单 : ⽆456调⽤清单 :457输⼊参数 : (X , Y)起点坐标 Num汉字对应序号 Size字体⼤⼩458输出参数 : ⽆459返回参数 : ⽆460其他 : ⽆461*************************************************/462void FunAppOledShowChinese(uint8_t X, uint8_t Y, uint8_t Num, uint8_t Size)463 {464 uint8_t localIte0 = 0;465 uint8_t localIte1 = 0;466 uint8_t localCount = 0;467 uint8_t localTemp = 0;468 uint8_t localChr = 0;469 uint8_t localX = 0;470 uint8_t localY = 0;471 uint8_t localSize = 0;472473 localX = X;474 localY = Y;475 localSize = Size / 8;476477while (localSize--)478 {479 localChr = (Num * Size / 8) + localCount;480 localCount++;481482for (localIte0 = 0; localIte0 < Size; localIte0++)483 {484if (Size == 16)485 {486 localTemp = Hzk0[localChr][localIte0]; //调⽤16*16字体487 }488else if (Size == 24)489 {490 localTemp = Hzk2[localChr][localIte0]; //调⽤24*24字体491 }492else if (Size == 32)493 {494 localTemp = Hzk3[localChr][localIte0]; //调⽤32*32字体495 }496else if (Size == 64)497 {498 localTemp = Hzk4[localChr][localIte0]; //调⽤64*64字体499 }500else501 {502return ;503 }504505for (localIte1 = 0; localIte1 < 8; localIte1++)506 {507if (localTemp & 0x01)508 {509 FunAppOledDrawPoint(X, Y);510 }511else512 {513 FunAppOledClearPoint(X, Y);514 }515 localTemp >>= 1;516 Y++;517 }518 X++;519if ((X - localX) == Size)520 {521 X = localX;522 localY = localY + 8;523 }524 Y = localY;525 }526 }527 }528529/*************************************************530函数名称 : FunAppOledScrollDisplay531功能描述 : 左移显⽰532被调⽤清单 : ⽆533调⽤清单 :534输⼊参数 : Num显⽰汉字的个数,Space每⼀遍显⽰的间隔535输出参数 : ⽆536返回参数 : ⽆537其他 : ⽆538*************************************************/539void FunAppOledScrollDisplay(uint8_t Num, uint8_t Space)540 {541 uint8_t localIte0 = 0;542 uint8_t localIte1 = 0;543 uint8_t localIte2 = 0;544 uint8_t localIte3 = 0;545 uint8_t localIte4 = 0;546 uint8_t localNum = 0;547 uint8_t localTemp = 0;548549while (1)550 {551if (localNum == 0)552 {553 FunAppOledShowChinese(128, 24, localTemp, 16);//写⼊⼀个汉字保存在OLED_GRAM中554 localTemp++;555 }556557if (localTemp == Num)558 {559for (localIte0 = 0; localIte0 < (16 * Space); localIte0++)//显⽰间隔560 {561for (localIte1 = 0; localIte1 < 144; localIte1++)562 {563for (localIte2 = 0; localIte2 < 8; localIte2++)564 {565 OLED_GRAM[localIte1 - 1][localIte2] = OLED_GRAM[localIte1][localIte2]; 566 }567 }568 FunAppOledRefresh();569 }570 localTemp = 0;571 }572 localNum++;573if (localNum == 16)574 {575 localNum = 0;576 }577for (localIte3 = 0; localIte3 < 144; localIte3++) //左移578 {579for (localIte4 = 0; localIte4 < 8; localIte4++)580 {581 OLED_GRAM[localIte3 - 1][localIte4] = OLED_GRAM[localIte3][localIte4];582 }583 }584 FunAppOledRefresh();585 }586 }587588/*************************************************589函数名称 : FunAppOledWriteBP590功能描述 : 配置写⼊数据的起始位置591被调⽤清单 : ⽆592调⽤清单 :593输⼊参数 : (X , Y)起始位置坐标594输出参数 : ⽆595返回参数 : ⽆596其他 : ⽆597*************************************************/598void FunAppOledWriteBP(uint8_t X, uint8_t Y)599 {600 FunAppOledWriteByte((0xB0 + Y), OLED_CMD);601 FunAppOledWriteByte(((X & 0xF0) >> 4) | 0x10, OLED_CMD);602 FunAppOledWriteByte((X & 0x0F) | 0x01, OLED_CMD);603 }604605/*************************************************606函数名称 : FunAppOledShowPicture607功能描述 : 显⽰图⽚608被调⽤清单 : ⽆609调⽤清单 :610输⼊参数 : (X1 , Y1)起始坐标 (X2 , Y2)终点坐标 Bmp要写⼊的图⽚数组611输出参数 : ⽆612返回参数 : ⽆613其他 : ⽆614*************************************************/615void FunAppOledShowPicture(uint8_t X1, uint8_t Y1, uint8_t X2, uint8_t Y2, uint8_t *Bmp) 616 {617 uint32_t localIte0 = 0;618 uint8_t localX = 0;619 uint8_t localY = 0;620621if ((localY % 8) == 0)622 {623 localY = 0;624 }625else626 {627 localY += 1;628 }629630for (localY = Y1; localY < Y2; localY++)631 {632 FunAppOledWriteBP(X1, localY);633for (localX = X1; localX < X2; localX++)634 {635 FunAppOledWriteByte(Bmp[localIte0], OLED_DATA);636 localIte0++;637 }638 }639 }640641/*************************************************642函数名称 : FunAppOledColorTurn643功能描述 : 反显函数644被调⽤清单 : ⽆645调⽤清单 :646输⼊参数 : Mode == 0正常显⽰, Mode == 1反⾊显⽰647输出参数 : ⽆648返回参数 : ⽆649其他 : ⽆650*************************************************/651void FunAppOledColorTurn(uint8_t Mode)652 {653if (Mode == 0)654 {655 FunAppOledWriteByte(0xA6, OLED_CMD);//正常显⽰656 }657658if (Mode == 1)659 {660 FunAppOledWriteByte(0xA7, OLED_CMD);//反⾊显⽰661 }662 }663664/*************************************************665函数名称 : FunAppOledDisplayTurn666功能描述 : 屏幕旋转180°667被调⽤清单 : ⽆668调⽤清单 :669输⼊参数 : Mode == 0正常显⽰ Mode == 1反转显⽰670输出参数 : ⽆671返回参数 : ⽆672其他 : ⽆673*************************************************/674void FunAppOledDisplayTurn(uint8_t Mode)675 {676if (Mode == 0)677 {678 FunAppOledWriteByte(0xC8, OLED_CMD);//正常显⽰679 FunAppOledWriteByte(0xA1, OLED_CMD);680 }681682if (Mode == 1)683 {684 FunAppOledWriteByte(0xC0, OLED_CMD);//反转显⽰685 FunAppOledWriteByte(0xA0, OLED_CMD);686 }687 }4、字体OLED_FONT.h1/************************************************************2 * Copyright (C) 2021 , 伽椰⼦真可爱3 * All right reserved.4 * ⽂件名称:OLED_FONT.h5 * 作者:⾼弟(GaoDi)6 * 原始版本:V1.07 * 创建⽇期:2022/1/108 * ⽂件描述:OLED字体9 * 函数列表:10 *11 * 历史:12 * <作者> <时间> <版本> <功能描述>13 *14 * **********************************************************/15 #ifndef _OLED_FONT_H_16#define _OLED_FONT_H_1718//常⽤ASCII表19//偏移量3220//ASCII字符集21//偏移量3222//⼤⼩:12*623/************************************6*8的点阵************************************/24//12*12 ASCII字符集点阵25const unsigned char asc2_1206[95][12]={26 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/27 {0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/28 {0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},/*""",2*/29 {0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},/*"#",3*/30 {0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},/*"$",4*/31 {0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/32 {0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/33 {0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/。
STM32 基于9325TP液晶驱动器的驱动程序
//==========================9325TP.h==========================///*-------------------------------------------------9325TP驱动器TFT驱动程序----------------------------------------------------*/#ifndef __9325TP_H#define __9325TP_H#include "stm32f10x_lib.h"/* LCD color */#define White 0xFFFF#define Black 0x0000#define Blue 0x001F#define Blue2 0x051F#define Red 0xF800#define Magenta 0xF81F#define Green 0x07E0#define Cyan 0x7FFF#define Yellow 0xFFE0/* LCD COMMAND */#define WINDOW_XADDR_START 0x50 // Horizontal Start Address Set#define WINDOW_XADDR_END 0x51 // Horizontal End Address Set#define WINDOW_YADDR_START 0x52 // Vertical Start Address Set#define WINDOW_YADDR_END 0x53 // Vertical End Address Set#define GRAM_XADDR 0x20 // GRAM Horizontal Address Set#define GRAM_YADDR 0x21 // GRAM Vertical Address Set#define GRAMWR 0x22 // memory write/* LCD CONTROL PORT */#define LCD_CONTROL_PORT GPIOD#define CS_LCD GPIO_Pin_10#define RS_LCD GPIO_Pin_11#define RW_LCD GPIO_Pin_12#define RD_LCD GPIO_Pin_13#define RST_LCD GPIO_Pin_14#define LCD_CONTROL_PIN CS_LCD | RS_LCD | RW_LCD | RD_LCD | RST_LCD/* LCD DATA PORT */#define LCD_DATA_PORT GPIOE#define RST_LCD_SET GPIO_SetBits(LCD_CONTROL_PORT ,RST_LCD)#define RST_LCD_CLR GPIO_ResetBits(LCD_CONTROL_PORT ,RST_LCD)#define CS_LCD_SET GPIO_SetBits(LCD_CONTROL_PORT ,CS_LCD)#define CS_LCD_CLR GPIO_ResetBits(LCD_CONTROL_PORT ,CS_LCD)#define RS_LCD_SET GPIO_SetBits(LCD_CONTROL_PORT ,RS_LCD)#define RS_LCD_CLR GPIO_ResetBits(LCD_CONTROL_PORT ,RS_LCD)#define RW_LCD_SET GPIO_SetBits(LCD_CONTROL_PORT ,RW_LCD)#define RW_LCD_CLR GPIO_ResetBits(LCD_CONTROL_PORT ,RW_LCD)#define RD_LCD_SET GPIO_SetBits(LCD_CONTROL_PORT ,RD_LCD)#define RD_LCD_CLR GPIO_ResetBits(LCD_CONTROL_PORT ,RD_LCD)/* Line Direction */#define Vertical 0x00#define Horizontal 0x01extern void Init_LCD_9325TP(void) ;extern void Write_LCD_Cmd(unsigned int Data_H ,unsigned int Data_L) ;extern void Write_LCD_Data(unsigned int Data_H ,unsigned int Data_L) ;extern void Write_LCD_Data_U16(unsigned int Dat) ;extern void Init_LCD_Data(unsigned int x ,unsigned int y) ;extern void Clear_Screen(unsigned int Back_Color) ; //用指定的颜色刷屏extern void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned inty1) ; //设定起始坐标extern void LCD_PutChar8x16(unsigned int x, unsigned int y, unsigned char c,unsigned int For_Color, unsigned int Back_Color) ; //显示一个8X16的字符extern void LCD_PutGB1616(unsigned int x, unsigned int y, unsigned char c[2],unsigned int For_Color,unsigned int Back_Color) ; //显示一个16X16的汉字extern void LCD_PutGB3232(unsigned int x, unsigned int y, unsigned char c[2],unsigned int For_Color,unsigned int Back_Color) ; //显示一个32X32的汉字extern void LCD_PutString(unsigned int x, unsigned int y, unsigned char *s,unsigned int For_Color, unsigned int Back_Color) ; //显示一串16X16的字符串extern void LCD_PutGB1616_String(unsigned int x ,unsigned int y ,unsigned char *s ,unsigned int For_Color ,unsigned int Back_Color) ; //显示一串16X16的汉字extern void LCD_DrawLine(unsigned short x ,unsigned short y ,unsigned short length , unsigned char Direction ,unsigned int color) ; //画一条直线extern void LCD_DrawRect(unsigned short x ,unsigned short y ,unsigned short Width , unsigned short Height ,unsigned int color) ; //画一个矩形void LCD_DrawCircle(unsigned short XPos ,unsigned short Ypos ,unsigned short Radius , unsigned int color) ; //画一个圆extern void Show_Photo(unsigned int x0 ,unsigned int y0 ,unsigned int x ,unsigned int y ,const unsigned char *p) ; //显示一张图片extern void u32tostr(unsigned long dat,unsigned char *str) ; //将整型转换为字符串#endif /* 9325TP_H *///=================================================================// //=========================9325TP.c=================================//#include "stm32f10x_lib.h"#include "SysTick_Delay.h"#include "9325TP.h"#include "GB1616.h"#include "GB3232.h"#include "8x16.h"/****************************************************************函数名称: Write_LCD_Cmd功能: 向LCD写入命令参数: Data_H - 16位数据的高八位Data_L - 16位数据的低八位返回值: 无*****************************************************************/void Write_LCD_Cmd(unsigned int Data_H ,unsigned int Data_L){CS_LCD_CLR ; //使能片选信号RS_LCD_CLR ; //命令模式GPIO_Write(LCD_DATA_PORT ,Data_H) ; //高八位RW_LCD_CLR ; //写使能RW_LCD_SET ; //关闭写使能GPIO_Write(LCD_DATA_PORT ,Data_L) ;RW_LCD_CLR ; //写使能RW_LCD_SET ; //关闭写使能CS_LCD_SET ; //结束片选信号}/****************************************************************函数名称: Write_LCD_Data功能: 向LCD写入数据参数: Data_H - 16位数据的高八位Data_L - 16位数据的低八位返回值: 无*****************************************************************/void Write_LCD_Data(unsigned int Data_H ,unsigned int Data_L) {CS_LCD_CLR ; //使能片选信号RS_LCD_SET ; //数据模式GPIO_Write(LCD_DATA_PORT ,Data_H) ; //高八位RW_LCD_CLR ; //写使能RW_LCD_SET ; //关闭写使能GPIO_Write(LCD_DATA_PORT ,Data_L) ; //低八位RW_LCD_CLR ; //写使能RW_LCD_SET ; //关闭写使能CS_LCD_SET ; //结束片选信号}/****************************************************************函数名称: Write_LCD_Data_U16功能: 向LCD写入16位的数据参数: Dat - 要写入的数据返回值: 无*****************************************************************/void Write_LCD_Data_U16(unsigned int Dat){CS_LCD_CLR ; //使能片选信号RS_LCD_SET ; //数据模式GPIO_Write(LCD_DATA_PORT ,Dat>>8) ; //高八位//GPIOE->ODR = Dat>>8 ;RW_LCD_CLR ; //写使能RW_LCD_SET ; //关闭写使能GPIO_Write(LCD_DATA_PORT ,Dat) ; //低八位//GPIOE->ODR = Dat ;RW_LCD_CLR ; //写使能RW_LCD_SET ; //关闭写使能CS_LCD_SET ; //结束片选信号}/****************************************************************函数名称: Init_LCD_Data功能: 初始化LCD写入方法参数: x-要使用的命令代码y-要使用的数据代码返回值: 无*****************************************************************/void Init_LCD_Data(unsigned int x ,unsigned int y){Write_LCD_Cmd(0x0000,x) ;Write_LCD_Data_U16(y) ;}/*************************************************************函数名称: LCD_SetPos功能: 定义显示窗体参数: x0 - 窗体中X坐标中较小者x1 - 窗体中X坐标中较大者y0 - 窗体中Y坐标中较小者y1 - 窗体中Y坐标中较大者返回值: 无*************************************************************/void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1) {Init_LCD_Data(WINDOW_XADDR_START,x0);Init_LCD_Data(WINDOW_XADDR_END,x1);Init_LCD_Data(WINDOW_YADDR_START,y0);Init_LCD_Data(WINDOW_YADDR_END,y1);Init_LCD_Data(GRAM_XADDR,x0);Init_LCD_Data(GRAM_YADDR,y0);Write_LCD_Cmd(0x0000,0x0022); //LCD_WriteCMD(GRAMWR);}/****************************************************************函数名称: Clear_Screen功能: 清屏参数: Back_Color - 清屏后的背景颜色返回值: 无*****************************************************************/void Clear_Screen(unsigned int Back_Color){unsigned int i ,j ;LCD_SetPos(0,240,0,320) ;for(i = 0 ;i < 325 ;i++){for(j = 0 ;j < 240 ;j++)Write_LCD_Data_U16(Back_Color) ;}}/****************************************************************函数名称: LCD_PutChar8x16功能: 显示8x16的字符参数: x - 起始x坐标y - 起始y坐标c - 要显示的字符For_Color - 前景颜色Back_Color - 背景颜色返回值: 无*****************************************************************/void LCD_PutChar8x16(unsigned int x, unsigned int y, unsigned char c, unsigned int For_Color, unsigned int Back_Color){unsigned char i,j;unsigned char m ;c -= 32;LCD_SetPos(x,x+8-1,y,y+16-1);for(i = 0 ;i < 16 ;i++){m = Font8x16[c][i];for(j = 0 ;j < 8 ;j++){if((m&0x80)==0x80){Write_LCD_Data_U16(For_Color);}else{Write_LCD_Data_U16(Back_Color);}m<<=1;}}}/****************************************************************函数名称: LCD_PutGB1616功能: 显示16x16的汉字参数: x - 起始x坐标y - 起始y坐标c - 要显示的汉字For_Color - 前景颜色Back_Color - 背景颜色返回值: 无*****************************************************************/void LCD_PutGB1616(unsigned int x, unsigned int y, unsigned char c[2], unsigned int For_Color,unsigned int Back_Color)unsigned int i, j, k ;unsigned int m ;LCD_SetPos(x ,x+16-1 ,y ,y+16-1) ;for (k = 0;k < 25;k++) //25表示自建汉字库中的汉字个数,采用循环查询{if( (GB_16[k].Index[0]==c[0]) && (GB_16[k].Index[1]==c[1]) ){for(i = 0;i < 32;i++){m = GB_16[k].Msk[i];for(j = 0;j < 8;j++){if((m&0x80)==0x80)Write_LCD_Data_U16(For_Color);elseWrite_LCD_Data_U16(Back_Color);m<<=1;}}}}}/****************************************************************函数名称: LCD_PutGB3232功能: 显示32x32的汉字参数: x - 起始x坐标y - 起始y坐标c - 要显示的汉字For_Color - 前景颜色Back_Color - 背景颜色返回值: 无*****************************************************************/void LCD_PutGB3232(unsigned int x, unsigned int y, unsigned char c[2], unsigned int For_Color,unsigned int Back_Color){unsigned int i, j, k ;unsigned int m ;LCD_SetPos(x ,x+32-1 ,y ,y+32-1) ;for (k = 0;k < 2;k++) //25表示自建汉字库中的汉字个数,采用循环查询{if( (GB_32[k].Index[0]==c[0]) && (GB_32[k].Index[1]==c[1]) )for(i = 0;i < 128;i++){m = GB_32[k].Msk[i];for(j = 0;j < 8;j++){if((m&0x80)==0x80)Write_LCD_Data_U16(For_Color);elseWrite_LCD_Data_U16(Back_Color);m<<=1;}}}}}/****************************************************************函数名称: LCD_PutString功能: 显示32x32的字符串参数: x - 起始x坐标y - 起始y坐标s - 要显示的字符串For_Color - 前景颜色Back_Color - 背景颜色返回值: 无*****************************************************************/void LCD_PutString(unsigned int x, unsigned int y, unsigned char *s, unsigned int For_Color, unsigned int Back_Color){unsigned char i = 0 ;while(*s){LCD_PutChar8x16(x+i*8,y,*s,For_Color,Back_Color);s++ ;i++ ;}}/****************************************************************函数名称: LCD_PutGB1616_String功能: 显示16x16的汉字串参数: x - 起始x坐标y - 起始y坐标s - 要显示的汉字符串For_Color - 前景颜色Back_Color - 背景颜色返回值: 无*****************************************************************/void LCD_PutGB1616_String(unsigned int x ,unsigned int y ,unsigned char *s ,unsigned int For_Color ,unsigned int Back_Color){unsigned char i = 0 ;while(*s){LCD_PutGB1616(x+i*8 ,y ,(unsigned char *)s ,For_Color ,Back_Color) ;s += 2 ;i += 2 ;}}/****************************************************************函数名称: Show_Photo功能: 显示图片参数: x0 - 起始x坐标y0 - 起始y坐标x - 图片宽y - 图片长pic[] 要显示的图片数组返回值: 无*****************************************************************/void Show_Photo(unsigned int x0 ,unsigned int y0 ,unsigned int x ,unsigned int y ,const unsigned char pic[]){unsigned int j;unsigned int i;unsigned long s=0;LCD_SetPos(x0,x0+x-1,y0,y0+y-1);for (i=0;i<y-1;i++){for (j=0;j<x-1;j++){Write_LCD_Data(pic[2*s],pic[2*s+1]);s++ ;}}}/****************************************************************函数名称: LCD_DrawLine功能: 画直线参数: x - 起始x坐标y - 起始y坐标length - 直线长度(长度超过边框将被截掉)Direction - 直线方向(Horizontal or Verticalcolor - 直线颜色返回值: 无*****************************************************************/void LCD_DrawLine(unsigned short x ,unsigned short y ,unsigned short length , unsigned char Direction ,unsigned int color){unsigned char i;if(Direction == Horizontal){if( (x+length) < 240) //检查是否超出边框{LCD_SetPos(x ,x+length ,y ,y) ;for(i = 0 ;i < length ;i++){Write_LCD_Data_U16(color) ;}}else{LCD_SetPos(x ,240 ,y ,y) ;for(i = 0 ;i < (240-x) ;i++){Write_LCD_Data_U16(color) ;}}}else if(Direction == Vertical){if(y+length < 320) //检查是否超出边框{LCD_SetPos(x ,x ,y ,y+length) ;for(i = 0 ;i < length ;i++){Write_LCD_Data_U16(color) ;}}else{LCD_SetPos(x ,x ,y ,320) ;for(i = 0 ;i < (320-y) ;i++){Write_LCD_Data_U16(color) ;}}}}/****************************************************************函数名称: LCD_DrawRect功能: 画矩形参数: x - 起始x坐标y - 起始y坐标Width - 矩形宽Height - 矩形高color - 直线颜色返回值: 无*****************************************************************/void LCD_DrawRect(unsigned short x ,unsigned short y ,unsigned short Width , unsigned short Height ,unsigned int color){LCD_DrawLine(x ,y ,Width ,Horizontal ,color) ; //上'-'LCD_DrawLine(x ,y+Height ,Width ,Horizontal ,color) ; //下'-'LCD_DrawLine(x ,y ,Height ,Vertical ,color) ; //左'|'LCD_DrawLine(x+Width ,y ,Height ,Vertical ,color) ;//右'|'}/****************************************************************函数名称: LCD_DrawCircle功能: 在指定圆心处以指定半径画圆参数: x - 圆心x坐标y - 圆心y坐标Radius - 半径长度color - 直线颜色返回值: 无*****************************************************************/void LCD_DrawCircle(unsigned short Xpos ,unsigned short Ypos ,unsigned short Radius , unsigned int color){signed long D ; //变量unsigned long CurX ; //当前x坐标unsigned long CurY ; //当前y坐标D = 3 - (Radius << 1);CurX = 0;CurY = Radius;while (CurX <= CurY){LCD_SetPos(Xpos + CurX, Xpos + CurX ,Ypos + CurY ,Ypos + CurY);Write_LCD_Data_U16(color);LCD_SetPos(Xpos + CurX, Xpos + CurX ,Ypos - CurY ,Ypos - CurY);Write_LCD_Data_U16(color);LCD_SetPos(Xpos - CurX, Xpos - CurX ,Ypos + CurY ,Ypos + CurY);Write_LCD_Data_U16(color);LCD_SetPos(Xpos - CurX, Xpos - CurX ,Ypos - CurY ,Ypos - CurY);Write_LCD_Data_U16(color);LCD_SetPos(Xpos + CurY, Xpos + CurY ,Ypos + CurX ,Ypos + CurX);Write_LCD_Data_U16(color);LCD_SetPos(Xpos + CurY, Xpos + CurY ,Ypos - CurX ,Ypos - CurX);Write_LCD_Data_U16(color);LCD_SetPos(Xpos - CurY, Xpos - CurY ,Ypos + CurX ,Ypos + CurX);Write_LCD_Data_U16(color);LCD_SetPos(Xpos - CurY, Xpos - CurY ,Ypos - CurX ,Ypos - CurX);Write_LCD_Data_U16(color);if (D < 0){D += (CurX << 2) + 6;}else{D += ((CurX - CurY) << 2) + 10;CurY--;}CurX++;}}/****************************************************************函数名称: u32tostr功能: 将整型数据转换为字符串以送给液晶显示参数: dat - 要转换的整型数据str - 保存转换后字符串的地址指针返回值: 无*****************************************************************/void u32tostr(unsigned long dat,unsigned char *str){char temp[20];unsigned char i=0,j=0;while(dat){temp[i]=dat%10+0x30;i++;dat/=10;}j=i;for(i=0;i<j;i++){str[i]=temp[j-i-1];}if(!i) {str[i++]='0';}str[i]=0;}/****************************************************************函数名称: Init_LCD功能: 初始化LCD参数: 无返回值: 无*****************************************************************/ void Init_LCD_9325TP(void){GPIO_InitTypeDef GPIO_InitStructure ;//数据端口设为输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;GPIO_Init(GPIOE ,&GPIO_InitStructure) ;//控制端口设为输出GPIO_InitStructure.GPIO_Pin = LCD_CONTROL_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;GPIO_Init(GPIOD ,&GPIO_InitStructure) ;RD_LCD_SET ;CS_LCD_SET ;Delay_Nms(5) ;RST_LCD_CLR ;Delay_Nms(5) ;RST_LCD_SET ;Delay_Nms(5) ;Delay_Nms(50); //根据不同晶振速度可以调整延时,保障稳定显示Init_LCD_Data(0x0001,0x0100);Init_LCD_Data(0x0002,0x0700);Init_LCD_Data(0x0003,0x1030);Init_LCD_Data(0x0004,0x0000);Init_LCD_Data(0x0008,0x0207);Init_LCD_Data(0x0009,0x0000);Init_LCD_Data(0x000A,0x0000);Init_LCD_Data(0x000C,0x0000);Init_LCD_Data(0x000D,0x0000);Init_LCD_Data(0x000F,0x0000);//power on sequence VGHVGLInit_LCD_Data(0x0010,0x0000);Init_LCD_Data(0x0011,0x0007);Init_LCD_Data(0x0012,0x0000);Init_LCD_Data(0x0013,0x0000);//vghInit_LCD_Data(0x0010,0x1290);Init_LCD_Data(0x0011,0x0227);Delay_Nms(100);//vregioutInit_LCD_Data(0x0012,0x001d); //0x001bDelay_Nms(100);//vom amplitudeInit_LCD_Data(0x0013,0x1500);Delay_Nms(100);//vom HInit_LCD_Data(0x0029,0x0018);Init_LCD_Data(0x002B,0x000D);//gammaInit_LCD_Data(0x0030,0x0004);Init_LCD_Data(0x0031,0x0307);Init_LCD_Data(0x0032,0x0002);// 0006Init_LCD_Data(0x0035,0x0206);Init_LCD_Data(0x0036,0x0408);Init_LCD_Data(0x0037,0x0507);Init_LCD_Data(0x0038,0x0204);//0200Init_LCD_Data(0x0039,0x0707);Init_LCD_Data(0x003C,0x0405);// 0504Init_LCD_Data(0x003D,0x0F02);//ramInit_LCD_Data(0x0050,0x0000);Init_LCD_Data(0x0051,0x00EF);Init_LCD_Data(0x0052,0x0000);Init_LCD_Data(0x0053,0x013F);Init_LCD_Data(0x060,0xA700);Init_LCD_Data(0x0061,0x0001);Init_LCD_Data(0x006A,0x0000);Init_LCD_Data(0x0080,0x0000);Init_LCD_Data(0x0081,0x0000);Init_LCD_Data(0x0082,0x0000);Init_LCD_Data(0x0083,0x0000);Init_LCD_Data(0x0084,0x0000);Init_LCD_Data(0x0085,0x0000);Init_LCD_Data(0x0090,0x0010);Init_LCD_Data(0x0092,0x0600);Init_LCD_Data(0x0093,0x0003);Init_LCD_Data(0x0095,0x0110);Init_LCD_Data(0x0097,0x0000);Init_LCD_Data(0x0098,0x0000);Init_LCD_Data(0x0007,0x0133);Clear_Screen(Black) ; //显示黑屏}//=================================================================// //====================会用到的其他文件================================// //======================Systick_Delay.h===============================// /*--------------------------------------------------利用SysTick进行精确定时---------------------------------------------------*/#ifndef __SYSTICKDELAY_H#define __SYSTICKDELAY_Hextern void Delay_Nms(u16 Nms);extern void Delay_Nus(u32 Nus);#endif /*SYSTICKDELAY_H*///=================================================================//#include "stm32f10x_lib.h"#include "SysTick_Delay.h"//延时Nms//注意Nms的范围//Nms<=0xffffff*8/SYSCLK//对72M条件下,Nms<=1864void Delay_Nms(u16 Nms){SysTick->LOAD=(u32)Nms*9000; //给重装载寄存器赋值,9000时,将产生1ms的时基 SysTick->CTRL|=0x01; //开始倒数while(!(SysTick->CTRL&(1<<16))); //等待时间到达SysTick->CTRL=0X00000000; //关闭计数器SysTick->VAL=0X00000000; //清空计数器}//延时usvoid Delay_Nus(u32 Nus){SysTick->LOAD=Nus*9; //时间加载SysTick->CTRL|=0x01; //开始倒数while(!(SysTick->CTRL&(1<<16)));//等待时间到达SysTick->CTRL=0X00000000; //关闭计数器SysTick->VAL=0X00000000; //清空计数器}//=================================================================// //写得一般,希望大家可以给我提点意见。
stm32驱动lcd12864程序
#include "12864.h"#include "sys.h"#include "delay.h"#include "usart.h"void p_out(void) //把PB命令端口配置成输出{rs();wr();en();psb();}void wr_outite_cmd(u8 cmd) //写命令{p_out();data_out(); //把PB数据端口配置成输出rs_out=0;wr_out=0;en_out=0;GPIOB->ODR=((GPIOB->ODR&0X00FF)|(cmd<<8));delay_ms(10);en_out=1;delay_ms(10);en_out=0;}void wr_outite_data(u8 dat) //写数据{p_out();data_out();rs_out=1;wr_out=0;en_out=0;GPIOB->ODR=((GPIOB->ODR&0X00FF)|(dat<<8)); //把dat给PB高八位delay_ms(10);en_out=1;delay_ms(10);en_out=0;}void LCDClear(void){wr_outite_cmd(0x01); //显示清屏delay_ms(5);wr_outite_cmd(0x34); // 显示光标移动设置delay_ms(5);wr_outite_cmd(0x30); // 显示开及光标设置delay_ms(5);}void locate_x_y(u8 x,u8 y)//指定显示坐标{u8 x2=0;x2=x;if(y<1) y=1;if(y>4) y=4;x&=0x0f;switch(y){case 1:x2|=0x80;break;case 2:x2|=0x90;break;case 3:x2|=0x88;break;case 4:x2|=0x98;break;}wr_outite_cmd(x2);delay_ms(10);}void lcd_init(void){wr_outite_cmd(0x30);delay_ms(10);wr_outite_cmd(0x01);delay_ms(10);wr_outite_cmd(0x06);delay_ms(10);wr_outite_cmd(0x0c);delay_ms(10);}void DisInt(u8 x,u8 y,int fnum) //显示整型变量的函数,最多显示16位的整数。
STM32用IO口驱动8位2.4TFT
Stm32 用IO口驱动8位液晶程序#include "stm32f10x.h"#include "ILI9320.h"int main(void){SystemInit();GPIO_Config();ILI9325_Initial(); //初始化LCD//delayms(100);//绘制矩形平面// Show_RGB(0,120,0,64,Blue2);// Show_RGB(120,240,0,64,Black);// Show_RGB(0,120,64,128,White);// Show_RGB(120,240,64,128,Blue);// Show_RGB(0,120,128,192,Red);// Show_RGB(120,240,128,192,Magenta);// Show_RGB(0,120,192,256,Green);// Show_RGB(120,240,192,256,Cyan);// Show_RGB(0,120,256,320,Yellow);// Show_RGB(120,240,256,320,Red);//// LCD_PutString(0,0,"专业电子论坛",White,Blue2); // LCD_PutString(0,16,"",White,Blue2); // LCD_PutString(0,32,"专业开发板",White,Blue2);// LCD_PutString(0,48,"浩豚电子科技",White,Blue2);while(1){CLR_Screen(Red); //用背景色清屏CLR_Screen(Yellow);CLR_Screen(Green);}}/*----------------------------------------------------------------320x240彩屏液晶驱动程序----------------------------------------------------------------*/#include"ILI9320.h"#include"stm32f10x.h"void GPIO_Config(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(LCD_GPIO_DATA_CLK|RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin=LCD_GPIO_DATA_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(LCD_GPIO_DATA_PORT ,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4 ;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);}/*----------------------------------------------------------------清屏函数输入参数:bColor 清屏所使用的背景色----------------------------------------------------------------*/void CLR_Screen(unsigned int bColor){unsigned int i,j;LCD_SetPos(0,239,0,319);//320x240for (i=0;i<320;i++){for (j=0;j<240;j++)Write_Data_U16(bColor);}}/*----------------------------------------------------------------显示英文字符输入参数:x 横坐标y 纵坐标c 需要显示的字符fColor 字符颜色bColor 字符背景颜色----------------------------------------------------------------*//*#include "8X16.h"void LCD_PutChar8x16(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor){unsigned int i,j;LCD_SetPos(x,x+8-1,y,y+16-1);for(i=0; i<16;i++) {unsigned char m=Font8x16[c*16+i];for(j=0;j<8;j++) {if((m&0x80)==0x80) {Write_Data_U16(fColor);}else {Write_Data_U16(bColor);}m<<=1;}}}*//*----------------------------------------------------------------显示英文字符输入参数:x 横坐标y 纵坐标c 需要显示的字符fColor 字符颜色bColor 字符背景颜色----------------------------------------------------------------*//*void LCD_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor) {LCD_PutChar8x16( x, y, c, fColor, bColor );} *//*----------------------------------------------------------------显示汉字输入参数:x 横坐标y 纵坐标c 需要显示的汉字码fColor 字符颜色bColor 字符背景颜色----------------------------------------------------------------*//*#include "GB1616.h" //16*16汉字字模void PutGB1616(unsigned short x, unsigned short y, unsigned char c[2], unsigned int fColor,unsigned int bColor){unsigned int i,j,k;LCD_SetPos(x, x+16-1,y, y+16-1);for (k=0;k<64;k++) { //64标示自建汉字库中的个数,循环查询内码if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])){for(i=0;i<32;i++) {unsigned short m=codeGB_16[k].Msk[i];for(j=0;j<8;j++) {if((m&0x80)==0x80) {Write_Data_U16(fColor);}else {Write_Data_U16(bColor);}m<<=1;}}}}} *//*----------------------------------------------------------------显示字符串可以中英文同时显示输入参数:x 横坐标y 纵坐标*s 需要显示的字符串fColor 字符颜色bColor 字符背景颜色----------------------------------------------------------------*//*void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor){unsigned char l=0;while(*s) {if( *s < 0x80){LCD_PutChar(x+l*8,y,*s,fColor,bColor);s++;l++;}else{PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor);s+=2;l+=2;}}}*//*----------------------------------------------------------------显示RGB颜色输入参数:x0,y0 起始坐标x1,y1 结束坐标Color 背景颜色----------------------------------------------------------------*//*void Show_RGB (unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1,unsigned int Color){unsigned int i,j;LCD_SetPos(x0,x1,y0,y1);//坐标for (i=y0;i<=y1;i++) //有两个for{for (j=x0;j<=x1;j++)Write_Data_U16(Color);//写颜色}}*//*----------------------------------------------------------------显示图片图片必须是320x240,否则不能正确识别----------------------------------------------------------------*//*void show_photo(void){unsigned char j;unsigned int i;unsigned long s=0;LCD_SetPos(0,240,0,320);//320x240for (i=0;i<75;i++){for (j=0;j<240;j++)Write_Data(0xff,0xff);}for (i=0;i<170;i++){for (j=0;j<55;j++)Write_Data(0xff,0xff);for (j=0;j<130;j++)Write_Data(pic[s++],pic[s++]);for (j=0;j<55;j++)Write_Data(0xff,0xff);}for (i=0;i<75;i++){for (j=0;j<240;j++)Write_Data(0xff,0xff);}}*//*----------------------------------------------------------------写命令、写数据输入参数:x 需要输入的命令16位y 需要输入的数据16位----------------------------------------------------------------*/ void Write_Cmd_Data (unsigned char x,unsigned int y) {Write_Cmd(x);//八位的命令Write_Data_U16(y);}/*----------------------------------------------------------------写16位数据----------------------------------------------------------------*/void Write_Data_U16(unsigned int y){unsigned char m,n;m=y>>8;n=y;Write_Data(m,n);}/*------------------------------------------------------------------------------ 写16位命令---------------------------------------------------------------------------------*/ void Write_Cmd(unsigned int y){unsigned char m,n;m=y>>8;n=y;Write_Cmd1(m,n);}/*----------------------------------------------------------------写命令(双八位)----------------------------------------------------------------*/void Write_Cmd1(unsigned char DH,unsigned char DL){LCD_CS_CLR;LCD_RS_CLR;LCD_RD_SET;LCD_RW_CLR;WriteData(DH);LCD_RW_SET;LCD_CS_SET;LCD_CS_CLR;LCD_RS_CLR;LCD_RD_SET;LCD_RW_CLR;WriteData(DL);LCD_RW_SET;LCD_CS_SET;}/*----------------------------------------------------------------写数据双8位----------------------------------------------------------------*/void Write_Data(unsigned char DH,unsigned char DL){LCD_CS_CLR;LCD_RS_SET;LCD_RW_CLR;LCD_RD_SET;WriteData(DH);LCD_CS_CLR;LCD_RW_SET;LCD_CS_CLR;LCD_RS_SET;LCD_RW_CLR;LCD_RD_SET;WriteData(DL);LCD_RW_SET;LCD_CS_SET;}/*----------------------------------------------------------------延时函数----------------------------------------------------------------*/void delay_us(int time) //延时微秒级函数{do{time--;}while(time>1);}void delayms(uint time) //延时毫秒级函数{while(time!=0){delay_us(1000); time--;}}/*----------------------------------------------------------------液晶初始化----------------------------------------------------------------*/void ILI9325_Initial(void){LCD_RS_SET;LCD_RW_SET;LCD_CS_SET;LCD_RES_SET;delayms(1);LCD_RES_CLR;delayms(10);LCD_RES_SET;delayms(50);Write_Cmd_Data(0x00E5, 0x8000); // Set internal timingWrite_Cmd_Data(0x0000, 0x0001); // 启动振荡Write_Cmd_Data(0x002b, 0x0010); // Set internal timingWrite_Cmd_Data(0x0001,0x0100);Write_Cmd_Data(0x0002,0x0700);Write_Cmd_Data(0x0003,0x1030);Write_Cmd_Data(0x0004,0x0000);Write_Cmd_Data(0x0008,0x0207);Write_Cmd_Data(0x0009,0x0000);Write_Cmd_Data(0x000A,0x0000);Write_Cmd_Data(0x000C,0x0000);Write_Cmd_Data(0x000D,0x0000);Write_Cmd_Data(0x000F,0x0000);//power on sequence VGHVGLWrite_Cmd_Data(0x0010,0x0000);Write_Cmd_Data(0x0011,0x0007);Write_Cmd_Data(0x0012,0x0000);Write_Cmd_Data(0x0013,0x0000);//vghWrite_Cmd_Data(0x0010,0x1290);Write_Cmd_Data(0x0011,0x0227);delayms(100);//vregioutWrite_Cmd_Data(0x0012,0x001d); //0x001b delayms(100);//vom amplitudeWrite_Cmd_Data(0x0013,0x1500); delayms(100);//vom HWrite_Cmd_Data(0x0029,0x0018);Write_Cmd_Data(0x002B,0x000D);//gammaWrite_Cmd_Data(0x0030,0x0004);Write_Cmd_Data(0x0031,0x0307);Write_Cmd_Data(0x0032,0x0002);// 0006 Write_Cmd_Data(0x0035,0x0206);Write_Cmd_Data(0x0036,0x0408);Write_Cmd_Data(0x0037,0x0507);Write_Cmd_Data(0x0038,0x0204);//0200 Write_Cmd_Data(0x0039,0x0707);Write_Cmd_Data(0x003C,0x0405);// 0504 Write_Cmd_Data(0x003D,0x0F02);//ramWrite_Cmd_Data(0x0050,0x0000);Write_Cmd_Data(0x0051,0x00EF);Write_Cmd_Data(0x0052,0x0000);Write_Cmd_Data(0x0053,0x013F);Write_Cmd_Data(0x0060,0xA700);Write_Cmd_Data(0x0061,0x0001);Write_Cmd_Data(0x006A,0x0000);//Write_Cmd_Data(0x0080,0x0000);Write_Cmd_Data(0x0081,0x0000);Write_Cmd_Data(0x0082,0x0000);Write_Cmd_Data(0x0083,0x0000);Write_Cmd_Data(0x0084,0x0000);Write_Cmd_Data(0x0085,0x0000);//Write_Cmd_Data(0x0090,0x0010);Write_Cmd_Data(0x0092,0x0600);Write_Cmd_Data(0x0093,0x0003);Write_Cmd_Data(0x0095,0x0110);Write_Cmd_Data(0x0097,0x0000);Write_Cmd_Data(0x0098,0x0000);Write_Cmd_Data(0x0007,0x0133);Write_Cmd_Data(0x0000,0x0022);//}/*----------------------------------------------------------------画点输入参数:x,y 需要画点坐标color 点的颜色----------------------------------------------------------------*//*void Put_pixel(uchar x,uchar y,unsigned int color){LCD_SetPos(x,x,y,y);Write_Data_U16(color);}*//*----------------------------------------------------------------设置坐标----------------------------------------------------------------*/static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1) {Write_Cmd_Data(WINDOW_XADDR_START,x0);Write_Cmd_Data(WINDOW_XADDR_END,x1);Write_Cmd_Data(WINDOW_Y ADDR_START,y0);Write_Cmd_Data(WINDOW_Y ADDR_END,y1);Write_Cmd_Data(GRAM_XADDR,x0);Write_Cmd_Data(GRAM_Y ADDR,y0);Write_Cmd (0x0022);//LCD_WriteCMD(GRAMWR);}/*----------------------------------------------------------------在屏幕上画线输入参数:起始坐标X0,Y0,终止坐标X1,Y1color 线颜色----------------------------------------------------------------*//*void Line( uchar X0,uchar Y0,uchar X1,uchar Y1,unsigned int color){int dx = X1 - X0;int dy = Y1 - Y0;int P = 2 * dy - dx;int dobDy = 2 * dy;int dobD = 2 * (dy - dx);int PointX = 0,PointY = 0;int incx = 0,incy = 0;int distance = 0,xerr = 0,yerr = 0;unsigned int i = 0;if(dx == 0) //k=1斜率为1{PointX = X0;if(Y0 < Y1){PointY = Y0;}else{PointY = Y1;}for(i = 0;i <= ((Y0<Y1) ? (Y1-Y0) : (Y0-Y1));i++) {Put_pixel(PointX,PointY,color);PointY++;}return;}if(dy == 0) //k=0斜率为0{PointY = Y0;if(X0 < X1){PointX = X0;}else{PointX = X1;}for(i = 0;i <= ((X0<X1) ? (X1-X0) : (X0-X1));i++) {Put_pixel(PointX,PointY,color);PointX++;}return;}if(dx > 0)incx = 1;else if(dx == 0)incx = 0;elseincx = -1;if(dy > 0)incy = 1;else if(dy == 0)incy = 0;elseincy = -1;dx = ((X0>X1) ? (X0-X1) : (X1-X0));dy = ((Y0>Y1) ? (Y0-Y1) : (Y1-Y0));if(dx>dy) distance=dx;else distance=dy;PointX = X0;PointY = Y0;for(i=0;i<=distance+1;i++){Put_pixel(PointX,PointY,color);xerr+=dx;yerr+=dy;if(xerr>distance){xerr-=distance;PointX+=incx;}if(yerr>distance){yerr-=distance;PointY+=incy;}}}*//*---------------------------------------------------------------------------绘制矩形框输入参数:矩形的起始位置left,top矩形的结束位置right,bottom矩形框的颜色color-----------------------------------------------------------------------------*/ /*void Rectangle( uchar left,uchar top,uchar right,uchar bottom,unsigned int color){Line(left,top,right,top,color);Line(left,top,left,bottom,color);Line(right,top,right,bottom,color);Line(left,bottom,right,bottom,color);}*//*---------------------------------------------------------------------------绘制平面矩形输入参数:矩形的起始位置left,top矩形的结束位置right,bottom矩形框的颜色color-----------------------------------------------------------------------------*/ /*void Bar( uchar left,uchar top,uchar right,uchar bottom,unsigned int color){uchar i = 0,k = 0;for(k = top;k < bottom;k++){for(i = left+1;i <= right;i++){LCD_SetPos(i,i,k,k);Write_Data_U16(color);}}}*//*---------------------------------------------------------------------------向LCD发送一个0--255的数值-----------------------------------------------------------------------------*/ /*void LCDShow_uCharNumber( uchar x,uchar y,uchar uCharNumber,unsigned int forecolor,unsigned int bkcolor){LCD_PutChar(x,y,uCharNumber/100+'0',forecolor,bkcolor);LCD_PutChar(x+8,y,uCharNumber/10%10+'0',forecolor,bkcolor);LCD_PutChar(x+16,y,uCharNumber%10+'0',forecolor,bkcolor); }*/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录2整个设计全部源程序:/*以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin3.0版环境下均测试通过。
*/ #include <AT89x51.H>unsigned int zimo,xx=0; //zimo是字模计数器,xx为分屏显示的时候的字数。
unsigned char yid,h; //yid为移动计数器,h为行段计数器unsigned char code hanzi[]; //汉字字模unsigned char BUFF[18],BUFF2[18]; //左移显示的缓存void qing(void); void xianshi(void);void fen(void); void zuo(void);void in_data(void); //调整数据void rxd_data(void); //左移发送数据void out_rxd(unsigned char *d); //分屏、上移发送数据char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*//***********主程序******************/void main(void){ unsigned char ee;SCON=0;P1=0;yid=0;zimo=0;while(1){ fen(); //分屏显示for(ee=30;ee>0;ee--)//清屏幕3秒{qing();}zuo(); //左移显示for(ee=30;ee>0;ee--){qing();}}}/**********清屏幕*******************/void qing (void){ unsigned char zz,xx=0x0ff;for (zz=33;zz>0;zz--){out_rxd(&xx);}P1=0xff; P1=0; //锁存为高,74HC595锁存信号P2=0; //清74LS138的使能端}/**********分屏显示***********/void fen(void){ do{ xianshi(); }while(xx++<=5); //调用单屏显示xx=0;}/************单屏显示*************/void xianshi(void){ unsigned char ii,jj; unsigned int kk,aa;for (kk=500;kk>0;kk--) //每屏显示500次{for(ii=1;ii<16;ii+=2) //每个汉字分8行扫描{for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次{ aa=(xx*8+jj)*32+ii;out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。
out_rxd(&hanzi[aa-1]); //从串口输出第1个字的第1字节。
}for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次{ aa=(xx*8+jj)*32+ii;out_rxd(&hanzi[aa+16]); //从串口输出第1个字的第17字节。
out_rxd(&hanzi[aa+15]); //从串口输出第1个字的第18字节}P2=0x0ff;P1=0xff; P1=0; //锁存为高,74HC595锁存信号P2=sw[h]; //输出行信号h++; //行加一if(h==8)h=0;}}}/***************左移显示************/void zuo(void){ unsigned char i,d=5; //d为移动的时候一个汉字的扫描显示次数xianshi(); //调用单屏显示while(zimo<=1450){while(yid<16) //数据移位。
{for(i=0;i<d;i++) //移动速度{for(h=0;h<8;h++) //8行扫描{ in_data(); //调整数据rxd_data(); //串口发送数据P2=sw[h]; //送段码P1=0xff; //锁存为高,595锁存信号P1=0;}}yid++; //移动一步}yid=0;zimo=zimo+32; //后移一个字,}zimo=0;}/*************分屏显示的数据发送************/void out_rxd(unsigned char *d) /*从串口发送数据*/{ SBUF=*d; while(!TI); //等待发送完毕TI=0;}/*******左移显示读取数据并调整**************/void in_data(void){ char s,w; unsigned int qqq;for(s=8;s>=0;s--){ w=s+s;qqq=zimo+h+h+s*32;BUFF[w+1]=hanzi[qqq];BUFF[w]=hanzi[qqq+1];BUFF2[w+1]=hanzi[qqq+16];BUFF2[w]=hanzi[qqq+17];}}/**********左移显示的数据调整发送***************/void rxd_data(void) //串行发送数据{unsigned char inc,s,tempyid,temp;if(yid<8) inc=0;else inc=1;for(s=0+inc;s<16+inc;s++) //发送数据{ if(yid<8) tempyid=yid;else tempyid=yid-8;temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));SBUF=temp; //把BUFF中的字节从大到小移位相或后发送输出。
while(!TI);TI=0; //等待发送中断}for(s=0+inc;s<16+inc;s++) //发送8字节数据{ if(yid<8) tempyid=yid;else tempyid=yid-8;temp=(BUFF2[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid));SBUF=temp; //把BUFF中的字节从大到小移位相或后发送输出。
while(!TI);TI=0; //等待发送中断}}/*************汉字编码信息*************/unsigned char code hanzi[]={/*-- 文字: 勤 --*/0xFB,0xBB,0xFA,0x00,0xFB,0xBB,0xFB,0x83,0xC0,0xEF,0xDB,0x01,0xDB,0x6D ,0xDB,0x01,0xDB,0xEF,0xDB,0x01,0xDB,0xEF,0xDB,0x83,0xDD,0xEF,0xDD,0x0 F,0xD6,0xE0,0xEF,0x7D,/*-- 文字: 奋 --*/0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFE,0xBF,0xFD,0xDF,0xF3,0xEF ,0x8F,0xF3,0xD0,0x04,0xF7,0x77,0xF7,0x77,0xF0,0x07,0xF7,0x77,0xF7,0x7 7,0xF0,0x07,0xF7,0xF7,/*-- 文字: 求 --*/0xFB,0x7F,0xF7,0x7F,0xF7,0x7F,0xC0,0x01,0xFF,0x7F,0xEF,0x7B,0xF7,0x77 ,0xFA,0x6F,0xFD,0x7F,0xFB,0x5F,0xF7,0x6F,0x8F,0x77,0xDF,0x79,0xFF,0x7 F,0xFF,0x5F,0xFF,0xBF,/*-- 文字: 实 --*/0xFF,0x7F,0xFE,0xFF,0x80,0x01,0xDF,0xFD,0xEE,0xEE,0xFE,0xDF,0xFE,0xDF ,0xFE,0xF7,0xFE,0xEF,0xFE,0xEF,0xC0,0x01,0xFD,0x7F,0xFB,0xBF,0xF7,0xD F,0xCF,0xE7,0xDF,0xF9,/*-- 文字: 献 --*/0xF7,0xEF,0xF7,0xEF,0xE7,0xEF,0xD6,0x00,0xD7,0xEF,0xF7,0xEF,0x81,0x01 ,0xF7,0x55,0xF7,0x6D,0xF7,0x01,0xEB,0x6D,0xEB,0x01,0xEB,0x6D,0xDD,0x6 D,0xDD,0x4D,0xBE,0xBD,/*-- 文字: 身 --*/0xFF,0x7F,0xFF,0xBF,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,0xB0,0x0F ,0xD7,0xEF,0xE7,0xEF,0xF0,0x01,0xF5,0xFF,0xF6,0xFF,0xF7,0x3F,0xF7,0xC 7,0xF5,0xF8,0xFB,0xFF,/*-- 文字: 开 --*/0xFF,0xFF,0xC0,0x03,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF ,0x80,0x01,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xEF,0xFB,0xE F,0xFB,0xF7,0xFB,0xFB,/*-- 文字: 拓 --*/0xFF,0xF7,0xFF,0xF7,0x80,0x37,0xFD,0xF7,0xFD,0xC0,0xFE,0xF7,0xFE,0xD7 ,0xC0,0x67,0xDE,0xB3,0xDE,0xD4,0xDE,0xF7,0xDE,0xF7,0xDE,0xF7,0xC0,0xF 7,0xDE,0xF5,0xFF,0xFB,/*-- 文字: 桂 --*/0xFB,0xF7,0xFB,0xF7,0xC0,0x77,0xFB,0xF7,0xFB,0xC0,0xFB,0xF7,0x80,0x33 ,0xFB,0xE3,0xFB,0xD5,0xFB,0xD5,0xC0,0x76,0xFB,0xF7,0xFB,0xF7,0xFB,0xF 7,0x80,0x37,0xFF,0xF7,/*-- 文字: 林 --*/0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xC0,0x81,0xFB,0xEF,0xF9,0xE7 ,0xF1,0xC7,0xEA,0xAB,0xEA,0xAB,0xDB,0x6D,0xBB,0xAE,0xFB,0xEF,0xFB,0xE F,0xFB,0xEF,0xFB,0xEF,/*-- 文字: 工 --*/0xFF,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F ,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x0 0,0xFF,0xFF,0xFF,0xFF,/*-- 文字: 学 --*/0xF7,0xBB,0xF7,0x77,0xFB,0x77,0xFD,0xFF,0x80,0x01,0xDF,0xFD,0xEF,0xFE ,0xF8,0x07,0xFD,0xFF,0xFE,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7 F,0xFF,0x5F,0xFF,0xBF,/*-- 文字: 院 --*/0xFD,0xFF,0xFB,0xC1,0x80,0x1D,0xBF,0xAD,0xFF,0xED,0xC0,0x75,0xFF,0xED,0xFF,0xED,0x80,0x1D,0xF6,0xDD,0xF6,0xDD,0xF6,0xE9,0xB6,0xF5,0xB7,0x7 D,0x8F,0x7D,0xFF,0xBD,/*-- 文字: 电 --*/0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xF0,0x01,0xF7,0xBD,0xF7,0xBD ,0xF0,0x01,0xF7,0xBD,0xF7,0xBD,0xF0,0x01,0xF7,0xBD,0xDF,0xBF,0xDF,0xB F,0xDF,0xBF,0xC0,0x7F,/*-- 文字: 计 --*/0xFB,0xFF,0xFB,0xF7,0xFB,0xEF,0xFB,0xEF,0xFB,0xFF,0xFB,0xFF,0x80,0x21 ,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0x6F,0xFB,0xAF,0xFB,0xC F,0xFB,0xEF,0xFB,0xFF,/*-- 文字: 系 --*/0xE1,0xFF,0xFE,0x01,0xFF,0xBF,0xFB,0xDF,0xFD,0xEF,0xFE,0x03,0xFF,0x7F ,0xFB,0x9F,0xF7,0xEF,0xE0,0x03,0xEF,0x77,0xFF,0x7F,0xF7,0x77,0xEF,0x7 B,0xEF,0x5D,0xFF,0xBF, /*-- 文字: 电 --*/0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xF0,0x01,0xF7,0xBD,0xF7,0xBD ,0xF0,0x01,0xF7,0xBD,0xF7,0xBD,0xF0,0x01,0xF7,0xBD,0xDF,0xBF,0xDF,0xB F,0xDF,0xBF,0xC0,0x7F,/*-- 文字: 信 --*/0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xC0,0x17,0xFF,0xF7,0xFF,0xF3,0xE0,0x35 ,0xFF,0xF6,0xE0,0x37,0xFF,0xF7,0xE0,0x37,0xEF,0xB7,0xEF,0xB7,0xEF,0xB 7,0xE0,0x37,0xEF,0xB7,/*-- 文字: 0 --*/0xFC,0x1F,0xFB,0xEF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7 ,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xEF,0xFC,0x1F,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0xFF,/*-- 文字: 2 --*/0xFE,0x1F,0xFD,0xEF,0xFB,0xF7,0xFB,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFF ,0xFF,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xEF,0xF0,0x07,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0xFF,/*-- 文字: - --*/0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0xFF,/*-- 文字: 3 --*/0xF0,0x0F,0xFB,0xFF,0xFD,0xFF,0xFE,0xFF,0xFC,0x7F,0xFB,0xFF,0xF7,0xFF ,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xFB,0xEF,0xFC,0x1F,0xFF,0xFF,0xFF,0xF F,0xFF,0xFF,0xFF,0xFF,/*-- 文字: 班 --*/0xFE,0xFF,0xFE,0xFF,0x82,0xC0,0xEE,0xF7,0xEE,0xF7,0xEE,0xB7,0xEE,0xA1 ,0x82,0xB7,0xEE,0xD7,0xEE,0xF7,0xEE,0xF7,0xEF,0x47,0xEF,0x70,0x81,0xB D,0xFF,0xDF,0xFF,0xE7, /*-- 文字: 张 --*/0xFF,0x7F,0xEF,0x60,0xEF,0x6F,0xF7,0x6F,0xFB,0x6F,0xFD,0x61,0xFF,0x7D ,0x80,0x1D,0xFD,0x7D,0xFD,0x61,0xFB,0x6F,0xFB,0x6F,0xF7,0x6F,0x8D,0x6 F,0xDE,0x75,0xFF,0x7B,/*-- 文字: 涛 --*/0xFE,0xFF,0xFE,0xFB,0xC0,0x17,0xFE,0xF7,0xE0,0x3E,0xFE,0xFD,0x80,0x0D ,0xEF,0x7F,0xEF,0x77,0x80,0x3B,0xEF,0xB8,0xEF,0x5B,0xEE,0xEB,0xEE,0xF 3,0xEB,0xFB,0xF7,0xFF,/*-- 文字: 制 --*/0xDF,0xDF,0xDF,0xDB,0xDF,0xDB,0xDA,0x03,0xDB,0xDB,0xDB,0xDD,0xD8,0x00 ,0xDB,0xDF,0xDB,0xDF,0xDA,0x03,0xDA,0xDB,0xDE,0xDB,0xDE,0x9B,0xDF,0x5 B,0xD7,0xDF,0xEF,0xDF,/*-- 文字: 作 --*/0xFF,0x6F,0xFF,0x6F,0xFF,0x6F,0x80,0x77,0xFE,0xB7,0xFE,0xB3,0xFE,0xD5 ,0xE0,0xE6,0xFE,0xF7,0xFE,0xF7,0xFE,0xF7,0xC0,0xF7,0xFE,0xF7,0xFE,0xF 7,0xFE,0xF7,0xFE,0xF7,/*-- 文字: 谢 --*/0xEF,0x7F,0xEF,0xBD,0xEE,0x13,0xEE,0xDB,0x80,0x1F,0xEE,0xDF,0xEC,0x18 ,0xEA,0xDB,0xEA,0x0B,0xEE,0x7B,0xEE,0xBB,0xEE,0xAB,0xEE,0xD3,0xEE,0xE B,0xEA,0xB7,0xF7,0x7F,/*-- 文字: 谢 --*/0xEF,0x7F,0xEF,0xBD,0xEE,0x13,0xEE,0xDB,0x80,0x1F,0xEE,0xDF,0xEC,0x18 ,0xEA,0xDB,0xEA,0x0B,0xEE,0x7B,0xEE,0xBB,0xEE,0xAB,0xEE,0xD3,0xEE,0xE B,0xEA,0xB7,0xF7,0x7F,/*-- 文字: 各 --*/0xFF,0xDF,0xFF,0xDF,0xF0,0x1F,0xFB,0xCF,0xFB,0xB7,0xFD,0xB9,0xFE,0x7F ,0xF9,0x9F,0x87,0xE7,0xD0,0x08,0xF7,0xEF,0xF7,0xEF,0xF7,0xEF,0xF7,0xE F,0xF0,0x0F,0xFF,0xFF,/*-- 文字: 位 --*/0xFF,0x6F,0xFC,0xCF,0xFD,0xF7,0xC0,0x17,0xFF,0xFB,0xF7,0xD3,0xE7,0xB5 ,0xF7,0xB5,0xF7,0x76,0xFB,0x77,0xFB,0x77,0xFB,0xF7,0xFD,0xF7,0x80,0x0 7,0xFF,0xF7,0xFF,0xFF,/*-- 文字: 老 --*/0xFF,0xBF,0xEF,0xBF,0xC0,0x01,0xEF,0xBF,0xF7,0xBF,0xFB,0xBF,0x80,0x00 ,0xFE,0x7F,0xFF,0xBF,0xF3,0xCF,0xFC,0xD3,0xFF,0x1C,0xDF,0xDF,0xDF,0xD F,0xC0,0x3F,0xFF,0xFF,/*-- 文字: 师 --*/0xFF,0xEF,0x80,0x2F,0xFB,0xED,0xFB,0xED,0x80,0x2D,0xBB,0xAD,0xBB,0xAD ,0xBB,0xAD,0xBB,0xAD,0xBB,0xB5,0xAB,0xB5,0xDB,0xB7,0xFB,0xFB,0xFB,0xF D,0xFB,0xFE,0xFB,0xFF,/*-- 文字: ! --*/0xFE,0x3F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F ,0xFE,0x3F,0xFE,0x3F,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFE,0x3F,0xFE,0x3 F,0xFF,0x7F,0xFF,0xFF};stm32_19264液晶LCD驱动程序/****************************lcd.h********************************************/#ifndef __LCD_H#define __LCD_H#include "sys.h"#define LCD_RS PFout(0)// PF.0#define LCD_E PFout(1)// PF.1#define LCD_CS1 PFout(2)// PF.2#define LCD_RST PFout(3)// PF.3#define LCD_CS2 PFout(4)// PF.4#define LCD_CS3 PFout(5)// PF.5#define LCD_DATA(x) GPIOE->ODR=(GPIOB->ODR&0x807F)|((x &0x00FF)<<7) //PE7~14,作为数据线#define LCD_PAGE_ADDR 0xb8#define LCD_COL_ADDR 0x40void LCDPortSet(void); //LCD IO口配置void LcdInit(void); //初始化程序void LcdClear(void); //清屏程序void WriteChr16x16(u8 pag,u8 col, u8 *chr); //写一个汉字#endif/******************************************************lcd.c**************************** ********************/#include <stm32f10x_lib.h>#include "lcd.h"#include "delay.h"//LCD IO口配置void LCDPortSet(void){RCC->APB2ENR|=1<<6; //使能PORTE时钟RCC->APB2ENR|=1<<7; //使能PORTF时钟GPIOE->CRH&=0XF; //PE8-14数据口GPIOE->CRH|=0X;GPIOE->CRL&=0X0FFFFFFF; //PE7数据口GPIOE->CRL|=0X;GPIOE->ODR|=0X7F80; //上拉GPIOF->CRL&=0XF;GPIOF->CRL|=0X; //PF.0 1 2 3 4 5 6推挽输出GPIOF->ODR|=1<<0; //PF.0 输出高GPIOF->ODR|=1<<1; //PF.1 输出高GPIOF->ODR|=1<<2; //PF.2 输出高GPIOF->ODR|=1<<3; //PF.3 输出高GPIOF->ODR|=1<<4; //PF.4 输出高GPIOF->ODR|=1<<5; //PF.5 输出高GPIOF->ODR|=1<<6; //PF.6 输出高}void SelectChip1(void) //选择第1屏{LCD_CS1=0;LCD_CS2=1;LCD_CS3=1;}void SelectChip2(void) //选择第2屏{LCD_CS1=1;LCD_CS2=0;LCD_CS3=1;}void SelectChip3(void) //选择第3屏{LCD_CS1=1;LCD_CS2=1;LCD_CS3=0;}void WriteCommand(u8 cmd) //写命令{LCD_RS=0; //写命令//RW=0;LCD_DATA(cmd);LCD_E=1;delay_us(10);LCD_E=0;}void WriteData(u8 dat) //写数据{LCD_RS=1; //写数据//RW=0;LCD_DATA(dat); //数据输出到数据口LCD_E=1; //写入到LCDdelay_us(10);LCD_E=0;}void LcdClear(void) //清屏{u16 j = 0;u16 k = 0;LCD_CS1 = 0;LCD_CS2 = 0;LCD_CS3 = 0;WriteCommand(LCD_PAGE_ADDR + 0); WriteCommand(LCD_COL_ADDR + 0); for(k=0;k<8;k++){WriteCommand(LCD_PAGE_ADDR+k); for(j=0;j<64;j++){WriteData(0x00);}}LCD_CS1 = 1;LCD_CS2 = 1;LCD_CS3 = 1;}void LcdInit(void) //初始化程序{LCD_RST = 0;delay_us(20);LCD_RST = 1;delay_us(5);LCD_CS1=0;LCD_CS2=0;LCD_CS3=0;WriteCommand(0x3f); //设置开显示命令WriteCommand(0xc0); //设置起始位置LCD_CS1 = 1;LCD_CS2 = 1;LCD_CS3 = 1;LcdClear(); //清屏}void WriteChr16x16(u8 pag,u8 col,u8 *chr) //写一个汉字{u8 i = 0;u8 j = 0;u8 col_t = 0;WriteCommand(0xc0);col_t = col;for(i=0;i<2;i++){for(j=0;j<16;j++){switch(col_t&0xc0){case 0:SelectChip1();WriteCommand(LCD_PAGE_ADDR + pag + i); WriteCommand(LCD_COL_ADDR + col_t - 0 ); WriteData(chr[16*i + j]);col_t++;break;case 0x40:SelectChip2();WriteCommand(LCD_PAGE_ADDR + pag + i);WriteCommand(LCD_COL_ADDR + col_t - 64);WriteData(chr[16*i + j]);col_t++;break;case 0x80:SelectChip3();WriteCommand(LCD_PAGE_ADDR + pag + i);WriteCommand(LCD_COL_ADDR + col_t - 128);WriteData(chr[16*i + j]);col_t++;break;default: break;}}col_t=col_t-16;}}/***************************************************main.c***************************** *************************//**@说明:JBG19264 LCD测试程序*/#include <stm32f10x_lib.h>#include "sys.h"#include "delay.h" #include "lcd.h"u8 table[][32]={/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00,0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41, 0xF8,0x00,/*-- 文字: 们 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x60,0xF8,0x07,0x00,0xF8,0x01,0x06,0x00,0x04,0x04,0x04,0xFC, 0x00,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F, 0x00,0x00,/*-- 文字: 都 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0xFE,0x02,0x22,0xDA ,0x06,0x00,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0xFF,0x08,0x10,0x08, 0x07,0x00,/*-- 文字: 是 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00, 0x00,0x00,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81, 0x81,0x00,/*-- 文字: 好 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86 ,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00, 0x00,0x00,/*-- 文字: 孩 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x02,0x02,0x02,0xF2,0x8A,0x46,0x08,0x88,0xC8,0xA8,0x99,0x8E,0x88,0x48 ,0x28,0x00,0x02,0x42,0x81,0x7F,0x00,0x00,0x88,0x88,0x44,0x44,0x22,0x11,0x28,0x44, 0x82,0x00,/*-- 文字: 子 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,/*-- 文字: 我 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0 ,0x20,0x00,0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41, 0xF8,0x00,/*-- 文字: 们 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x60,0xF8,0x07,0x00,0xF8,0x01,0x06,0x00,0x04,0x04,0x04,0xFC, 0x00,0x00,0x01,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x40,0x80,0x7F, 0x00,0x00,/*-- 文字: 都 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0xFE,0x02,0x22,0xDA ,0x06,0x00,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0xFF,0x08,0x10,0x08, 0x07,0x00,/*-- 文字: 是 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00, 0x00,0x00,0x81,0x41,0x21,0x1D,0x21,0x41,0x81,0xFF,0x89,0x89,0x89,0x89,0x89,0x81, 0x81,0x00,/*-- 文字: 好 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86 ,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00};int main(void){u8 i = 0;Stm32_Clock_Init(9); //系统时钟设置8MHz * 9 = 72MHz delay_init(72); //延时初始化LCDPortSet(); //LCD口设置LcdInit(); //LCM初始化程序delay_ms(100);while(1){LCD_DATA(0x55);delay_us(10);LCD_DATA(0xf0);while(1){delay_ms(1000);for(i=0;i<12;i++)WriteChr16x16(0,i*16,table[i]);for(i=0;i<12;i++)WriteChr16x16(2,i*16,table[i]);for(i=0;i<12;i++)WriteChr16x16(4,i*16,table[i]);for(i=0;i<12;i++)WriteChr16x16(6,i*16,table[i]);delay_ms(500);}}}STM32液晶屏驱动程序stm32单片机驱动12232液晶屏。