#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define clear 0x01 //清屏幕,约1.6ms 清除显示屏幕,把DDRAM位址计数器调整为"00H"
#define home 0x02 //把DDRAM位址计数器调整为"00H",游标回原点,该功能不影响显示DDRAM
#define f_set 0x30 //基本指令集动作
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
/*------------LCD-----------*/
sbit P_RS=P1^0;
sbit P_RW=P1^1;
sbit P_E= P1^2;
uchar
time[6]; //显示时间数组
uchar str1[] ;
bit flag=0;
/********************************************
简单的送8位数据程序
********************************************/
void bit8_serial_input(uchar ix)
{
uchar i;
P_E=0;
for(i=0x80;i>=0x01;i=i>>1)
{
if((ix&i)==0) P_RW=0; else P_RW=1;
P_E=1;
P_E=0;
}
}
/*---------------------------------------------------------*/
/*-----------MCU写指令到指令寄存器IR--------------*/
void instruct(uchar dat) //只有3个指令RS,RW不同时为0
{
uchar ch;
P_RS=1; //选通
ch=0xf8;
bit8_serial_input(ch); //和
单片机进行同步5个1;
ch=dat&0xf0; //写入高四位
bit8_serial_input(ch);
ch=dat<<4; ///写低四位
bit8_serial_input(ch);
P_RS=0; //结束作业
}
/*-------------MCU写数据到数据寄存器DR--------------*/
void write_abyte(uchar dat)
{
data uchar ch;
P_RS=1; //读数据--不选通
ch=0xfa; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat&0xf0; //RS=1 RW=0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0; //结束作业
}
void dis_str(uchar x, uchar y, uchar *str)
{
uchar loc,*p;
uchar xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
instruct(home);
loc=(16*(x-1)+y-1);
if(loc&0x01){
loc/=2;
instruct(loc|0x80);
write_abyte(' ');
}else{
loc/=2;
instruct(loc|0x80);
}
while(*p){
write_abyte(*p++);
}
}
/*--------对液晶显示屏初始化--------------------*/
void initial(void)
{
data uchar i,j;
P_RS=0; //串行不选通
P_E=0; //串行方式
instruct(f_set); //0x30; //设定使用基本指令集动作,有11条指令
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(f_set);
for(i=0;i<30;i++){}
for(i=0;i<250;i++){}
for(i=0;i<250;i++){}
instruct(dis_on); //0x0f; //开启屏幕 光标在第一位闪烁
for(i=0;i<30;i++){}
instruct(clear); //0x01; //清屏幕 clear
for(j=0;j<10;j++){
for(i=0;i<250;i++){}
}
instruct(in_mode); //0x06; //光标右移、地址增1 方式
for(i=0;i<30;i++){}
instruct(home);
}
//
void init_timer(void)
{
TMOD=0x01; //定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
//*****************************************************************************
//
// The interrupt handler for the first timer interrupt.
//
//*****************************************************************************
// 主函数(程序入口)
void main(void)
{
int second;
initial();
init_timer();
dis_str(1,3,"东北农业大学");
dis_str(2,1,"2011年07月23日");
dis_str(4,9,"saturday");
instruct(0x0c); //关闭光标
for (;;)
{
if(flag==1)
{
flag=0;
second++;
time[0]=second/600%6+'0';
time[1]=second/60%10+'0';
time[2]=':';
time[3]=second/10%6+'0';
time[4]=second%10+'0';
time[5]=' ';
dis_str(3,5,time);
}
}
}
void timer0() interrupt 1
{
uchar t;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t%20==0)
{
flag=1;
}
}
一周热门 更多>