⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 22.c

📁 液晶1602的驱动程序。 用的是勤正达的FM1602A--3。 MCU用51
💻 C
字号:

#include"reg51.h"
#define uchar unsigned char
#define uint  unsigned int


sbit rs=P3^0;
sbit rw=P3^1;
sbit e=P3^2;
sbit ds=P1;
sbit key=P2^0;
sbit bf=P1^7;

uint ms=0;
uint second=0;
uint min=0;
uint hr=0;
uint day=0;
uint keytime=0;



uchar code tab[]={"***FM1602A--3***"};
uchar code tab1[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11,
0x1F,0x11,0x11,0x11,0x1F,0x11,0x11,0x1F};         //   月日
uchar code number[]={"0123456789"};

uchar code inti0[]={"11 26   00:00:00"};



void nop(){}

void delaym(uint q)               //延时
{uchar n;
while(q--)
{for(n=0;n<24;n++){;;}}
}

void delay(unsigned int n)

{

    unsigned int i,j;

    for(j=n;j>0;j--)

    for(i=112;i>0;i--);

}                         /////// 精确MS,



void check()                       //    判忙
{rs=0;
rw=1;
e=0;
P1=0xff;
e=1;
nop();
nop();
while(P&0x80){};
delaym(10);
}

void sendc(uchar com)            //  发命令字
{check();
 
 
 rs=0;
 rw=0;
 e=1;
 P1=com;
 
 nop();
 e=0;
 nop();
 }

void sendd(uchar word)            // 发显示字
{check();
 
 
 rs=1;
 rw=0;
 e=1;
P1=word;
nop();
e=0;
 nop();
 }

void inti()                        // 初始化
{uchar d;
sendc(0x01);
 sendc(0x38);
 sendc(0x0c);
 sendc(0x06);
 delaym(10);

 sendc(0x80);
for(d=0;d<16;d++)
{sendd(*(inti0+d));};
sendc(0x82);
sendd(0x00);
sendc(0x85);
sendd(0x01);
 sendc(0xc0);
for(d=0;d<16;d++)
{sendd(*(tab+d));};
}

void cpuinti()         //////////CPU开中断
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
EA=1;
ET0=1;
 }


void displayday()         //////显示天
{uchar do1,dt;
if(day>9)
{
dt=day/10;
do1=day%10;}
else{dt=0;do1=day;};

sendc(0x83);
sendd(*(number+dt));
sendc(0x84);
sendd(*(number+do1));
while(day==31)
{day=1;
};
}




void displayhr()         //////显示小时
{uchar ho,ht;
if(hr>9)
{
ht=hr/10;
ho=hr%10;}
else{ht=0;ho=hr;};

sendc(0x88);
sendd(*(number+ht));
sendc(0x89);
sendd(*(number+ho));
while(hr==24)
{hr=0;
day++;
displayday();
};
}



void displaymin()   ///////////显示 分
{uchar mo,mt;
if(min>9)
{
mt=min/10;
mo=min%10;}
else{mt=0;mo=min;};

sendc(0x8b);
sendd(*(number+mt));
sendc(0x8c);
sendd(*(number+mo));
while(min==60)
{min=0;
hr++;
displayhr();};
}



void displaysec()   /////////////显示 秒
{uchar o,t;
if(second>9)
{
t=second/10;
o=second%10;}
else{t=0;o=second;};

sendc(0x8e);
sendd(*(number+t));
sendc(0x8f);
sendd(*(number+o));
while(second==60)
{second=0;
min++;
displaymin();};
}
 
void keyt ()            
{keytime=0;        ///////// 键时
while(key==0){delay(1);keytime++;};           /////////// 按键计时
}


void dayshine()  ////////////设置天位

{sendc(0x83);
 sendc(0x84);
for(;;){
while(key==1){};
delaym(10);
keyt();
if(keytime>1000)
{TR0=1;sendc(0x0c);sendc(0x06);while(1){};};

day++;if(day==31){day=0;};displayday();
      };

} 





void hrshine()  ////////////设置小时位
{sendc(0x88);
 sendc(0x89);
for(;;){
while(key==1){};
delaym(10);
keyt();
if(keytime>1000)
{displayhr();dayshine();};

hr++;if(hr==24){hr=0;};displayhr();
        };
}

 

void minshine()          ///////// 设置分位
{sendc(0x8b);
 sendc(0x8c);
for(;;){
 while(key==1){};
delaym(10);
keyt();
if(keytime>1000){displaymin();hrshine();};
min++;if(min==60){min=0;};displaymin();
          };

}


void secshine()          ///////// 设置秒位
{sendc(0x8e);sendc(0x0f);
sendc(0x04);
 sendc(0x8f);
for(;;){
 while(key==1){};
delaym(10);
keyt();
if(keytime>1000){displaysec();minshine();};
second++;if(second==60){second=0;};displaysec();};
}
 



void longkey()
{for(;;){if(key==0){TR0=0;keyt();if(keytime>1000){ secshine(); }
};};

}

void setcgram()           ///////////// 设置CGRAM
{uchar x; 
 sendc(0x40);
 for(x=0;x<16;x++)
 {sendd(*(tab1+x));}
}


void timer() interrupt 1            ///////////中断入口
{
ms++;

displaysec();
while(ms==15){;TH0=0x3c;TL0=0xb0;
ms=0;
second++;}
}




void main()             
{setcgram();
 inti(); 
cpuinti();
 longkey();
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -