看下液晶程序哪里错了

2019-07-16 02:19发布

本帖最后由 in发烧友ing 于 2013-3-3 10:39 编辑


//液晶数字时钟(重影问题还有待于解决)







#include<reg52.h>



#define uchar unsigned char



#define uint unsigned int



sbit wela=P2^7;



sbit dula=P2^6;//数码管



sbit rs=P3^5;



sbit rw=P2^7;



sbit e=P3^4;//液晶



sbit scom=P3^7;



sbit s18=P3^0;//功能键



sbit s19=P3^1;//增加键



sbit s20=P3^2;//减小键



uchar code table1[]=" GOOD! 2013.2.28";



uchar code table2[]="    00:00:00";



uchar count,keynum;// 计数,注意 char比int省内存些,单片机一般用char



char shi,fen,miao;//注意是有符号型







void delay(uint z)//延时函数



{



       uint
x,y;



       for(x=0;x<z;x++)



              for(y=0;y<110;y++);     



}







void write_zl(uchar zl)//写指令函数



{



       rs=0;



       rw=0;//写



       P0=zl;



       delay(5);



       //e一个高脉冲(初始为低)



       e=1;//e拉高



       delay(5);



       e=0;//e拉低



}







void write_date(uchar date)//写数据函数



{



       rs=1;



       rw=0;



       P0=date;



       delay(5);



       e=1;



       delay(5);



       e=0;



}







void write_change(uchar add,uchar numb)//调整时钟写显示



{



       uchar
sw,gw;



    //将数字拆分为十位和个位



       sw=numb/10;



       gw=numb%10;



       write_zl(0x80+0x40+add);//指针地址



       write_date(0x30+sw);//写十位



       write_date(0x30+gw);//写个位



}







void write_key()//按键调整时钟



{



       scom=0;



       keynum=0;



       if(s18==0)//功能键按下



       {



              delay(5);



              if(s18==0)//消抖



              {



                     keynum++;



                     while(!s18);//等待松手



                     if(keynum==1)//按键次数



                     {



                            TR0=0;//关定时器



                            write_zl(0x80+0x40+10);//指针指向秒(特别注意10是十进制的)



                            write_zl(0x0f);//光标闪烁     



                     }



                     if(keynum==2)



                     {



                            write_zl(0x80+0x40+7);//指针指向分



                     }



                     if(keynum==3)



                     {



                            write_zl(0x80+0x40+4);//指针指向时



                     }



                     if(keynum==4)



                     {



                            keynum=0;



                            write_zl(0x0c);



                            TR0=1;//继续定时器



                     }



              }



       }



       if(keynum!=0)



       {



              if(s19==0)//增加键按下



              {



                     delay(5);



                     if(s19==0)



                     {



                            while(!s19);



                            if(keynum==1)



                            {



                                   miao++;



                                   if(miao==60)



                                          miao=0;



                                   write_change(10,miao);



                                   write_zl(0x80+0x40+10);//指针回到秒的个位处



                            }



                            if(keynum==2)



                            {



                                   fen++;



                                   if(fen==60)



                                          fen=0;



                                   write_change(7,fen);



                                   write_zl(0x80+0x40+7);//指针回到秒的个位处(防止上一步跑到十位处)



                            }



                            if(keynum==3)



                            {



                                   shi++;



                                   if(shi==24)



                                          shi=0;



                                   write_change(4,shi);



                                   write_zl(0x80+0x40+4);//指针回到秒的个位处(防止上一步跑到十位处)



                            }



                           



                     }



              }



              if(s20==0)//减小键按下



              {



                     delay(5);



                     if(s20==0)



                     {



                            while(!s20);



                            if(keynum==1)



                            {



                                   miao--;



                                   if(miao==-1)



                                          miao=59;



                                   write_change(10,miao);



                                   write_zl(0x80+0x40+10);



                            }



                            if(keynum==2)



                            {



                                   fen--;



                                   if(fen==-1)



                                          fen=59;



                                   write_change(7,fen);



                                   write_zl(0x80+0x40+7);



                            }



                            if(keynum==3)



                            {



                                   shi--;



                                   if(shi==-1)



                                          shi=23;



                                   write_change(4,shi);



                                   write_zl(0x80+0x40+4);



                            }     



                     }



              }



       }



}







void init()//初始化函数



{



       uchar
num;



       wela=0;



       dula=0;//关数码管



    e=0;//初始为低



       write_zl(0x38);//写显示模式指令



       write_zl(0x0c);//开显示,不显示光标,不闪烁



       write_zl(0x06);//读或写时指针自动加一



       write_zl(0x01);//清屏



       write_zl(0x80);//指针指向第一行



       for(num=0;num<16;num++)



       {



              write_date(table1[num]);//显示第一行



              delay(20);



              



       }



       write_zl(0x80+0x40);//指针指向第二行



       for(num=0;num<12;num++)



       {



              write_date(table2[num]);//显示第二行



              delay(20);



       }



       TMOD=0x01;//定时器0方式1



       TH0=(65535-50000)/256;



       TL0=(65535-50000)%256;//装初值50毫秒



       EA=1;//开总中断



       ET0=1;//开定时器中断



       TR0=1;//启动定时器



}







void main()//主函数



{



       init();



       while(1)



       {



              write_key();



       }



}







void timer() interrupt 1//定时器中断



{



       TH0=(65535-50000)/256;



       TL0=(65535-50000)%256;//装初值50毫秒



       count++;



       if(count==20)//一秒(50*20)



       {



              count=0;



              miao++;



              if(miao==60)



              {



                     miao=0;



                     fen++;



                     if(fen==60)



                     {



                            fen=0;



                            shi++;



                            if(shi==24)



                            {



                                   shi=0;



                            }



                            write_change(4,shi);//显示动态的时



                     }



                     write_change(7,fen);//显示动态的分



              }



              write_change(10,miao);//显示动态的秒



       }     



}



QQ截图20130303102143.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。