LCD12864大液晶任意位置显示文字
单片机源程序如下:
- #include "LCD12864.h"
- #include "U_Font.h"
- uint8_t LCD12864_GRAM[1024]; /* LCD12864 显存 */
- /*=======================================================================================*/
- void LCD12864_Init(void)
- {
- LCD12864_GPIO_Config();
- LCD12864_Write_CMD(0x30); //选择基本指令操作
- LCD12864_Write_CMD(0x0c); //显示开,关光标
- LCD12864_Write_CMD(0x01); //清除LCD12864的显示内容
- }
- void LCD12864_GPIO_Config(void)
- {
- GPIO_InitTypeDef h_GPIO_LCD12864;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
-
- h_GPIO_LCD12864.GPIO_Mode = GPIO_Mode_Out_PP;
-
- h_GPIO_LCD12864.GPIO_Pin = LCD12864_RS_Pin|
- LCD12864_RW_Pin|
- LCD12864_EN_Pin;
-
- h_GPIO_LCD12864.GPIO_Speed = GPIO_Speed_50MHz;
-
- GPIO_Init(LCD12864_CMD_Port,&h_GPIO_LCD12864);
- }
- void LCD12864_DAT_Port_Switch_InPut(void) /*LCD12864 Dat Port 切换为输入*/
- {
- GPIO_InitTypeDef h_GPIO_LCD12864;
-
- h_GPIO_LCD12864.GPIO_Mode = GPIO_Mode_IPU;
-
- h_GPIO_LCD12864.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(LCD12864_DAT_Port,&h_GPIO_LCD12864);
- }
- void LCD12864_DAT_Port_Switch_OutPut(void) /*LCD12864 Dat Port 切换为输出*/
- {
- GPIO_InitTypeDef h_GPIO_LCD12864;
-
- h_GPIO_LCD12864.GPIO_Mode = GPIO_Mode_Out_PP;
-
- h_GPIO_LCD12864.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;
-
- h_GPIO_LCD12864.GPIO_Speed = GPIO_Speed_50MHz;
-
- GPIO_Init(LCD12864_DAT_Port,&h_GPIO_LCD12864);
- }
- uint8_t LCD12864_Check_Busy(void)
- {
- uint8_t outTime;
-
- LCD12864_RS_Low();
- LCD12864_RW_High();
- LCD12864_EN_High();
-
- LCD12864_DAT_Port_Switch_InPut();
-
- while((GPIO_ReadInputData(LCD12864_DAT_Port) & 0x80) == 0x80)
- {
- outTime++;
- if(outTime > 100)
- {
- LCD12864_EN_Low();
- return 1;
- }
- }
- LCD12864_EN_Low();
- return 0;
- }
- void LCD12864_Write_CMD(uint8_t cmd)
- {
- while(LCD12864_Check_Busy());
-
- LCD12864_RS_Low();
- LCD12864_RW_Low();
- LCD12864_EN_Low();
-
- LCD12864_DAT_Port_Switch_OutPut();
-
- GPIO_Write(LCD12864_DAT_Port,(uint16_t)cmd);
-
- LCD12864_EN_High();
-
- LCD12864_EN_Low();
-
- }
- void LCD12864_Write_DAT(uint8_t dat)
- {
- while(LCD12864_Check_Busy());
-
- LCD12864_RS_High();
-
- LCD12864_RW_Low();
-
- LCD12864_EN_Low();
-
- LCD12864_DAT_Port_Switch_OutPut();
-
- GPIO_Write(LCD12864_DAT_Port,(uint16_t)dat);
-
- LCD12864_EN_High();
-
- LCD12864_EN_Low();
- }
- /*=======================================================================================*/
- void LCD12864_GRAM_SetPoint /* 画点在LCD12864_GRAM里 */
- (
- uint8_t x, /* 点的坐标X 0~127 */
- uint8_t y, /* 点的坐标Y 0~63 */
- uint8_t color /* 点的颜色 0 or 1 */
- )
- {
- if( x > 127 ) return;
- if( y > 63 ) return;
- if(color == 1)
- {
- LCD12864_GRAM[y*16+(x/8)] |= 0x80 >> (x % 8);
- }
- else
- {
- LCD12864_GRAM[y*16+(x/8)] &= ~(0x80 >> (x % 8));
- }
- }
- void LCD12864_GRAM_Refresh(void) /* 用LCD12864_GRAM里的数据刷新LCD12864*/
- {
- uint16_t i,ii,count,count2;
-
- count = 0;
- count2 = 0;
-
- LCD12864_Write_CMD(0x34);
-
- for(ii=0;ii<32;ii++)
- {
- LCD12864_Write_CMD(0x80+ii);
- LCD12864_Write_CMD(0x80);
-
- for(i=0;i<8;i++)
- {
- LCD12864_Write_DAT(LCD12864_GRAM[count]);
- LCD12864_Write_DAT(LCD12864_GRAM[count+1]);
- count+=2;
- }
- for(i=8;i<16;i++)
- {
- LCD12864_Write_DAT(LCD12864_GRAM[count2+512]);
- LCD12864_Write_DAT(LCD12864_GRAM[count2+1+512]);
- count2+=2;
- }
- }
-
- LCD12864_Write_CMD(0x36);
- LCD12864_Write_CMD(0x30);
- }
- void LCD12864_Clear /* LCD12864清屏 */
- (
- uint8_t state /* LCD12864清屏的状态 0x00 ~ 0xFF */
- )
- {
- uint16_t i;
-
- for(i=0;i<1024;i++)
- {
- LCD12864_GRAM[i] = state;
- }
- LCD12864_GRAM_Refresh();
- }
- void LCD12864_Show8X16_Char /* 显示8*16像素大小的字符串 */
- (
- uint8_t x,
- uint8_t y,
- uint8_t chr
- )
- {
- uint8_t i,ii;
- uint8_t xx,yy;
- uint8_t chrr;
-
- chrr = chr - 32;
- xx = x;
- yy = y;
-
- for(i=0;i<16;i++)
- {
- for(ii=0;ii<8;ii++)
- {
- if( ( ( ASCII_8X16[chrr * 16 + i] >> ii ) & 0x01 ) == 1 )
- {
- LCD12864_GRAM_SetPoint(xx+ii,yy+i,1);
- }
- else
- {
- LCD12864_GRAM_SetPoint(xx+ii,yy+i,0);
- }
- }
- }
- }
- void LCD12864_GRAM_Show6X8_Char /* 显示6*8像素大小的字符串 */
- (
- uint8_t x,
- uint8_t y,
- uint8_t chr
- )
- {
- uint8_t i,ii;
-
- chr -= 32;
-
- for(i=0;i<6;i++)
- {
- for(ii=0;ii<8;ii++)
- {
- if( ( ( ASCII_6X6[chr*6+i] >> ii ) & 0x01 ) == 1)
- {
- LCD12864_GRAM_SetPoint(x+i,y+ii,1);
- }
- else
- {
- LCD12864_GRAM_SetPoint(x+i,y+ii,0);
- }
- }
- }
- }
- void LCD12864_Show8X16_Str /* 显示单个字符像素为8*16的字符串 自带刷新LCD12864*/
- (
- uint8_t x, /* 字符左上角起始坐标X */
- uint8_t y, /* 字符左上角起始坐标Y */
- uint8_t *str /* 要显示的字符串 */
- )
- {
- while(*str != '\0')
- {
- LCD12864_Show8X16_Char(x,y,*str);
- x += 8;
- str++;
- }
- LCD12864_GRAM_Refresh();
- }
- void LCD12864_Show6X8_Str /* 显示单个字符像素为6*8的字符串 自带刷新LCD12864*/
- (
- uint8_t x, /* 字符左上角起始坐标X */
- uint8_t y, /* 字符左上角起始坐标Y */
- uint8_t *str /* 要显示的字符串 */
- )
- {
- while(*str != '\0')
- {
- LCD12864_GRAM_Show6X8_Char(x,y,*str);
- x += 6;
- str++;
- }
- LCD12864_GRAM_Refresh();
- }
- /*=======================================================================================*/
复制代码
全部资料51hei下载地址:
代码资料.7z
(1.11 MB, 下载次数: 82)
|