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

发布者:RadiantBlossom最新更新时间:2015-07-10 来源: 51hei关键字:PIC16F877  单片机驱动  1602液晶屏  数字时钟 手机看文章 扫描二维码
随时随地手机看文章
4MHz时钟--PIC-KIT3。
main.c:
#include
#include
#include "Display.h"
#include "main.h"
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS); //设置877配置位
/************************定义显示字符*****************************************/
uchar Welcome_1[] = {" Welcome To Use "};
//uchar Welcome_2[] = {" DSK-27 System !"};
//uchar Power_On1[] = {" Power On "};
//uchar Auto_Mode1[] = {" Automatic Mode "};
uchar Time_Now[] = {"Time Now"};
 
uchar Time_Now_buf[6] = {0x00,0x00,0x00,0x00,0x00,0x00}; //定义Time Now显示缓冲单元
uchar hour=8; //定义小时分钟和秒变量
uchar min=12;
uchar sec=0;
uchar count_10ms; //定义10ms计数器
/*******************************************************************************
* 函 数 名: Delay_US(uint8 delay)
* 函数功能: 微秒延时--12us
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void Delay_US(uint delay)
{
for(;delay;)
{
delay--;
}
}
/*******************************************************************************
* 函 数 名: Delay_MS(uint16 delay)
* 函数功能: 毫秒延时--1ms
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void Delay_Ms(uint delay)
{
uint i;
for(i=0;i
Delay_US(83);
}
/*******************************************************************************
* 函 数 名: Delay_Sec(uint16 delay)
* 函数功能: 毫秒延时--1ms
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void Delay_Sec(uint delay)
{
uint i,j;
for(i=0;i<20*delay;i++)
{
for(j=0;j<4536;j++);
}
}
 
/*********定时器1初始化**********/
void Timer1_Init(void)
{
GIE = 1; //开总中断
PEIE = 1; //开外围功能模块中断
T1CKPS0=1;T1CKPS1=1; //分频比为1:8
TMR1CS = 0; //设置为定时功能
TMR1IE = 1; //使能TMRI中断
TMR1ON = 1; //启动定时器TMR1
TMR1H = 0xfb; //设置计数值高位,定时时间为10ms
TMR1L = 0x1e; //设置计数值高低位
}
 
/*******中断服务函数,用于产生秒、分钟和小时信号*******/
void interrupt ISR(void)
{
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H = 0xfb;
TMR1L = 0x1e;
count_10ms++;
 
if(count_10ms>=100)
{
count_10ms=0;
sec++;
 
if(sec==60)
{
sec=0;
min++;
 
if(min==60)
{
min=0;
hour++;
 
if(hour==24)
{
hour=0;min=0;sec=0; //若到24h,小时、分钟和秒单元清零
}
}
}
 
}
 
}
Time_Now_buf[0] = hour/10; //小时十位数据--转换并存储时钟数据
Time_Now_buf[1] = hour%10; //小时个位数据
Time_Now_buf[2] = min/10; //分钟十位数据
Time_Now_buf[3] = min%10; //分钟个位数据
Time_Now_buf[4] = sec/10; //秒钟十位数据
Time_Now_buf[5] = sec%10; //秒钟个位数据
}
 
/******************************************************************************
* 函 数 名: main()
* 函数功能: LCD显示字符
* 入口参数: 无
* 返 回: 无
*******************************************************************************/
void main()
{
uchar j=0;
 
 
Port_1602_Init();
INIT_1602();
TRISA3=0; //RA3和RA5已经初始化为普通IO口,此处只需设定方向,可以作为后续输出口使用
TRISA5=0;
 
Delay_Ms(200);
 
Display_1602_string(0,0,16,Welcome_1);//显示欢迎词
//Display_1602_string(0,1,16,Welcome_2);//显示欢迎词
 
Delay_Ms(100);
 
Timer1_Init();
Clear_Display();
Display_1602_string(4,0,8,Time_Now); //显示当前时间xx:xx:xx
 
while(1)
{
 
 
DispNum_XY_1602(4,1,Time_Now_buf[0]);
DispNum_XY_1602(5,1,Time_Now_buf[1]);
DispChar_XY_1602(6,1,':');
DispNum_XY_1602(7,1,Time_Now_buf[2]);
DispNum_XY_1602(8,1,Time_Now_buf[3]);
DispChar_XY_1602(9,1,':');
DispNum_XY_1602(10,1,Time_Now_buf[4]);
DispNum_XY_1602(11,1,Time_Now_buf[5]);
 
 
//Clear_Display();
//Display_1602_string(3,0,10,Power_On1); //显示Power On
//Delay_Ms(1000);
//Close_Disp();
//Display_1602_string(0,0,15,Auto_Mode1); //Automatic Mode
//Open_Disp();
 
//DispChar_XY_1602(15,1,'L');
//Delay_Ms(1000);
}
}
main.h:
#ifndef __MAIN_H__
#define __MAIN_H__
#define uchar unsigned char
#define uint unsigned int
 
void Delay_US(uint delay); //12微秒延时
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"
[page]
/*******************************************************************************
* 函 数 名: 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,uchar y,uchar gdata)
* 函数功能: 指定位置显示字符
* 入口参数: x-起始地址横坐标,y-起始地址纵坐标,gdata-要显示的字符
* 返 回: 无
*******************************************************************************/
/*-----------指定位置显示字符-------------*/
void DispChar_XY_1602(uchar x,uchar y,uchar gdata)
{
uchar gaddress;
if(!y)
{ gaddress=0x80+x; }
else
{ gaddress=0xc0+x; }
Write_1602_command(gaddress,1); //设定数据地址
Write_1602_data(gdata);
}
/*-----------指定位置显示数字-------------*/
void DispNum_XY_1602(uchar x,uchar y,uchar gdata)
{
uchar gaddress;
if(!y)
{ gaddress=0x80+x; }
else
{ gaddress=0xc0+x; }
Write_1602_command(gaddress,1); //设定数据地址
Write_1602_data(gdata+0x30);
}
/*-----------清屏-------------*/
void Clear_Display(void)
{
Write_1602_command(0x01,1);
Delay_Ms(5);
}
void Open_Disp(void)
{
Write_1602_command(0x0c,1);
}
void Close_Disp(void)
{
Write_1602_command(0x08,1);
}
/*-----------显示光标-------------*/
void Display_Cursor(void)
{
Write_1602_command(0x06,1); //显示光标右移位置、检测忙信号
Write_1602_command(0x0D,1); //显示功能开、无光标
}
/*-----------1602端口初始化-------------*/
void Port_1602_Init(void)
{
ADCON1 = 0x87;//设置PORTA为普通IO口
TRISA0 = 0;
TRISA1 = 0;
TRISA2 = 0;
TRISC = 0x00;//设置PORTC为输出
}
Display.h:
#ifndef __Display_H__
#define __Display_H__
#define uchar unsigned char
#define uint unsigned int
#define TESTBIT(a,b) ((a)&(1<<(b)))
#defineLCD_RSRA0
#defineLCD_RWRA1
#defineLCD_EN RA2
 
/************************声明函数*********************************************/
uchar Chk_1602_busy(void);
void Write_1602_command(uchar gcmd,uchar gvalue);
void Write_1602_data(uchar gdata);
void INIT_1602(void);
void Display_1602_string(uchar gadd_start,uchar gline,uchar glength,uchar *pdata);
void DispChar_XY_1602(uchar x,uchar y,uchar gdata);
void DispNum_XY_1602(uchar x,uchar y,uchar gdata);
void Clear_Display(void);
void Open_Disp(void);
void Close_Disp(void);
void Display_Cursor(void);
void Port_1602_Init(void);
#endif
关键字:PIC16F877  单片机驱动  1602液晶屏  数字时钟 引用地址:PIC16F877单片机驱动1602液晶屏的数字时钟程序

上一篇:PIC12F508单片机用按键控制LED灯C语言程序
下一篇:直流无刷电机控制器常见故障及排除方法

推荐阅读最新更新时间:2024-03-16 14:24

51单片机驱动步进电机__终极(完整版)
在这里介绍一下用51单片机驱动步进电机的方法。 这款步进电机的驱动电压12V,步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!! 该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。 采用51驱动ULN2003的方法进行驱动。 ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。 ;****************************************************************************** ;**********
[单片机]
51<font color='red'>单片机</font><font color='red'>驱动</font>步进电机__终极(完整版)
单片机系统中LED显示驱动电路的研究
近年来,单片机系统以其体积小、功能强、扩展灵活、使用方便等优点,逐渐渗透到各行业的工程实际应用中。而LED显示电路就像单片机系统的眼睛,实时地向人们传递着系统工作的各种状态信息和处理结果。因此,高效、方便的LED显示驱动电路是构成完善的单片机系统必不可少的元素。常用的LED显示驱动电路有并行译码方式、串行—并行转换方式、显示驱动接口芯片方式等。下面分别对这几种方式进行讨论,并给出显示驱动芯片MAX7219的应用实例。 并行译码显示方式 图 1为单片机89C2051输出显示的一个例子,4位BCD码数据从其P1.0~P1.3并行输出,经7段LED显示驱动电路CD4511译码后驱动LED 显示,这样只需向P1.0~P1.
[单片机]
<font color='red'>单片机</font>系统中LED显示<font color='red'>驱动</font>电路的研究
MAXQ2000微控制器软件I2C驱动
引言 I2C (内置集成电路)是一种2线接口,实现集成电路之间的双向通信。本应用笔记介绍maxqi2c库,它是MAXQ2000微控制器(µC)的软件I2C驱动。 maxqi2c库采用扩展C语言编写,由MAXQ的IAR嵌入式平台编译。它由两个文件组成:maxqi2c.h和maxqi2c.c。当这些文件包含在MAXQ2000固件工程时,使用µC的任意GPIO引脚,便可实现100kHz或者400kHz灵活的I2C通信。 MAXQ系列的微控制器具有高速、灵活的GPIO模块以及独立的I/O供电,适用于位拆裂等应用。 本应用笔记讨论的实例工程文件可以从Maxim Integrated Products网站下载。 配置maxqi2c库
[单片机]
MAXQ2000<font color='red'>微控制器</font>软件I2C<font color='red'>驱动</font>
单片机spi驱动SD卡
1. 单片机spi驱动SD卡 SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先
[单片机]
51单片机驱动OLED
51单片机源程序如下: #include reg52.h #include function.h #include word_lib.h #define X_WIDTH 128 //显示屏每行的显示点数 #define Y_WIDTH 64 //显示屏每列的显示点数 /************************************************************************************* 以下为设置控制OLED的端口,D0、D1、RST、DC依次对应OLED的CK、DI、RST、DC *******************************
[单片机]
基于PIC16F877单片机的电子秤包装机控制系统
    摘要: 基于单片微处理器PIC16F877研制成功了六嘴回转式电子秤水泥包装机的智能控制器,给出控制系统的硬件电路和软件的设计思想,并阐述了控制器的工作原理。该控制器设计的高精度是本系统的重要性能。中断嵌套是设计软件中的难点。本系统还成功实现了与上位机的通信。     关键词: PIC单片机 A/D转换 中断 通信 包装机系统可用于粉末东颗粒物料(如水泥、化肥、粮食等)的定时包装,自动化程度、计量精度要求越来越高。针对用户的要求,本系统设计了一种基于PIC16F877单片机控制的电子秤水泥包装机控制系统。 控制系统包括调零、调满、设定粗细流阈值、插袋、喂料、压袋、推包、破袋处理等控制功能。另外,对检
[传感技术]
LCD1602液晶显示模块的单片机驱动深入详解之硬件篇
(本文以HD44780主控芯片的LCD1602为蓝本进行描述,其中的截图也来自HD44780数据手册,用户可自行搜索其datasheet,有部分整理网上的,但绝对要比你看到的要深入得多) 一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不了解,不能随心所欲地对它进行驱动。经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉
[单片机]
LCD<font color='red'>1602</font>液晶显示模块的<font color='red'>单片机</font><font color='red'>驱动</font>深入详解之硬件篇
基于PIC微控制器的LED驱动控制电路设计
1 引言   led作为一种供电电压低,功耗小,寿命长,无辐射的新型光源,应用领域日益扩大,成为固态照明的关键光源。许多固态照明应用常采用智能控制电路系统来驱动LED以履行各种功能和任务,譬如为确保流经LED的电流不受供电电压波动的影响维持恒定,从而使LED的亮度无明显变化的亮度调节就是控制电路系统的任务之一。亮度调节涉及电流调整与调光控制。控制电路系统的另一任务是失效识别。因LED具有很强的温度相关性,大多失效又与温度有关,故控制电路系统应能履行温度补偿。此外,通过硬件选择以适应不同亮度LED组合的驱动也极必要。一块芯片上可集成全部必要硬件功能的PIC微控制器,由于价格低廉,时钟频率高达20MHz,功耗极低和工作温度范围宽
[电源管理]
基于PIC<font color='red'>微控制器</font>的LED<font color='red'>驱动</font>控制电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

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

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