单片机
返回首页

51单片机 LCD12864 驱动程序 C语言 ST7920

2022-01-04 来源:eefocus

在这里插入图片描述

在这里插入图片描述


main.c


#include 'reg52.h'

#include

#include

#include

#include


#include 'LCD12864.h'



void main( void )

{

Ini_Lcd();

Lcd_WriteStr(0,0,'QQ137712826');

while ( 1 )

{

}

}


lcd12864.h



#include

#include


sbit RS = P2 ^ 0;

sbit RW = P2 ^ 1;

sbit EN = P2 ^ 2;

sbit PSB = P2 ^ 3;

sbit RST = P2 ^ 4;



#define _NOP() _nop_()


/* 12864液晶控制管脚 */

#define RS_CLR RS = 0             /* RS置低 */

#define RS_SET RS = 1             /* RS置高 */


#define RW_CLR RW = 0             /* RW置低 */

#define RW_SET RW = 1             /* RW置高 */


#define EN_CLR EN = 0             /* E置低 */

#define EN_SET EN = 1             /* E置高 */


#define PSB_CLR PSB = 0             /* PSB置低,串口方式 */

#define PSB_SET PSB = 1             /* PSB置高,并口方式 */


#define RST_CLR RST = 0             /* RST置低,会复位 */

#define RST_SET RST = 1             /* RST置高 */



/* 12864液晶的数据口 */

#define DataPort P0              /* 数据口 */

#define LcdData P0


void Delay_1ms( void );



void Delay_Nms( unsigned int n );



void LCD_write_com( unsigned char cmd );



void LCD_write_data( unsigned char dat );



void Ini_Lcd( void );



void Lcd_WriteStr( unsigned char x, unsigned char y, unsigned char *Str );



unsigned char Lcd_CheckBusy( void );



unsigned char Lcd_ReadData( void );


void delay_us( unsigned int t )                 /* @11.0592MHz */

{


while ( t-- )

{

_nop_();

    _nop_();

    _nop_();

}

}


void delay_ms( unsigned int t )                 /* @11.0592MHz */

{

unsigned char i, j;

while ( t-- )

{

_nop_();

_nop_();

_nop_();

i = 11;

j = 190;

do

{

while ( --j )

;

}

while ( --i );

}

}



void Delay_1ms( void )

{

delay_ms( 1 );

}



/*

 * ***********************************************************************

 * 显示屏命令写入函数

 * ***********************************************************************

 */

void LCD_write_com( unsigned char cmd )

{

while ( Lcd_CheckBusy() )

;


RS_CLR;

RW_CLR;

EN_SET;

DataPort = cmd;


EN_CLR;

}



/*

 * ***********************************************************************

 * 显示屏数据写入函数

 * ***********************************************************************

 */

void LCD_write_data( unsigned char dat )

{

while ( Lcd_CheckBusy() )

;


RS_SET;

RW_CLR;

EN_SET;

DataPort = dat;

/* delay_us( 1 ); */

EN_CLR;

}



/*

 * *************************************************************************

 *              初始化IO口子程序

 * *************************************************************************

 */

void Port_init_12864( void )

{

delay_ms( 50 );

PSB_SET; /* 液晶并口方式 */

RST_CLR;

delay_ms( 100 );

RST_SET;

}



/*******************************************

 * 函数名称:Ini_Lcd

 * 功    能:初始化液晶模块

 * 参    数:无

 * 返回值  :无

 ********************************************/

void Ini_Lcd( void )

{

Port_init_12864();      /* 液晶控制端口设置为输出 */


LCD_write_com( 0x30 );  /* 基本指令集 */

Delay_1ms();

LCD_write_com( 0x02 );  /* 地址归位 */

Delay_1ms();

LCD_write_com( 0x0c );  /* 整体显示打开,游标关闭 */

Delay_1ms();

LCD_write_com( 0x01 );  /* 清除显示 */

Delay_1ms();

LCD_write_com( 0x06 );  /* 游标右移 */

Delay_1ms();

LCD_write_com( 0x80 );  /* 设定显示的起始地址 */

}



/*

 * ***********************************************************************

 * 显示屏制定起始位置写入字符串

 * ***********************************************************************

 */

void Lcd_WriteStr( unsigned char x, unsigned char y, unsigned char *Str )

{

if ( (y > 3) || (x > 7) )

return;                         /* 超出范围直接不写 */

if ( y == 0 )

{

LCD_write_com( 0x80 + x );      /* 第一行显示 */

}

if ( y == 1 )

{

LCD_write_com( 0x90 + x );      /* 第二行显示 */

}

if ( y == 2 )

{

LCD_write_com( 0x88 + x );      /* 第三行显示 */

}

if ( y == 3 )

{

LCD_write_com( 0x98 + x );      /* 第四行显示 */

}

delay_us( 1 );

while ( *Str > 0 )

{

LCD_write_data( *Str );

Str++;

delay_us( 1 );

}

}



unsigned char Lcd_CheckBusy( void )

{

unsigned char Busy;



RS_CLR;

RW_SET;

EN_SET;

delay_us( 5 );

Busy = LcdData & 0x80;

EN_CLR;


return(Busy);

}



/***********************************

 * 从LCD中读出数据

 ************************************/

unsigned char Lcd_ReadData( void )

{

unsigned char Temp;

while ( Lcd_CheckBusy() )

;

P0 = 0XFF;

RS_SET;

RW_SET;

EN_SET;

delay_us( 10 );

Temp = LcdData;

EN_CLR;

return(Temp);

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章