LCD12864(ST7920芯片)

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

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值