⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.c

📁 st Cotex M3 的一个用SPI驱动的12864液晶的程序
💻 C
字号:
#include "LCD12864.h"
#include "SPI1.h"

#define SERIAL_WDATA    0XFA            /* 写入到资料寄存器DR */
#define SERIAL_WCMD     0XF8            /* 写入到指令寄存器IR */
#define SERIAL_RBF      0XFC            /* 读忙标志BF和AC */
#define SERIAL_RDATA    0XFE            /* 读资料寄存器DR */

void _delay_us(unsigned int x)
{
  unsigned int t = 50;
  while(x--)
  {
    t = 50;     // 随便写的一个值,时间可能不准确
    while(t--)
      asm("nop");
  }
}

void _delay_ms(unsigned int x)
{
  while(x--)
    _delay_us(1000);
}

void LCDSerial_Send(unsigned char x)
{
  SPI1_ReadWrite_Byte(x);
}

void LCD12864_Busy_Wait(void)
{
  _delay_ms(1);       
}

void LCD12864_WriteCMD(unsigned char cmd)
{
        LCD12864_Busy_Wait();

        LCDSerial_Send(SERIAL_WCMD);                            // 写入到IR
        LCDSerial_Send(cmd&0xf0);
        LCDSerial_Send(cmd<<4);
}

void LCD12864_WriteData(unsigned char wdata)
{
        LCD12864_Busy_Wait();

        LCDSerial_Send(SERIAL_WDATA);                            // 写入到资料寄存器
        LCDSerial_Send(wdata&0xf0);
        LCDSerial_Send(wdata<<4);
}

void LCD12864_Init(void)
{
        //LCD_PORT |= (1<<LCD_SID)|(1<<LCD_SCLK);
        //LCD_DDR |= (1<<LCD_SID)|(1<<LCD_SCLK);

        _delay_ms(100);
        LCD12864_WriteCMD(0x30);                                // 设定基本指令集
        _delay_ms(1);
        LCD12864_WriteCMD(0x30);
        _delay_us(40);
        LCD12864_WriteCMD(0x0c);                                // 显示开
        _delay_us(100);
        LCD12864_WriteCMD(0x06);                                // AC+1
        _delay_us(100);
        LCD12864_WriteCMD(0x80);                                // 设定起始地址
        _delay_us(100);
        LCD12864_WriteCMD(0x01);                                // 清屏
        _delay_ms(40);

}

/*  x:  第几列    y: 第几行 */
void LCD12864_Set_XY(unsigned char x, unsigned char y)
{
        unsigned char address;
        switch(y){
                case 0:
                        address = 0x80 + x;
                        break;
                case 1:
                        address = 0x90 + x;
                        break;
                case 2:
                        address = 0x88 + x;
                        break;
                case 3:
                        address = 0x98 + x;
                        break;
                default:
                        address = 0x80 + x;
                        break;
        }

        LCD12864_WriteCMD(address);

        return;	
}

void LCD12864_PutString(unsigned char x, unsigned char y, char *str)
{
        LCD12864_Set_XY(x,y);
        while(*str){
                LCD12864_WriteData(*str++);
                _delay_ms(1);
        }
        return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -