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

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

时间:11-29 来源:互联网 点击:
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

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

网站地图

Top