锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2024-05-27 01:07:11

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=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:xxwhile(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 intvoid 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);#endifDisplay.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 
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章