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

发布者:FreeSpirit123最新更新时间:2022-01-26 来源: eefocus关键字:51单片机  LCD12864  驱动程序  ST7920 手机看文章 扫描二维码
随时随地手机看文章

在这里插入图片描述

在这里插入图片描述


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

}


关键字:51单片机  LCD12864  驱动程序  ST7920 引用地址:51单片机 LCD12864 驱动程序 C语言 ST7920

上一篇:51单片机 Proteus仿真 8X8点阵英文流水显示 汉字流水显示
下一篇:单片机 步进电机 驱动程序 ULN2003 28BYJ-48 5线4相电机

推荐阅读最新更新时间:2024-11-10 11:29

基于C51单片机的手动计数器设计电路图
利用 AT89S51 单片机来制作一个手动计数器,在 AT89S51 单片机的 P3.7 管脚接一个轻触开关,作为手动计数的按钮,用单片机的 P2.0 - P2.7 接一个共阴数码管,作为00-99计数的个位数显示,用单片机的 P0.0 - P0.7 接一个共阴数码管,作为 00 - 99 计数的十位数显示;硬件电路图如图所示。   1 . 把 “ 单片机系统 ” 区域中的 P0.0/AD0 - P0.7/AD7 端口用 8 芯排线连接到“ 四路静态数码显示模块 ” 区域中的任一个 a - h 端口上;要求: P0.0/A D0对应着 a , P0.1/AD1 对应着 b , …… , P0.7/AD7 对应着 h 。   2
[模拟电子]
基于C<font color='red'>51单片机</font>的手动计数器设计电路图
8051单片机的复位状态
  复位就是指通过某种手段使单片机内部某些资源一种固定的初始状态,以确保单片机每次复位后都能在某一固定的环境中从某一固定的入口地址处开始运行,8051复位后片内各特殊功能寄存器状态如下:   PC内容为0000H,使单片机从起始地址0000H开始执行程序。所以单片机运行出错或进入死循环,可以按复位键重启。   ACC内容为00H。   PSW内容为00H,意义为复位后,上次运算没有产生进位或借位,也没有产生半进位或半借位,工作寄存器组R0—R7定位在内部RAM的00-07单元,上次运算没有溢出,累加器中“1”的个数为偶数。   SP内容为07H,意义为堆栈指针SP指向内部数据存储器的07单元,即堆栈从08单元开始。   DPT
[单片机]
80<font color='red'>51单片机</font>的复位状态
51单片机gy906测温,语音播报,eepromc存储
这是去年我做的一个小设计,主要是用来测量体温。今年由于疫情影响情况特殊,就想分享一下这个设计,但是某宝找材料才发现一个问题,都涨价了,有点难受。之前也在51黑下过资料,这次把资料发上来大家一起分享学习。实物图: 没有涉及PCB,用的洞洞板。第一次发帖。东西做出来有点丑,大家莫见怪。 主要功能: 通过按键控制测温,按一次检测一次。自动存储三次数据,可t通过按键切换显示。并可通过OLED显示和语音播报温度。 系统供电采用,USB供电,也可以通过干电池,或者锂电池。 主要使用元器件。 主控用的是51单片机,温度传感器用的是GY906,显示用的是0.96寸0LED,通讯方式采用IIC,语音播报用的现成的模块。 语音播报采用串口通
[单片机]
<font color='red'>51单片机</font>gy906测温,语音播报,eepromc存储
atmega8l直接驱动笔段式lcd驱动程序
#include include.h uchar lcdtab ={{{0x07,0x01,0x03},{0x04,0x00,0x02},{0x06,0x03,0x01}, {0x06,0x02,0x03},{0x05,0x02,0x02},{0x03,0x02,0x03},{0x03,0x03,0x03},{0x06,0x00,0x02}, {0x07,0x03,0x03},{0x07,0x02,0x03}}, {{0x18,0x14,0x0c},{0x10,0x10,0x00},{0x18,0x08,0x0c}, {0x18,0x18,0x08},{0x10,0x1c,0x00},{0x08,0x1c,0x08},{0x08
[单片机]
51单片机之数码管静态显示
在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示,我们就拿带小数点的八段数码管来说 ,其实我们没必要说对数码管很陌生,因为数码管无非就是八块发光二极管集成在了一起,另外数码管有共阴极和共阳极数码管之分,说起共阴,共阳,大家可能会有所陌生,这里我们简单介绍一下: 共阴极数码管:将八只发光二极管的负极通过一根总线连接在了一起 , 然后每只二极管的正极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入高电平时,二极管点亮。(换句话说,也就是说想让哪一只二极管点亮,就给哪只二极管高电平。下
[单片机]
<font color='red'>51单片机</font>之数码管静态显示
手把手教学51单片机 | 第一课——点亮发光二极管
1、熟练掌握二进制转换成十六进制 四位二进制对应十六进制的1位。 2、二极管 二极管是具有单向导电性,所以给二极管的正极上高电平,负极上低电平,就能点亮二极管,流过二极管的电流为3mA-10mA,电压1.7V,所以需要(5V-1.7V)/3mA≈1K的限流电阻防止二极管被烧坏。 3、点亮发光二极管 51单片机所有的I/O口上电之后默认都是高电平,根据单向导电性,将连接芯片的P1端口上低电平后就能点亮二极管。(可忽略中间的74HC573锁存器,感兴趣参考我发的第六课中最后的代码) #include reg52.h //头文件 sbit D1=P1^0;//定义 void main() { //点亮第1盏灯
[单片机]
51单片机程序——按键控制单个数码管显示
#include reg52.h unsigned char code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9 void main (void) { while(1) //主循环 { P1 = 0x01; //打开数码管的位选 P3 = 0xff; switch(P3) //P3口作为独立按键输入端,检测端口电平并做如下判断
[单片机]
51单片机4位数码管电子钟源程序
/*************************************************************************** 标题: 定时器中断 24小时时钟程序 效果: 数码管显示24小时制时钟(具有调时功能) 说明: 使用12M晶振 ,key1=P3^7; key2=P3^6; key3=P3^5;key4=P3^4; 数码管位选P1.0~P1.3 ,段选P0 ******************************************************************************/ #include reg52.h #de
[单片机]

推荐帖子

评估板快速测试-基于TI Sitara Cortex-A9
前言本指导文档适用开发环境:Windows开发环境:Windows764bit、Windows1064bitLinux开发环境:Ubuntu14.04.364bit虚拟机:VMware14.1.1U-Boot:U-Boot-2017.01Kernel:Linux-4.9.65、Linux-RT-4.9.65LinuxProcessorSDK:ti-processor-sdk-linux-rt-am437x-evm-04.03.00.05进行
Tronlong小分队 ARM技术
RAM问题
某一RAM芯片,其存储容量为128K*16位,除电源盒接地端外,该芯片引出线的最少数目是()。A.33B.35C.25D.26答案:B解析:128K*16的存储器,数据线为16位,按字寻址的范围是2^17,按字节寻址的范围是2^19,地址线为19位。所以芯片引出线的最少数目是16+19=35。答案中的按字寻址和按字节寻址这点没看懂,怎么就出来2^19了呢?望指点一下RAM问题是啊,如果能按BYTE寻址,那么数据线应该是8位才对。可人家是16位宽,16(位宽)+17(地址线宽)
与非门 嵌入式系统
(已解决)G2系列用32K晶体做电子钟,遇到一些问题。
G2系列单片机软件怎么设置选择外部32K晶体?3L有答案,和我有同样问题的看看。以下内容是我从头文件里看到的。#defineDIVA0(0x10)/*ACLKDivider0*/#defineDIVA1(0x20)/*ACLKDivider1*/#defineXTS(0x40)/*LFXTCLK0:LowFreq./1:HighFreq.*/#defineXT2OFF(
huang91 微控制器 MCU
求助!关于C6711的CCS配置问题
小弟用TI的C6711DSK,用的是3.3的CCS,却不知道怎么用它的并口连PC进行仿真听说需要从setup里面import,找到dsk6711epp/spp278/378,我试了试好像都不行,哪位好心人帮帮忙啊~求助!关于C6711的CCS配置问题有一长段时间没搞DSP了,我当时是用2.2版本的。建立prj之前的,是要配置一下setup的。不过我忘了具体配置什么内容了。。。
wzer19 嵌入式系统
新人报道。我用28027做项目
单位要用28027做电力线载波,可我英文不好,看了2个星期了,一点头绪都没有,那位能帮一下忙。工作3年了,有单片机基础,前后用过5种单片机了(都还算是主流的牌子),要是学单片机的话,就是全英文的文档我也能对付,毕竟就是那些固定的寄存器之类,架构也大同小异,猜也能猜出来讲的是什么。但DSP感觉完全不是一个概念,文档看了半天总觉的好多东西没有讲,程序也和单片机不一样。我用的是代理商给的北京瑞泰的28027开发板和仿真器,给的LED例程里,工程下居然有23个H文件,6个C文件和2个ASM,功能只是
aerodancing 微控制器 MCU
dspic33用什么C编译器
请问高手,dspic33用什么C编译器?是和dspic30一样吗?谢谢!dspic33用什么C编译器以前用过Microchip自家的MPLABC30编译器,可以上其官网看看记得是用MAPLABXIDE(编辑器)+C30(编译器),或者去官网搜索芯片型号,会有需要的信息
chenbingjy Microchip MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved