PIC16F877单片机驱动1602液晶屏的数字时钟程序
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
PIC16F877单片机驱动1602液晶屏数字时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)