📄 g19264.c
字号:
Putedot(10);//显示空格
Delay100ms(3);
keydn=0;
}
WDT_CONTR=WDT;//启动看门狗
aminute4=a*10+b;
col=172,row=2;
Putedot(b);//显示分的低位
enterflg=0;
wr_time(); //写时间到8563
Lcmcls();
}
void main(void)
{
Delay(30);
col=0; row=0; Delay(40); /*延时大约40Ms,等待外设准备好 */
Lcminit(); /*液晶模块初始化,包括全屏幕清屏*/
Lcmcls();
read_count=0;
EA=1;TR1=1;ES=1;
init_serial();
while(1)
{
startbell();
readkey();
if((keydn==1)&(keybuf=='*')) adj_time();
rd_time(); //从时间芯片中读时间到second,minute,hour,week等变量中
time_to_byt();
dispdata(); /*第一行字符输出our friend over the world. 24字节 */
disptime();
WDT_CONTR=WDT;//启动看门狗
if(read_count==3)
{ EA=0;TR1=0;ES=0;
dpcard();//显示卡号
read_count=0;
EA=1;TR1=1;ES=1;
}
if(read_count==3)
{ EA=0;TR1=0;ES=0;
dpcard();//显示卡号
read_count=0;
EA=1;TR1=1;ES=1;
}
}
}
/****************************************/
/* 一个字串的输出 */
/****************************************/
void Putstr(Uchar *puts,Uchar i)
{
Uchar j,X;
for (j=0;j<i;j++)
{
X = puts[j]; //X=0X80 OR 0X20
if (X&0x80)
{
Putcdot(X&0x7f); /*只保留低7位.全角字符输出*/
}
else Putedot(X-0x30); /*ascii码表从0x20开始,半角字符输出*/
}
}
/****************************************/
/* 半角字符点阵码数据输出 */
/****************************************/
void Putedot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义4个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 0x10; /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = bakerx; /*列对齐 */
row = bakery+1; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<8;i++)
{
cbyte = Ezk[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row=bakery;
} /*整个字符输出结束 */
void Putedotbig(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义4个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 144; /*半角字符,每个字符16字节 */
/*上半个字符输出,8列 */
for(i=0;i<24;i++)
{
cbyte = bigzf[x]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = bakerx; /*列对齐 */
row ++;//= bakery+2; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<24;i++)
{
cbyte = bigzf[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
col = bakerx; /*列对齐 */
row++;// = bakery+4; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<24;i++)
{
cbyte = bigzf[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
col = bakerx; /*列对齐 */
row++;// = bakery+6; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<24;i++)
{
cbyte = bigzf[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
col = bakerx; /*列对齐 */
row++;// = bakery+8; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<24;i++)
{
cbyte = bigzf[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
col = bakerx; /*列对齐 */
row++;//= bakery+10; /*指向下半个字符行 */
/*下半个字符输出,8列 */
for(i=0;i<24;i++)
{
cbyte = bigzf[x]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
/*下半个字符输出,8列 */
row=bakery;
} /*整个字符输出结束 */
/****************************************/
/* 全角字符点阵码数据输出 */
/****************************************/
void Putcdot(Uchar Order)
{
Uchar i,bakerx,bakery; /*共定义3个局部变量 */
int x; /*偏移量,字符量少的可以定义为UCHAR */
bakerx = col; /*暂存x,y坐标,已备下半个字符使用 */
bakery = row;
x=Order * 32; /*每个字符32字节 */
/*上半个字符输出,16列 */
for(i=0;i<16;i++)
{
Wrdata(HZ[x]); /*写输出一字节 */
x++;
col++;
if (col==LCMLIMIT){ col=0;row=row+2;} /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
/*下半个字符输出,16列 */
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++) /*下半部分*/
{
Wrdata(HZ[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row=row+2;} /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row = bakery;
} /*整个字符输出结束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/****************************************/
/* 从液晶片上读数据,保留在全局变量中 */
/****************************************/
void Rddata(void)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
Datalcm=0xFF;
Dilcm = 1; /*数据*/
Rwlcm = 1; /*读数据*/
Elcm = 1; /*读入到LCM*/
_nop_();
cbyte = Datalcm; /*虚读一次 */
Elcm = 0;
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
Datalcm=0xFF;
_nop_();
Dilcm = 1; /*数据*/
Rwlcm = 1; /*读数据*/
Elcm = 1; /*读入到LCM*/
_nop_();
cbyte = Datalcm; /*从数据口读数据,真读 */
Elcm = 0;
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(Uchar X)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
wtcom();
Dilcm = 1; /*数据输出*/
Rwlcm = 0; /*写输出 */
Datalcm = X; /*数据输出到数据口 */
Elcm = 1; /*读入到LCM*/
_nop_();
Elcm = 0;
}
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(Uchar X)
{
lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*数据输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************/
/* 命令输出到中区控制口 */
/********************************/
void WrcmdM(Uchar X)
{
lcdbusyM(); /*确定分区,返回时保留分区状态不变*/
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*命令输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(Uchar X)
{
lcdbusyR(); /*确定分区,返回时保留分区状态不变 */
Dilcm = 0; /*命令操作 */
Rwlcm = 0; /*写输出 */
Datalcm = X; /*命令输出到数据口 */
Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态 */
/********************************************************/
void lcdbusyL(void)
{
CS1LCM = 0; /*CLR CS1 */
CS2LCM = 0; /*SETB CS2 */
// CS3LCM = 1; /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyM(void)
{
CS1LCM = 0; /*SETB CS1 */
CS2LCM = 1; /*CLR CS2 */
//CS3LCM = 1; /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyR(void)
{
CS1LCM = 1; /*SETB CS1 */
CS2LCM = 0; /*SETB CS2 */
// CS3LCM = 0; /*CLR CS3 */
wtcom(); /* waitting for enable */
}
void wtcom(void)
{
Dilcm = 0; /*CLR DI */
Rwlcm = 1; /*SETB RW */
Datalcm = 0xFF; /*MOV DATA_LCM,#0FFH */
Elcm = 1;_nop_();
while(Datalcm & Lcdbusy);//if BF=1;LCM is busy.
Elcm = 0;
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y;
switch (col&0xc0) /* col.and.0xC0,c0=1100,0000=192 */
{ /*条件分支执行 */
case 0: {lcdbusyL();break;} /*左区 */
case 0x40: {lcdbusyM();break;} /*中区 0X40=0100,0000=64 */
case 0x80: {lcdbusyR();break;} /*右区 0X80=1000,0000=128*/
}
x = col&0x3F|SETX; /* col.and.0x3f.or.setx,3F=63 */
y = row&0x07|SETY; /* row.and.0x07.or.sety */
wtcom(); /* waitting for enable */
Dilcm = 0; /*CLR DI DI=0写指令*/
Rwlcm = 0; /*CLR RW R/W=0为写*/
Datalcm = y; /*MOV P0,Y */
Elcm = 1;_nop_();Elcm = 0;
wtcom(); /* waitting for enable */
Dilcm = 0; /*CLR DI */
Rwlcm = 0; /*CLR RW */
Datalcm = x; /*MOV P0,X */
Elcm = 1;_nop_();Elcm = 0;
}
/********************************/
/*液晶屏初始化 */
/********************************/
void Lcminit(void)
{// Lcmcls();
cbyte = DISPOFF; /*关闭显示屏 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPON; /*打开显示屏 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST; /*定义显示起始行为零 */
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
col=0; /*清屏 */
row=0;
Locatexy();
}
/********************************/
/* 延时 */
/********************************/
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 10;
while(usn!=0)
{
us=0xff;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
//////////串口初始化函数,T0初始化////
void init_serial()
{
TMOD=0x20; //定时器T1工作方式2
TL1=0XFD; //初值
TH1=0XFD;
TR1=1; //启动T1,开始计时
PCON=0X00; //SMOD=0,波特率不加倍
SCON=0X50; //工作方式1,10位UART, 波特率9600KBPS,允许接收
EA=1;ES=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -