/*1602显示库函数,硬件接法为:8位数据线接P1口(依次对应),
LCD的RS接P3_0,LCD的RW接P3_1,LCD的E接P3_2*/
#include<reg51.h>
#include<INTRINS.H> //代码中引用_nop_()函数
/*宏定义 uint 和 uchar 简化代码,提高编绎效率*/
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS=P3^0;
sbit LCD_RW=P3^1;
sbit LCD_E=P3^2;
void delay1()//延时5个机器周期
{
_nop_();
_nop_();
_nop_();
}
/*uchar lcd_r_start() 读状态函数,返回状态值
条件: LCD_RW=1;LCD_RS=0; E为一个下降沿
目的: 最高位D7=0,LCD控制空闲,D7=1,LCD控制忙。
用作写命令和写数据时查忙*/
uchar lcd_r_start() //读状态
{
uchar s;
LCD_RW=1;
LCD_RS=0;
//LCD_E=0;
P1=0XFF;
_nop_();
s=P1;
delay1();
LCD_E=1;
LCD_E=0;
LCD_RW=0;
s=0;
return(s);
}
/* busy{}:查忙函数,用作每次写命令和写数据时查忙调用*/
void busy()
{
uchar i=0xff;
do{
i=lcd_r_start();
i&=0x80;
delay1();
}while(i!=0);
}
/*void lcd_w_cmd(uchar com):写命令字函数,
条件: LCD_RW=0; LCD_RS=0; E为一个下降沿
作用:初始化LCD以及写数据位置*/
void lcd_w_cmd(uchar com)
{
busy();
LCD_RW=0;
LCD_RS=0;
//LCD_E=0;
P1=com;
delay1();
LCD_E=1;
LCD_E=0;
LCD_RW=1;
delay1();
}
/*void lcd_w_dat(uchar dat):写数据函数,
条件:LCD_RW=0;LCD_RS=1;E为一个下降沿
作用:写入每次要显示的字符*/
void lcd_w_dat(uchar dat)
{
busy();
LCD_RW=0;
LCD_RS=1;
//LCD_E=0;
P1=dat;
delay1();
LCD_E=1;
LCD_E=0;
LCD_RW=1;
delay1();
}
void delay_1s() //用定时器控制1S延时函数,使用定时器工作方式0(13位)
{
uchar i;
for(i=0;i<200;i++)
{
TH1=0X63;//置定定时器初值8192-5000=3192=C78H=0110 0011 1 1000B
TL1=0X18; //写入是TL1的高3位加零得0110 0011 0001 1000 即63 18
TR1=1;//开启定时器T1
while(!TF1);//查询计数器是否溢出,即5ms时间到,TF1=1;
TF1=0;//软件清零标志位
}
}
void int1() //初始化
{
lcd_w_cmd(0x38);/*设置工作方式 ,设置数据位数为8位,2行显示,5*10点阵字符
001 DL N F * * DL=1:8位,DL=0:4位;N =1:1行,
N=0:2行;F=1:5*10,F=0:5*7;*/
lcd_w_cmd(0x0c);/*显示状态设置,打开LCD显示,光标不显示,光标位字符不闪烁
0000 1 D C B :D=1:开显示;C=0:不显示光标;B=0:光标位字符不闪烁*/
lcd_w_cmd(0x01);//清屏,将光标设置为第1行第1列
lcd_w_cmd(0x06);/*输入方式设置,设置光标增量方式右移,显示字符不移动
0000 01 I/D S :I/D=1:增量方式右移,I/D=0:减量方式左移;S=1:整屏移,
S=0:整屏不移动*/
lcd_w_cmd(0x80);/*初始显示位置设置,第一行地址为0X80~0X8F;第二行地址为0XC0~0XCF */
delay1();//延时缓冲
}
/****字符显示****/
/*void main()
{
uchar i=0;
uchar code tab[]="China";
TMOD=0x00; //设置定时计数器工作方式为13位定时器
int1();//初始化
delay1();
lcd_w_cmd(0x83); //设置初始显示位置
delay1();
while(tab[i]!='\0') //判断显示字符是否结束
{
lcd_w_dat(tab[i]);
delay_1s();i++;
}
while(1);
}*/
/****时钟****/
void main()
{
uchar HH,MM,SS;
TMOD=0x00;
int1();delay_1s();
lcd_w_cmd(0x86);
lcd_w_dat(':');
lcd_w_cmd(0x89);
lcd_w_dat(':');
for(HH=0;HH<24;HH++)
{
lcd_w_cmd(0x84);
lcd_w_dat(HH/10+0X30);
lcd_w_dat(HH%10+0x30);
for(MM=0;MM<60;MM++)
{
lcd_w_cmd(0x87);
lcd_w_dat(MM/10+0X30);
lcd_w_dat(MM%10+0x30);
for(SS=0;SS<60;SS++)
{
lcd_w_cmd(0x8a);
lcd_w_dat(SS/10+0X30);
lcd_w_dat(SS%10+0x30);
delay_1s();
}
}
}
// while(1) ;
}