12864时钟显示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12864时钟显示程序
/*用LCD12864液晶显示器进行设置时钟,有独立键盘调节时间程序*/
个人觉得在学习编写LCD12864显示程序时可以多结合1602一起来学习,很多东西是相通的,我这个程序就是,还有对于初学者来说,最好是理解程序每个模块的作用,掌握后对于以后的编程学习进度会更快,再补充说明一句,对于显示模块程序,着重需要对地址些函数部分理解,废话不多说,看程序吧:
#include
#define uchar unsigned char
#define uint unsigned int
sbit RS= P2^6;//数据/命令选择端(H/L)
sbit RW= P2^5;//读写/选择端(H/L)
sbit EP= P2^7;//使能信号
sbit K1=P3^0; //开关定义
sbit K2=P3^1;
sbit K3=P3^2;
uchar num,t;
uchar K1num;
char s,f,m; //可取负数
uchar code table[]= " 2013-8-12 MON ";//日期显示
uchar code table1[]=" 00: 00: 00 AM "; //时间显示
uchar code table2[]="长沙今日多云"; //天气显示
uchar code table3[]=" 南风39-30℃"; //气温显示
void init1(); //中断子函数
void delay(uint k) //延时函数
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
void write(uchar com) //命令指令函数
{ //根据时序图来设置
RS=0; //选择指令寄存器
RW=0; //选择写
P0=com; //将8位数据通过P0口传给12864
delay(5); //延时一会,让12864准备接收数据
EP=1; //使能线电平变化,数据送入1602的八位数据口delay(5);
EP=0;
}
void read(uchar date) //写入指令函数
{ //根据时序图来设置
RS=1; //选择寄存器
RW=0; //选择写
P0=date; //将8位数据通过P0口传给12864
delay(5);
EP=1;
delay(5);
EP=0;
}
void init() //初始化函数
{
RS=0;
EP=0;
RW=0;
write(0x38); //显示设置模式
write(0x0c); //显示开关控制
write(0x06); //光标设置
write(0x01); //清屏设置
write(0x80); //数据地址初始位
for(num=0;num<16;num++) //查table表数据
{
read(table[num]); //读取表中内容
delay(20);
}
write(0x90);//重新设置数据指针
for(num=0;num<16;num++) //查table2表数据{
read(table2[num]); //读取表中内容
delay(20);
}
write(0x98);//重新设置数据指针
for(num=0;num<16;num++) //查table3表数据{
read(table3[num]); //读取表中内容
delay(20);
}
write(0x88);//重新设置数据指针
for(num=0;num<16;num++)
{
read(table1[num]); //读取table1表中内容
delay(20);
}
}
void write_sfm(uchar add,uchar date) // 时分秒函数设置{ uchar shi ,ge;
shi=date/10; // 取商
ge=date%10; //取余
write(0x83+add); //设置add位地置read(0x30+shi); //设置十位地置read(0x30+ge); //设置个位地址
}
void key() //独立开关控制
{
if(K1==0)
{
delay(5);
if(K1==0)
{
K1num++;
while(!K1); //判断按键是否按下
if(K1num==1) //按一下调节秒
{
TR0=0; //关定时器
write(0x83+10); //找到秒位置
write(0x0f); //光标闪烁
}
}
if(K1num==2)
{
write(0x83+8);//再按一下调节分地址}
if(K1num==3) //第三次按下调节时{
write(0x83+6);
}
if(K1num==4) //按四次回到正常计时{
K1num=0;
write(0x0c);//光标不闪
TR0=1;
}
}
if(K1num!=0) //有按下
{
if(K2==0) //K2开关控制时分秒加{
delay(5);
if(K2==0) //消抖
{
while(!K2);//松手
if(K1num==1) //秒调节
{
m++;
if(m==60)
m=0;
write_sfm(10,m);
write(0x83+10);//秒钟地址
}
if(K1num==2) //分钟调节
{
f++;
if(f==60)
f=0;
write_sfm(8,f);
write(0x83+8); //分钟地址
}
if(K1num==3) //小时调节
{
s++;
if(s==23)
s=0;
write_sfm(6,s);
write(0x83+6);//时地址
}
}
}
if(K3==0)
{
delay(5);
if(K3==0)
{
while(!K3);
if(K1num==1) //K3控制时分秒减{
m--;
if(m==-1)
m=59;
write_sfm(10,m);
write(0x83+10);
}
if(K1num==2)
f--;
if(f==-1)
f=59;
write_sfm(8,f);
write(0x83+8);
}
if(K1num==3)
{
s--;
if(s==-1)
m=23;
write_sfm(6,s);
write(0x83+6);
}
}
}
}
}
void main() //主函数
{
init(); //调用子函数
init1(); //调用定时子函数
while(1)
{
key();
}
}
void init1() //定时子函数
{
TMOD=0x01;
EA=1; //开总中断
ET0=1; //开定时器中断
TR0=1;
TH0=(65536-50000)/256; //设置时间50ms TL0=(65536-50000)%256;
}
void e() interrupt 1 //定时器T0方式1中断{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==18) //一秒钟定时
{
m++;
if(m==60) //秒设置
{
m=0;
f++;
if(f==60) //分设置
{
f=0;
s++;
if(s==24) //小时设置
{
s=0;
}
write_sfm(6,s); //时位数据读取
}
write_sfm(8,f); //分位数据读取
}
write_sfm(10,m); //秒位数据读取}
}。