微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PIC16F877单片机驱动1602液晶屏的数字时钟程序

PIC16F877单片机驱动1602液晶屏的数字时钟程序

时间:11-29 来源:互联网 点击:

微秒延时

void Delay_Ms(uint delay); //1毫秒延时

void Delay_Sec(uint delay); //1秒延时

void Timer1_Init(void);

void interrupt ISR(void);

#endif

Display.c:

#include

#include "Display.h"

#include "main.h"

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

* 函 数 名: uchar Chk_1602_busy(void)

* 函数功能: 读液晶忙通道数据

* 入口参数: 无

* 返 回: 无

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

uchar Chk_1602_busy(void)

{

uint gR_data;

uint gwait_time=0xff; //设置忙超时数

LCD_RS=0; //表示状态

LCD_RW=1; //选择读

LCD_EN=1;

TRISC = 0xFF; //接收口设为输入口

Delay_US(30);

gR_data=PORTC;

while(TESTBIT(gR_data,7)) //表示busy

{

--gwait_time;

if(!gwait_time)

{ LCD_EN=0;TRISC = 0x00; return 0; }

}

LCD_EN=0;

TRISC = 0x00; //恢复为输出口

return 1;

}

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

* 函 数 名: void Write_1602_command(uchar gcmd,uchar gvalue)

* 函数功能: 写指令

* 入口参数: gcmd--指令 gvalue--是否查忙

* 返 回: 无

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

void Write_1602_command(uchar gcmd,uchar gvalue)

{

if(gvalue) //写命令时大部分情况下是在LCD空闲模式下写

{

if(Chk_1602_busy())

{

LCD_RS=0; //选择指令

LCD_RW=0; //选择写

PORTC=gcmd; //赋指令

LCD_EN=1; //使能

Delay_US(30);

LCD_EN=0;

}

}

else

{

LCD_RS=0; //选择指令

LCD_RW=0; //选择写

PORTC=gcmd; //赋指令

LCD_EN=1; //使能

Delay_US(30);

LCD_EN=0;

}

}

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

* 函 数 名: void Write_1602_data(uchar gdata)

* 函数功能: 写数据

* 入口参数: gdata--数据

* 返 回: 无

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

/*----------- 写数据 -------------*/

void Write_1602_data(uchar gdata)

{

if(Chk_1602_busy()) //写数据必须是在LCD空闲模式下才能写

{

LCD_RS=1; //选择数据

LCD_RW=0; //选择写

PORTC=gdata;

LCD_EN=1; //使能

Delay_US(30);

LCD_EN=0;

Delay_US(10);

}

}

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

* 函 数 名: void INIT_1602(void)

* 函数功能: 初始化1602LCD

* 入口参数: 无

* 返 回: 无

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

/*-----------1602初始化函数-------------*/

void INIT_1602(void)

{

Delay_Ms(15);

Write_1602_command(0x38,0); //设置16X2显示,5X7点阵,8位数据传送,不检测忙信号

Delay_Ms(5);

Write_1602_command(0x38,0);

Delay_Ms(5);

Write_1602_command(0x38,0); //设置16X2显示,5X7点阵,8位数据传送,不检测忙信号

Write_1602_command(0x38,1); //设置16X2显示,5X7点阵,8位数据传送,检测忙信号

Write_1602_command(0x08,1); //关闭显示、无光标、检测忙信号

Write_1602_command(0x01,1); //清屏、光标归位、AC=0、检测忙信号

Write_1602_command(0x06,1); //显示光标右移位置、检测忙信号

Write_1602_command(0x0C,1); //显示功能开、无光标

}

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

* 函 数 名: void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)

* 函数功能: 显示字符串

* 入口参数: gadd_start-列号,uchar gline-行号,glength-数据长度,pdata-数组元素

* 返 回: 无

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

/*-----------显示字符串-------------*/

// 列号 行号 数据长度 数组元素

void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata)

{

uchar gaddress;

uchar *pdat;

uchar gcount=0;

if(!gline) //第0行

{ gaddress=0x80+gadd_start; } //地址对应

else

{ gaddress=0xc0+gadd_start; } //第一行

for(;gcount{

Write_1602_command(gaddress,1); //设定数据地址

Write_1602_data(*pdata); //取设定地址里的数据

gaddress++;

pdata++;

}

}

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

* 函 数 名: void Display_1602(uchar x,u

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top