2011-12-28 LCD1602数字钟
程序:
本程序由1602.c、1602.h 、main.c 三部分组成,分别如下:
/***********************************************************************
程序名称:T0定时器中断做数字LCD1602显示
编译环境:keil-uvsion4
操作系统:windows-xp
程序功能:T0定时器中断做数字钟1602显示
设计者: 岳文东
时间: 2011年11月16日
操作说明:
按P3.2键进入时间调整状态,按P3.3进行加法调整,按P3.4进行减法调整
当P3.2键累积按键到1次时,按P3.3键进行对时钟秒加,按P3.4键进行对时钟秒减
当P3.2键累积按键到2次时,按P3.3键进行对时钟分加,按P3.4键进行对时钟分减
当P3.2键累积按键到3次时,按P3.3键进行对时钟时加,按P3.4键进行对时钟时减
当P3.2键累积按键到4次时,退出时间调整,进行正常计数
*************************************************************************/
/************************************* 1602.h *****************************************/
#include<at89x51.h>
#ifndef __1602_H__
#define __1602_H__
#define uchar unsigned char
#define uint unsigned int
sbit LcdRs = P2^4;
sbit LcdRw = P2^5; //P2.1=1时写数据,P2.1=0时写地址
sbit LcdEn = P2^6; //P2.2=1时允许写数据
void init(void);//初始化函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在屏幕某个位置上显示一个字符,X(0--16),Y(1--2)
void L1602_string(uchar hang,uchar lie,uchar *p);
void delay(uint z);
#endif
/************************************** 1602.c **********************************************/
#include "1602.h"
//*****************延时函数****************
//*****************************************
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
//********************************
//********写指令函数************
void write_com(uchar com) //写指令
{
LcdRs=0;
// LcdRw=0;
P0=com; //指令码
delay(5);
LcdEn=1;
delay(5);
LcdEn=0;
}
//*******************************
//********写数据函数*************
void write_data(uchar date) //写数据
{
LcdRs=1;
P0=date;
delay(5);
LcdEn=1;
delay(5);
LcdEn=0;
}
//****************初始化函数***************
void init(void) //初始化
{
LcdRw=0;
LcdEn=0;
delay(1);
write_com(0x38);//显示模式设置
write_com(0x0c);//光标设置,0x0c时不显示光标,0x0e时显示光标,0x0f时显示光标且闪烁
write_com(0x06);//设置光标的自动位置
write_com(0x01);//清屏
write_com(0x80+0x00);//定光标的位置 0x80+0x10
}
//*******显示一个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
write_com(address);
write_data(dat);
}
//*******显示字符串函数*********
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
write_com(a);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/********************************* main.c *****************************************/
#include"1602.h"
char table[10]={'0','1','2','3','4','5','6','7','8','9'};
sbit k1=P3^1;
sbit k2=P3^2;
sbit k3=P3^3;
int s,m,h;
uchar num,flag;
void t0_init(void)
{
flag=0;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
}
void main(void)
{
t0_init();
init();
TR0=1;
while(1)
{
if(k1==0)
{
delay(50);
if(k1==0)
{
flag++;
if(flag==4) flag=0;
}while(k1==0);
}
switch(flag)
{
case 1:
TR0=0;
if(k2==0)
{
delay(50);
if(k2==0)
{
s++;
if(s>=60) s=0;
}
}while(k2==0);
if(k3==0)
{
delay(50);
if(k3==0)
{
s--;
if(s<=0) s=59;
}
}while(k3==0);
break;
case 2:
TR0=0;
if(k2==0)
{
delay(50);
if(k2==0)
{
m++;
if(m>=60) m=0;
}
}while(k2==0);
if(k3==0)
{
delay(50);
if(k3==0)
{
m--;
if(m<=0) m=59;
}
}while(k3==0);
break;
case 3:
TR0=0;
if(k2==0)
{
delay(50);
if(k2==0)
{
h++;
if(h>=23) h=0;
}
}while(k2==0);
if(k3==0)
{
delay(50);
if(k3==0)
{
h--;
if(h<=0) h=23;
}
}while(k3==0);
break;
default:
TR0=1;
break;
}
LCD_disp_char(3,1,table[h/10]);
LCD_disp_char(4,1,table[h%10]);
LCD_disp_char(5,1,'-');
LCD_disp_char(6,1,table[m/10]);
LCD_disp_char(7,1,table[m%10]);
LCD_disp_char(8,1,'-');
LCD_disp_char(9,1,table[s/10]);
LCD_disp_char(10,1,table[s%10]);
L1602_string(2,1,"design by YueWd");
// display(s,m,h);
}
}
void timer0() interrupt 1 using 0
{
num++;
if(num==20)
{
num=0;
s++;
if(s>=60)
{
s=0;
m++;
if(m>=60)
{
m=0;
h++;
if(h>=24)
{
h=0;
}
}
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}