stc52单片机1602液晶显示问题
时间:10-02
整理:3721RD
点击:
用52单片机做的一个1602液晶显示时分秒的程序,按功能键时,定时器没关,按键没用,显示还在走,程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;//1602数据/指令选择端
sbit rw=P1^1;//1602读/写选择端
sbit e=P1^2;//1602使能信号端
sbit beep=P1^5;//蜂鸣器控制口
sbit s1=P3^7;//按键-功能键
sbit s2=P3^6;//按键-增大键
sbit s3=P3^5;//按键-减小键
uchar code table1[]="2013-12-16 MON";
char miao,fen,shi;
char zd;
uchar miaoge,miaoshi,fenge,fenshi,shige,shishi;
void delay(uint z)//延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void di()//蜂鸣器发声子函数
{
beep=0;
delay(100);
beep=1;
}
void write_com(uchar com)//1602液晶写指令子函数
{
rs=0;//写指令
P0=com;//送指令
delay(5);
e=1;//使能信号高脉冲
delay(5);
e=0;//使能信号低完成一次写指令
}
void write_date(uchar date)//1602液晶写数据子函数
{
rs=1;//写数据
P0=date;//送数据
delay(5);
e=1;//使能信号高脉冲
delay(5);
e=0;//使能信号低完成一次写数据
}
void write_sfm(uchar add,uchar date)//写时分秒子函数
{
uchar ge,shi;
shi=date/10;//数据除10商给shi,余给ge
ge=date%10;
write_com(0x80+0x40+add);//写液晶第二行指令定义位置
write_date(0x30+shi);//ASCII表和1602的表,查表,液晶显示shi,ge数据
write_date(0x30+ge);//
}
void keyscan()//键盘扫描子函数
{
uint s1num;
//uchar miaoge,miaoshi,fenge,fenshi,shige,shishi;
if(s1==0)//功能键按下
{
delay(10);
if(s1==0)//确认功能键按下
{
s1num++;//功能键按下次数记录
while(!s1);//功能键释放确认
di();//按键按下蜂鸣器发声
if(s1num==1)//功能键第一次按下
{
TR0=0;//关定时器
write_com(0x80+0x40+11);//光标定位到秒个位位置
write_com(0x0f);//光标开始闪烁
}
if(s1num==2)//功能键第二次按下
{
write_com(0x80+0x40+10);//光标定位到秒十位位置
}
if(s1num==3)//功能键第三次按下
{
write_com(0x80+0x40+8);//定位到分个位位置
}
if(s1num==4)//功能键第四次按下
{
write_com(0x80+0x40+7);//定位到分十位位置
}
if(s1num==5)//功能键第五次按下
{
write_com(0x80+0x40+5);//定位到时个位位置
}
if(s1num==6)//功能键第五次按下
{
write_com(0x80+0x40+4);//定位到时十位位置
}
if(s1num==7)//功能键第四次按下
{
s1num=0;//记录次数清零
write_com(0x0c);//关光标
TR0=1;//启动定时器
}
}
}
if(s1num!=0)//只有功能键按下,增大减小键才起作用
{
if(s2==0)//增大键按下
{
delay(10);
if(s2==0)//确认增大键按下
{
while(!s2);//释放确认
di();//蜂鸣器响
if(s1num==1)
{
miaoge=miao%10;
miaoge++;
if(miaoge==10)
miaoge=0;
write_com(0x80+0x40+11);
write_date(0x30+miaoge);
write_com(0x80+0x40+11);
}
if(s1num==2)
{
miaoshi=miao/10;
miaoshi++;
if(miaoshi==6)
miaoshi=0;
write_com(0x80+0x40+10);
write_date(0x30+miaoshi);
write_com(0x80+0x40+10);
}
if(s1num==3)
{
fenge=fen%10;
fenge++;
if(fenge==10)
fenge=0;
write_com(0x80+0x40+8);
write_date(0x30+fenge);
write_com(0x80+0x40+8);
}
if(s1num==4)
{
fenshi=fen/10;
fenshi++;
if(fenshi==10)
fenshi=0;
write_com(0x80+0x40+7);
write_date(0x30+fenshi);
write_com(0x80+0x40+7);
}
if(s1num==5)
{
shige=shi%10;
shige++;
if(shishi==2)
{
if(shige==5)
shige=0;
}
else
{
if(shige==10)
shige=0;
}
write_com(0x80+0x40+5);
write_date(0x30+shige);
write_com(0x80+0x40+5);
}
if(s1num==6)
{
shishi=shi/10;
shishi++;
if(shishi==3)
shishi=0;
write_com(0x80+0x40+4);
write_date(0x30+shishi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)//减小键按下
{
delay(5);
if(s3==0)//确认减小键按下
{
while(!s3);//释放确认
di();//蜂鸣器响
if(s1num==1)
{
miaoge=miao%10;
miaoge--;
if(miaoge==-1)
miaoge=9;
write_com(0x80+0x40+11);
write_date(0x30+miaoge);
write_com(0x80+0x40+11);
}
if(s1num==2)
{
miaoshi=miao/10;
miaoshi--;
if(miaoshi==-1)
miaoshi=5;
write_com(0x80+0x40+10);
write_date(0x30+miaoshi);
write_com(0x80+0x40+10);
}
if(s1num==3)
{
fenge=fen%10;
fenge--;
if(fenge==-1)
fenge=9;
write_com(0x80+0x40+8);
write_date(0x30+fenge);
write_com(0x80+0x40+8);
}
if(s1num==4)
{
fenshi=fen/10;
fenshi--;
if(fenshi==-1)
fenshi=5;
write_com(0x80+0x40+7);
write_date(0x30+fenshi);
write_com(0x80+0x40+7);
}
if(s1num==5)
{
shige=shi%10;
shige--;
if(shishi==2)
{
if(shige==-1)
shige=3;
}
else
{
if(shige==-1)
shige=9;
}
write_com(0x80+0x40+5);
write_date(0x30+shige);
write_com(0x80+0x40+5);
}
if(s1num==6)
{
shishi=shi/10;
shishi--;
if(shishi==-1)
shishi=2;
write_com(0x80+0x40+4);
write_date(0x30+shishi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()//主函数
{
uchar num1;
//1602液晶初始化
rw=0;//写选择
write_com(0x38);//设置16*2显示,5*7点阵。8位数据接口
write_com(0x0c);//开显示
write_com(0x06);//写一个字符后指针加1
write_com(0x01);//显示清屏
//初始第一行显示
write_com(0x80);
for(num1=0;num1<15;num1++)
{
write_date(table1[num1]);
delay(10);
}
//初始第二行显示
write_com(0x80+0x40+4);
write_date('0');
write_date('0');
delay(5);
write_com(0x80+0x40+6);
write_date(':');
delay(5);
write_com(0x80+0x40+7);
write_date('0');
write_date('0');
delay(5);
write_com(0x80+0x40+9);
write_date(':');
delay(5);
write_com(0x80+0x40+10);
write_date('0');
write_date('0');
delay(5);
// 定时器0初始
TMOD=0x01;//选定时器0工作方式1
TH0=(65536-50000)/256;//给定时器0赋初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0*/
while(1)
{
keyscan();
}
}
void time0(void) interrupt 1//定时器0中断服务程序
{
TH0=(65536-50000)/256;//重装定时器0初值
TL0=(65536-50000)%256;
zd++;
if(zd==20)//1秒时间到
{
zd=0;
miao++;
if(miao==60)//一分钟到
{
miao=0;
fen++;
if(fen==60)//一小时到
{
fen=0;
shi++;
if(shi==24)//一天到
{
shi=0;
}
write_sfm(4,shi);//小时变化重新写入
}
write_sfm(7,fen);//分钟变化重新写入
}
write_sfm(10,miao);//秒变化重新写入
}
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;//1602数据/指令选择端
sbit rw=P1^1;//1602读/写选择端
sbit e=P1^2;//1602使能信号端
sbit beep=P1^5;//蜂鸣器控制口
sbit s1=P3^7;//按键-功能键
sbit s2=P3^6;//按键-增大键
sbit s3=P3^5;//按键-减小键
uchar code table1[]="2013-12-16 MON";
char miao,fen,shi;
char zd;
uchar miaoge,miaoshi,fenge,fenshi,shige,shishi;
void delay(uint z)//延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void di()//蜂鸣器发声子函数
{
beep=0;
delay(100);
beep=1;
}
void write_com(uchar com)//1602液晶写指令子函数
{
rs=0;//写指令
P0=com;//送指令
delay(5);
e=1;//使能信号高脉冲
delay(5);
e=0;//使能信号低完成一次写指令
}
void write_date(uchar date)//1602液晶写数据子函数
{
rs=1;//写数据
P0=date;//送数据
delay(5);
e=1;//使能信号高脉冲
delay(5);
e=0;//使能信号低完成一次写数据
}
void write_sfm(uchar add,uchar date)//写时分秒子函数
{
uchar ge,shi;
shi=date/10;//数据除10商给shi,余给ge
ge=date%10;
write_com(0x80+0x40+add);//写液晶第二行指令定义位置
write_date(0x30+shi);//ASCII表和1602的表,查表,液晶显示shi,ge数据
write_date(0x30+ge);//
}
void keyscan()//键盘扫描子函数
{
uint s1num;
//uchar miaoge,miaoshi,fenge,fenshi,shige,shishi;
if(s1==0)//功能键按下
{
delay(10);
if(s1==0)//确认功能键按下
{
s1num++;//功能键按下次数记录
while(!s1);//功能键释放确认
di();//按键按下蜂鸣器发声
if(s1num==1)//功能键第一次按下
{
TR0=0;//关定时器
write_com(0x80+0x40+11);//光标定位到秒个位位置
write_com(0x0f);//光标开始闪烁
}
if(s1num==2)//功能键第二次按下
{
write_com(0x80+0x40+10);//光标定位到秒十位位置
}
if(s1num==3)//功能键第三次按下
{
write_com(0x80+0x40+8);//定位到分个位位置
}
if(s1num==4)//功能键第四次按下
{
write_com(0x80+0x40+7);//定位到分十位位置
}
if(s1num==5)//功能键第五次按下
{
write_com(0x80+0x40+5);//定位到时个位位置
}
if(s1num==6)//功能键第五次按下
{
write_com(0x80+0x40+4);//定位到时十位位置
}
if(s1num==7)//功能键第四次按下
{
s1num=0;//记录次数清零
write_com(0x0c);//关光标
TR0=1;//启动定时器
}
}
}
if(s1num!=0)//只有功能键按下,增大减小键才起作用
{
if(s2==0)//增大键按下
{
delay(10);
if(s2==0)//确认增大键按下
{
while(!s2);//释放确认
di();//蜂鸣器响
if(s1num==1)
{
miaoge=miao%10;
miaoge++;
if(miaoge==10)
miaoge=0;
write_com(0x80+0x40+11);
write_date(0x30+miaoge);
write_com(0x80+0x40+11);
}
if(s1num==2)
{
miaoshi=miao/10;
miaoshi++;
if(miaoshi==6)
miaoshi=0;
write_com(0x80+0x40+10);
write_date(0x30+miaoshi);
write_com(0x80+0x40+10);
}
if(s1num==3)
{
fenge=fen%10;
fenge++;
if(fenge==10)
fenge=0;
write_com(0x80+0x40+8);
write_date(0x30+fenge);
write_com(0x80+0x40+8);
}
if(s1num==4)
{
fenshi=fen/10;
fenshi++;
if(fenshi==10)
fenshi=0;
write_com(0x80+0x40+7);
write_date(0x30+fenshi);
write_com(0x80+0x40+7);
}
if(s1num==5)
{
shige=shi%10;
shige++;
if(shishi==2)
{
if(shige==5)
shige=0;
}
else
{
if(shige==10)
shige=0;
}
write_com(0x80+0x40+5);
write_date(0x30+shige);
write_com(0x80+0x40+5);
}
if(s1num==6)
{
shishi=shi/10;
shishi++;
if(shishi==3)
shishi=0;
write_com(0x80+0x40+4);
write_date(0x30+shishi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)//减小键按下
{
delay(5);
if(s3==0)//确认减小键按下
{
while(!s3);//释放确认
di();//蜂鸣器响
if(s1num==1)
{
miaoge=miao%10;
miaoge--;
if(miaoge==-1)
miaoge=9;
write_com(0x80+0x40+11);
write_date(0x30+miaoge);
write_com(0x80+0x40+11);
}
if(s1num==2)
{
miaoshi=miao/10;
miaoshi--;
if(miaoshi==-1)
miaoshi=5;
write_com(0x80+0x40+10);
write_date(0x30+miaoshi);
write_com(0x80+0x40+10);
}
if(s1num==3)
{
fenge=fen%10;
fenge--;
if(fenge==-1)
fenge=9;
write_com(0x80+0x40+8);
write_date(0x30+fenge);
write_com(0x80+0x40+8);
}
if(s1num==4)
{
fenshi=fen/10;
fenshi--;
if(fenshi==-1)
fenshi=5;
write_com(0x80+0x40+7);
write_date(0x30+fenshi);
write_com(0x80+0x40+7);
}
if(s1num==5)
{
shige=shi%10;
shige--;
if(shishi==2)
{
if(shige==-1)
shige=3;
}
else
{
if(shige==-1)
shige=9;
}
write_com(0x80+0x40+5);
write_date(0x30+shige);
write_com(0x80+0x40+5);
}
if(s1num==6)
{
shishi=shi/10;
shishi--;
if(shishi==-1)
shishi=2;
write_com(0x80+0x40+4);
write_date(0x30+shishi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()//主函数
{
uchar num1;
//1602液晶初始化
rw=0;//写选择
write_com(0x38);//设置16*2显示,5*7点阵。8位数据接口
write_com(0x0c);//开显示
write_com(0x06);//写一个字符后指针加1
write_com(0x01);//显示清屏
//初始第一行显示
write_com(0x80);
for(num1=0;num1<15;num1++)
{
write_date(table1[num1]);
delay(10);
}
//初始第二行显示
write_com(0x80+0x40+4);
write_date('0');
write_date('0');
delay(5);
write_com(0x80+0x40+6);
write_date(':');
delay(5);
write_com(0x80+0x40+7);
write_date('0');
write_date('0');
delay(5);
write_com(0x80+0x40+9);
write_date(':');
delay(5);
write_com(0x80+0x40+10);
write_date('0');
write_date('0');
delay(5);
// 定时器0初始
TMOD=0x01;//选定时器0工作方式1
TH0=(65536-50000)/256;//给定时器0赋初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0*/
while(1)
{
keyscan();
}
}
void time0(void) interrupt 1//定时器0中断服务程序
{
TH0=(65536-50000)/256;//重装定时器0初值
TL0=(65536-50000)%256;
zd++;
if(zd==20)//1秒时间到
{
zd=0;
miao++;
if(miao==60)//一分钟到
{
miao=0;
fen++;
if(fen==60)//一小时到
{
fen=0;
shi++;
if(shi==24)//一天到
{
shi=0;
}
write_sfm(4,shi);//小时变化重新写入
}
write_sfm(7,fen);//分钟变化重新写入
}
write_sfm(10,miao);//秒变化重新写入
}
}
看看。
有没有人知道什么问题呀?