51单片机:LCD1602的驱动程序
网络 2022-01-27

#include

#include "./delay/delay.h"

#define LCDPORT P0

#define LCD_WRITE_DATA 1

#define LCD_WRITE_COM 0

sbit RS = P2^4;

sbit RW = P2^5;

sbit E = P2^6;

unsigned char flag = 1;

unsigned char shi = 23, fen = 59, miao = 50;

void lcd1602_write(unsigned char byte, unsigned char flag)

{

if(flag)

{

RS = 1; //选择输入的数据为数据

}

else

{

RS = 0; //选择输入的数据为命令

}

RW = 0; //写

E = 1; //选中lcd

LCDPORT = byte;

delay_ms(5);

E = 0; //失能LCD 高电平有效

}

void lcd_init()

{

delay_ms(15);

lcd1602_write(0x38,LCD_WRITE_COM); //设置8位数据接口,两行指令,5*8点阵字符

delay_ms(5);

lcd1602_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd1602_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd1602_write(0x38,LCD_WRITE_COM);

delay_ms(5);

lcd1602_write(0x08,LCD_WRITE_COM); //关闭显示,关闭光标和闪烁

delay_ms(5);

lcd1602_write(0x01,LCD_WRITE_COM); //清屏

delay_ms(5);

lcd1602_write(0x06,LCD_WRITE_COM); //设置指针方式,画面不平移

delay_ms(5);

lcd1602_write(0x0c,LCD_WRITE_COM); //设置指针方式,画面不平移

delay_ms(5);

}

void lcd_dis_char(unsigned char x, unsigned char y, unsigned char *s)

{

if(0 == x)

{

lcd1602_write(y + 0x80,LCD_WRITE_COM);

}

else if(1 == x)

{

lcd1602_write(y + 0xc0,LCD_WRITE_COM);

}

while(*s)

{

lcd1602_write(*s, LCD_WRITE_DATA);

s++;

}

}

void time0_init()

{

EA = 1;

TMOD |= 0x01;

TH0 = (65536 - 20000) / 255;

TL0 = (65536 - 20000) % 255;

ET0 = 1;

TR0 = 1;

}

void time0_isr() interrupt 1

{

static unsigned char i = 0;

TH0 = (65536 - 20000) / 255;

TL0 = (65536 - 20000) % 255;

i++;

if(50 == i)

{

i = 0;

miao++;

if(60 == miao)

{

miao = 0;

fen++;

if(60 == fen)

{

fen = 0;

shi++;

if(24 == shi)

{

shi = 0;

}

}

}

}

}

void lcd_diaplay_time() //时间的显示函数

{

lcd1602_write(0x80 + 7, LCD_WRITE_COM);

lcd1602_write((shi / 10) + 0x30,LCD_WRITE_DATA);

lcd1602_write((shi % 10) + 0x30,LCD_WRITE_DATA);

lcd1602_write(':',LCD_WRITE_DATA);

lcd1602_write((fen / 10) + 0x30,LCD_WRITE_DATA);

lcd1602_write((fen % 10) + 0x30,LCD_WRITE_DATA);

lcd1602_write(':',LCD_WRITE_DATA);

lcd1602_write((miao / 10) + 0x30,LCD_WRITE_DATA);

lcd1602_write((miao % 10) + 0x30,LCD_WRITE_DATA);

}

void lcd_dis_hex() //显示字符或数字

{

unsigned char temp = 0x2b;

lcd1602_write(0x80,LCD_WRITE_COM);

lcd1602_write((temp / 16) + 0x30,LCD_WRITE_DATA);

lcd1602_write((temp % 16) + 0x37,LCD_WRITE_DATA);

}

void main()

{

time0_init();

lcd_init();

lcd_dis_hex();

lcd_dis_char(0,2,"time:");

while(1)

{

lcd_diaplay_time();

}

}

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 51单片机三种模拟串口的方法

    随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,

    昨天
  • 指令集与操作系统的关系

    1、首先讨论各种单片机与操作系统的关系说到单片机,大家第一时间想到的应该是51单片机,对吧。不错,更高级一点的AVR,把他称为单片机,我们也还觉得可以接受。那么

    昨天
  • 8051指令系统的7种寻址方式

    寻址方式:寻址就是寻找操作数的地址。绝大多数指令执行时都需要操作数,因此就存在如何确定操作数地址的问题。所谓寻址方式就是通过什么途径获取操作数的方式。根据指令操

    昨天
  • 在51系列中data,idata,xdata,pdata的区别

    从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata

    昨天
  • stm32的JTAG模式和SWD模式

    一、JTAG模式这种模式一般有10pin的、14pin的和20pin的,尽管引脚数和引脚的排列顺序不同,但是其中有一些引脚是一样的。值得注意的是,不同的IC公司

    昨天
  • 计数器如何用作定时器?计数器溢出又是什么?

    计数器从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。那么单片机中的

    昨天
  • AVR自编程是如何实现的?

    BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要

    昨天
  • STM32 的14组过滤器

    STM32普通型芯片的CAN有14组过滤器组(互联型有28组过滤器组),用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和C

    昨天
  • ARM中关于cmp的详细用法

    一、关于cmp的详细用法假设现在AX寄存器中的数是0002H,BX寄存器中的数是0003H。执行的指令是:CMPAX,BX执行这条指令时,先做用AX中的数减去B

    前天
  • 基于单片机的扫频激振技术

    振弦式传感器是目前应力、应变测量中较为先进的传感器之一。振弦式传感器的输出是频率信号,信号处理过程中无须进行A/D及D/A转换,因此,抗干扰能力强,信号传输距离

    前天
  • 基于MSI的N进制计数器设计

      1绪论  计数器是数字逻辑系统中的基本部件,它是数字系统中用得最多的时序逻辑电路,其主要功能就是用计数器的不同状态来记忆输入脉冲的个数。除此以外还具有定时、

    前天
  • 一种基于嵌入式实时操作系统和ARM的新型数据采集装置

      0引言  数据采集技术是信息科学的一个重要分支。随着计算机科学技术的飞速发展和普及,数据采集技术己经渗透到雷达、通信、水声、遥感、地质勘探、振动工程、语音处

    前天
下载排行榜
更多
EE直播间
更多
广告