新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PIC16F877单片机驱动1602液晶屏的数字时钟程序

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

作者: 时间:2016-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微秒延时
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"

上一页 1 2 下一页

评论


技术专区

关闭
站长统计
×

TI直播中...
汽车电气化背景下的TI音频解决方案和技术线上研讨会直播中,早鸟报名礼、myTI 专属礼、活动参与礼等着您(已经报名用户可以凭报名邮箱直接登录),速入>>