微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 看下液晶程序哪里错了

看下液晶程序哪里错了

时间:10-02 整理:3721RD 点击:


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





#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);//显示动态的秒


       }     


}



跟据郭天祥的教程10数字时钟自己写的,按下控制键有反应,光标闪烁,但无法控制时钟加减,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top