ST7920自带中英文字库,要显示啥直接发送字符编码就行。
注意两个点:
- 清屏后加点延时,不然开头几个字符会乱
- 汉字和英文字符混用时,汉字的位置必须2字节对齐,否则乱码
#include "xs.h"
#include "stm32f10x.h"
#define STD_GPIO GPIOC
#define STD_PIn GPIO_Pin_4
#define CS_GPIO GPIOA
#define CS_PIn GPIO_Pin_7
#define CLK_GPIO GPIOC
#define CLK_PIn GPIO_Pin_5
#define RST_GPIO GPIOB
#define RST_PIn GPIO_Pin_0
#define LOGHT_GPIO GPIOB
#define LOGHT_PIn GPIO_Pin_1
#define STD_H STD_GPIO->BSRR = STD_PIn
#define STD_L STD_GPIO->BRR = STD_PIn
#define CLK_H CLK_GPIO->BSRR = CLK_PIn
#define CLK_L CLK_GPIO->BRR = CLK_PIn
#define CS_ENABLE CS_GPIO->BSRR = CS_PIn
static void board_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Pin = STD_PIn;
GPIO_Init(STD_GPIO, &GPIO_InitStructure);
CS_GPIO->BRR = CS_PIn;
GPIO_InitStructure.GPIO_Pin = CS_PIn;
GPIO_Init(CS_GPIO, &GPIO_InitStructure);
CLK_GPIO->BRR = CLK_PIn;
GPIO_InitStructure.GPIO_Pin = CLK_PIn;
GPIO_Init(CLK_GPIO, &GPIO_InitStructure);
LOGHT_GPIO->BSRR = LOGHT_PIn;//背光灯打开
GPIO_InitStructure.GPIO_Pin = LOGHT_PIn;
GPIO_Init(LOGHT_GPIO, &GPIO_InitStructure);
}
INIT_BOARD_EXPORT(board_init);
void Send_byte(unsigned char bbyte) //发送一个字节
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (bbyte & 0x80) //取出最高位
{
STD_H;
}
else
{
STD_L;
}
delay_us(5);
CLK_H;
delay_us(5);
CLK_L;
bbyte <<= 1; //左移
}
}
void Write_char(bool start, unsigned char ddata) //写指令或数据
{
unsigned char start_data, Hdata, Ldata;
if (start == 0)
start_data = 0xf8; //写指令
else
start_data = 0xfa; //写数据
Hdata = ddata & 0xf0; //取高四位
Ldata = (ddata << 4) & 0xf0; //取低四位
Send_byte(start_data); //发送起始信号
Send_byte(Hdata); //发送高四位
Send_byte(Ldata); //发送低四位
}
void Lcd_init(void) //初始化LCD
{
xs_sleep(10);
CS_ENABLE;
Write_char(0, 0x30); // 8 位介面,基本指令集
Write_char(0, 0x0c); //显示打开,光标关,反白关
Write_char(0, 0x01); //清屏,将DDRAM的地址计数器归零
}
/******************************************************************************/
void Disp_img(const unsigned char *img) //图形方式12864显示字模221 横向取膜
{
unsigned char i, j;
unsigned int k = 0;
Write_char(0, 0x36); //图形方式
for (i = 0; i < 32; i++)
{
Write_char(0, 0x80 + i);
Write_char(0, 0x80);
for (j = 0; j < 16; j++)
{
Write_char(1, img[k++]);
}
}
for (i = 0; i < 32; i++)
{
Write_char(0, 0x80 + i);
Write_char(0, 0x88);
for (j = 0; j < 16; j++)
{
Write_char(1, img[k++]);
}
}
}
/******************************************************************************/
void Clr_Scr(void) //清屏函数
{
Write_char(0, 0x01);
}
/******************************************************************************/
bool LCD_set_xy(unsigned char x, unsigned char y)
{ //设置LCD显示的起始位置,X为行,Y为列
unsigned char address;
switch (x)
{
case 0:
address = 0x80 + y;
break;
case 1:
address = 0x90 + y;
break;
case 2:
address = 0x88 + y;
break;
case 3:
address = 0x98 + y;
break;
default:
return false;
}
Write_char(0, address);
return true;
}
// X [0-3]为行 Y[0-7] 为列 对应汉字的宽度 总的能显示7个汉字
/******************************************************************************/
void LCD_Write_string(unsigned char X, unsigned char Y, const char *s)
{ // 中英文字符串显示函数
if (LCD_set_xy(X, Y) == false)
return;
while (*s)
{
Write_char(1, *s);
s++;
}
}
void lcd_test()
{
Lcd_init();
Clr_Scr(); //清屏后适当延时
xs_sleep(10);
LCD_Write_string(0, 0, "LCD 显示测试演示"); //
LCD_Write_string(1, 0, "1234567890:"); //
LCD_Write_string(2, 0, "abcdefghijklmn:"); //
LCD_Write_string(3, 0, ",.*/!@#$%^&*"); //
}
INIT_APP_EXPORT(lcd_test);