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