📄 4key电子钟1602.c
字号:
#include <reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<string.h>
#define UN unsigned char
//变量类型标识的宏定义,大家都喜欢这么做
#define Uchar unsigned char
#define Uint unsigned int
#define HW1 0
#define HW2 1
#define LW1 0
#define LW2 1
#define LW3 2
#define LW4 3
#define LW5 4
#define LW6 5
#define LW7 6
#define LW8 7
#define LW9 8
#define LW10 9
#define LW11 10
#define LW12 11
#define LW13 12
#define LW14 13
#define LW15 14
#define LW16 15
// 控制引脚定义,不同的连接必须修改的部分
sbit RS=P2^5;
sbit RW=P2^6;
sbit Elcm=P2^7;
sbit leden=P3^7;
#define DataPort P0 // 数据端口
#define Busy 0x80
void d2ms();
void d1ms();
void d70ms();
void memory(UN f,UN x);
UN rout(UN x);
UN raddr();
void waddr();
UN rdby();
void wrby(UN x);
void start();
void stop();
void ask();
void w8addr(UN x);
void dislsd();
static bit dsb;
static bit dsbk;
static bit nzb;
static bit tiaob;
//sbit Elcm=P2^7;
sbit eclk=P3^3;
sbit esda=P3^4;
sbit yin=P3^2;
sbit led=P0^7;
sbit tkey=P1^4;
sbit mkey=P1^5;
sbit gkey=P1^6;
sbit esckey=P1^7;
sbit nzled=P2^0;
sbit lsledcs=P3^7;
static unsigned int data m250us;
static UN data m_sec;
static UN data m_min;
static UN data m_hour;
static UN data xx,hh,minb;
sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
UN keytab();
void csf();
void keycl(UN x);
void distime(UN h,m);
void discd(hh);
void keyv(UN pu1,pu2);
void zly();
void txchar(Uchar x,Uchar y, Uchar n[]);
/*===================================================================
KS0070(44780) 16x2 字符液晶屏驱动演示程序
=====================================================================
连接线图: LCM-------51 LCM-------51 LCM--------51
DB0-----P2.0 DB4-----P2.4 RS-------P3.7
DB1-----P2.1 DB5-----P2.5 RW-------P3.6
DB2-----P2.2 DB6-----P2.6 E--------P3.5
DB3-----P2.3 DB7-----P2.7 V0接1K2电阻到GND
[注]:AT89C51的晶振频率为12MHz
====================================================================*/
void Delay400Ms(void);
void Delay5Ms(void);
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
UN code discode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
UN code keycode[]={0x00,0xe0,0xd0,0xb0,0x70};
UN data nztab[40];
//UN code addr24c[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
// 19,20,21,22,23,24,25,26,27,28,29,30,31,
//#################################################
main()
{ unsigned char a;
csf();
while(1) {
while(1)
{
a=0;
while (a==0)
{ //dsbk=dsb;
Elcm=0;
discd(hh);
//dislsd();
//if(dsbk!=dsb){SBUF=m_hour;while(TI==0){;}TI=0; SBUF=m_min;while(TI==0){;}TI=0;}
a=keytab();}
/*开定时器0中断,重赋初值后开始发送*/
keycl(a);
} }
}
//#################################################
void dscl()
{UN dd1=0;
if(nzled==0&&minb==1)
{
do{dd1++;if((nztab[dd1*2-1]==m_hour)&&(nztab[dd1*2]==m_min)){zly();minb=0;dd1=18;}
}
while(dd1!=18);
}
}
//####################################################
UN keytab()
{UN k;
P2=0xff;
if((P2&0xf0)==0xf0){return(0);}
d70ms();
P2=0xff;
if((P2&0xf0)==0xf0){return(0);}
k=0;
do{k++;if((P1&0xf0)==keycode[k]){return(k);}}
while(k<4);
Elcm=0;P2=0xff;return(0);}
//#######################################################
void keycl(UN x)
{ switch(x)
{case 1:if(hh==19){nzled=!nzled;tiaob=0;hh=0xff;}
else if(hh<19){tiaob=1;}
else{;}
break;
case 2:if(hh==19){nzled=!nzled;tiaob=0;hh=0xff;}
else if(hh<19){tiaob=1;}
else{;}
break;
case 3:hh++;if(hh==20){hh=0;}
;break;
case 4:tiaob=0;hh=0xff;
;break;
}
}
//###################根据hh的值显示时间或功能入号#####################################
void discd(hh)
{UN x,y,ht,mt;
if(hh==0xff) {distime(m_hour,m_min);}
////////////////////////////////////////////////////////////////////
else if(hh==0)
{ if(tiaob==0)
{ P1=0xff;P0=0x77;P1=0xfe;d1ms();
P1=0xff;P0=0x77;P1=0xfd;d1ms();
P1=0xff;P0=0x77;P1=0xfb;d1ms();
P1=0xff;P0=0x77;P1=0xf7;d1ms();}
else{ ht=12;mt=0;
do{ do{distime(ht,mt);x=keytab();}while(x==0);keyv(3,50);
switch(x)
{case 1:ht++;if(ht==24){ht=0;}distime(ht,mt);break;
case 2:mt++;if(mt==60){mt=0;}distime(ht,mt);break;
case 3:m_hour=ht;m_min=mt;m_sec=0;m250us=0;TH0=6;TL0=6;
hh=0xff;
break;
case 4:hh=0xff;break;}
}
while(hh!=0xff);
tiaob=0;keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);
}
}
else if((hh<10)&&(hh>0))
{if(tiaob==0)
{P1=0xff;P0=0x8e;P1=0xfe;d1ms();
P1=0xff;P0=0xf9;P1=0xfd;d1ms();
P1=0xff;P0=0xbf;P1=0xfb;d1ms();
P1=0xff;P0=discode[hh];P1=0xfe;d1ms();}
else{ht=12;mt=0;
do{ do{distime(ht,mt);x=keytab();}while(x==0);keyv(3,50);
switch(x)
{case 1:ht++;if(ht==24){ht=0;}distime(ht,mt);break;
case 2:mt++;if(mt==60){mt=0;}distime(ht,mt);break;
case 3:memory((hh*2)-1,ht);memory(hh*2,mt);
nztab[(hh*2)-1]=ht;nztab[hh*2]=mt;
hh=0xff;break;
case 4:hh=0xff;break;}
}
while(hh!=0xff);
tiaob=0;keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);
}
}
///////////////////////////////////////////////////////////////////////////////////////
else{
if(tiaob==0)
{ P1=0xff;P0=0x8e;P1=0xfe;d1ms();
P1=0xff;P0=0xa4;P1=0xfd;d1ms();
P1=0xff;P0=0xbf;P1=0xfb;d1ms();
P1=0xff;P0=discode[hh-9];P1=0xfe;d1ms();}
else{ht=12;mt=0;
do{ do{distime(ht,mt);x=keytab();}while(x==0);keyv(3,50);
switch(x)
{case 1:ht++;if(ht==24){ht=0;}distime(ht,mt);break;
case 2:mt++;if(mt==60){mt=0;}distime(ht,mt);break;
case 3:memory((hh*2)-1,ht);memory(hh*2,mt);
nztab[(hh*2)-1]=ht;nztab[hh*2]=mt;
hh=0xff;
break;
case 4:hh=0xff;break;}
}
while(hh!=0xff);
tiaob=0;keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);keyv(3,50);
}
}
}
//###################################################################
void csf()
{ UN i;
//eclk=0;
yin=1;
dsb=0;
TMOD=2;
TH0=6;
TL0=6;
TR0=1;
ET0=1;
hh=0xff;
xx=0;
minb=0;
nzled=0;EA=1;
// i=0;
// do{i++;
// nztab[i]=rout(i);}
// while(i!=40);
/*T2CON=0x30;
RCAP2H=0xff;
RCAP2L=0xd9;
TH2=0xff;
TL2=0xd9;
SCON=0x50;
TR2=1;
//ES=1;*/
m_hour=12;m_min=58;
Elcm=0;
//Uchar temp;
P0=0xff;
//leden=0;
//leden=0;
P0=0xff;
P0=0x55;
//Delay400Ms();
LcdReset();
//Delay400Ms();Delay400Ms();
//temp = 32;
//ePutstr(0,0,exampl); // 上面一行显示一个预定字符串
//ePutstr(0,1,exampl);
//DispOneChar(0,0,0x02);
//DispOneChar(1,0,0x42);
//DispOneChar(2,0,0x43);
//DispOneChar(0,1,0x41);
//txchar(0,0," WWW.QLMCU.COM");
//txchar(0,1," 0595-22313231");
//txchar(LW2,HW1,"WWW.QLMCU.COM 0595-22313231");
txchar(LW2,HW1,"WWW.QLMCU.COM");
txchar(LW2,HW2,"0595-22313231");
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
//Delay400Ms();
Elcm=0;
zly();
}
/*##############################################*/
/* 定时器0中断*/
void time0() interrupt 1 using 1
{
m250us++;
xx++;
if(m250us==2000){dsb=!dsb;}
if(m250us==4000)
{ //led=!led;
m250us=0;
//dsb=1;
dsb=!dsb;
m_sec++;
if(m_sec==60)
{m_sec=0;m_min++;minb=1;
if(m_min==60)
{m_min=0;m_hour++;
if(m_hour==24)
{m_hour=0;m_min=0;m_sec=0;
}
}
}
}
}
/*24c256 ask */
/*###################################*/
/*24c256 ask */
void ask()
{
unsigned int i=0xffff;
esda=1;_nop_();eclk=1;_nop_();
do
{i--;
if(esda!=1)
{eclk=0;i=0;}
}
while(i!=0);
}
/*###################################*/
void stop()
{
eclk=0; _nop_();
esda=0; _nop_();
eclk=1; _nop_();
esda=1;_nop_();
eclk=0;_nop_();
}
/* */
/*###################################*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -