STM32液晶屏驱动程序

合集下载

SSD1289主控液晶的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液晶屏

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液晶屏驱动程序

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的驱动设计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-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驱动程序设计与实现

基于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显⽰程序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显示驱动程序,,寄存器版

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);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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液晶屏。

相关文档
最新文档