/************************************************
焊接上插针,然后插入学习板,切记不可插错位
跳线设置:默认跳线位
晶振:12M
硬件结构框架:
1,1602字符液晶(可显示2行数字或者英文)
显示效果:
1,MCU模拟时钟显示跑秒并在液晶屏上显示
相关知识点:
1,字符型液晶的操作显示
注意事项:
1,此程序版权归51hei.com所有,可随意修改,不得用于任何商业目的.
2,注意方向,不可插反或者插错,当液晶在初次连接上开发板后可能会出现显示不全的现象,MCU复位即可
************************************************/
#include"AT89x52.h"
#include"51hei.h"
#include"math.h"
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit rw=P2^7;
sbit cs=P3^4;
sbit DUAN=P2^6; //74HC573的LE端 U1 LED的段选端
sbit WEI=P2^7; //74HC573的LE端 U2 LED的位选端
uchar lcd_data_1[]={" 2009-04-24"};
uchar lcd_data_2[]={" : : "};
uchar shi,fen,miao;
void wei_1()
{
WEI=1;
P0=0;
WEI=0;
}
void duan_1()
{
DUAN=1;
P0=0;
DUAN=0;
}
void nop(){} //延时一会
//=函数原型:delay
//=功 能:1ms延时
//=参 数:z
//=返 回 值:
//=函数性质:私有函数
void delay(uchar z)
{
uchar t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
//=函数原型:lcd_busy
//=功 能:忙标志
//=参 数:
//=返 回 值:lcd_start&0x01值
//=函数性质:私有函数
uchar lcd_busy()
{
register uchar lcd_start;
rs=0;
rw=1;
cs=1;
nop();
lcd_start=P0;
cs=0;
return(lcd_start&0x80);
}
//=函数原型:write_cmd
//=功 能:写命令
//=参 数:cmd
//=返 回 值:
//=函数性质:私有函数
void write_cmd(uchar cmd)
{
uchar CMD;
CMD=cmd;
while(lcd_busy());
rs=0;
rw=0;
cs=1;
nop();
P0=CMD;
cs=0;
}
//=函数原型:write_data
//=功 能:写数据
//=参 数:data1
//=返 回 值:
//=函数性质:私有函数
void write_data(uchar data1)
{
uchar DATA;
DATA=data1;
while(lcd_busy());
rs=1;
rw=0;
cs=1;
nop();
P0=DATA;
cs=0;
}
//=函数原型:lcdinit
//=功 能:LCD初始化
//=参 数:
//=返 回 值:
//=函数性质:
void lcdinit()
{
delay(30); //延时30ms
write_cmd(0x38); //设定8位操作格式,2行显示,5*7点阵
delay(5);
write_cmd(0x38); //设定8位操作格式,2行显示,5*7点阵
delay(5);
write_cmd(0x38); //设定8位操作格式,2行显示,5*7点阵
delay(5);
write_cmd(0x0c); //整体显示,关光标,不闪烁
write_cmd(0x06); //输入方式设定(增量不移位)
write_cmd(0x01); //清屏且光标回原位
write_cmd(0x0d); //开显示开光标
}
//=函数原型:init
//=功 能:MCU初始化
//=参 数:
//=返 回 值:
//=函数性质?
void init() //初始化,开定时器0
{
TMOD=0x01;
TCON=0x10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
}
//=函数原型:time
//=功 能:时间调节
//=参 数:
//=返 回 值:
//=函数性质:
void time()
{
uchar i,a,b,c,d,e,f;
a=miao%10;
b=miao/10;
c=fen%10;
d=fen/10;
e=shi%10;
f=shi/10;
write_cmd(0x80); //地址指针的设置
for(i=0;i<13;i++)
{
write_data(lcd_data_1[i]);
}
write_cmd(0xc0+0x04); //地址指针的设置
for(i=0;i<8;i++)
{
write_data(lcd_data_2[i]);
}
write_cmd(0xc0+0x0c); //秒个位地址指针的设置
write_data(0x30+a);
write_cmd(0xc0+0x0b); //秒十位地址指针的设置
write_data(0x30+b);
write_cmd(0xc0+0x09); //分个位地址指针的设置
write_data(0x30+c);
write_cmd(0xc0+0x08); //分十位地址指针的设置
write_data(0x30+d);
write_cmd(0xc0+0x06); //时个位地址指针的设置
write_data(0x30+e);
write_cmd(0xc0+0x05); //时十位地址指针的设置
write_data(0x30+f);
}
void main(void)
{
wei_1();
duan_1();
guandz();//防止点阵干扰
guanled();//防止led数码管干扰
init();
lcdinit();
while(1)
{
time();
}
}
void timer0() interrupt 1 //定时器0
{
uchar i;
if(i++>10)
{
i=0;
if(miao++>58)
{
miao=0;
if(fen++>58)
{
fen=0;
if(shi++>23)
{
shi=0;
}
}
}
}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}