📄 lcdkey2new.c
字号:
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#include<rili_case.h>
#define DataPort XBYTE[0]
#define CommPort XBYTE[0x8000]
sbit key_map=P1^4;
sbit key_mat=P1^3;
uint cas,row;
void ste01(void);//读写状态检测
void ste2(void);
void ste3(void);
void OutData(uchar);
void OutComm1(uchar);
void OutComm2(uchar ,uchar );
void OutComm3(uchar ,uchar ,uchar );
void LCDInit(void);
void ClearScreen(void);//清屏
void Dispchar(uchar x,uchar y,uchar index);//显示字符8×16
void DispHZ(uchar xpos,uchar ypos,uchar index);
void ste01(void)//检测数据/命令读写状态
{
uchar sta;
{sta=CommPort & 0x03;}while(sta!=0x03);
}
void ste2(void)//检测自动读状态
{
uchar sta;
{sta=CommPort & 0x04;}while(sta!=0x04);
}
void ste3(void)//检测自动写状态
{
uchar sta;
{sta=CommPort & 0x08;}while(sta!=0x08);
}
void OutData(uchar dat)//往LCD写数据
{
ste01();
DataPort=dat;
}
void OutComm1(uchar comm)//往LCD写命令
{
ste01();
CommPort=comm;
}
void OutComm2(uchar dat1,uchar comm)
{
OutData(dat1);
OutComm1(comm);
}
void OutComm3(uchar dat1,uchar dat2,uchar comm)
{
OutData(dat1);
OutData(dat2);
OutComm1(comm);
}
void LCDInit(void)
{
OutComm3(0x00,0x00,0x42);//设置图形显示区域首地址
OutComm3(30,0x00,0x43);//设置图形显示区域宽度
OutComm1(0x80);//设置显示方式: 逻辑"或"
OutComm1(0xa0);//设置光标形状
OutComm1(0x98);//开图形显示
}
void ClearScreen(void)
{
uint i;
OutComm3(0x00,0x00,0x24);//设置指针地址0000H
OutComm1(0xb0);//设置自动写
for(i=0;i<0x2000;i++)
OutData(0x00);
OutComm1(0xb2); //设置自动写结束
}
void Disphz(uchar x,uchar y,uchar index)//多个汉字
//只要汉字单个占一行,先第一行的2个字节,然后再第二行,共计16行,16列
//x表示汉字的水平位置,最大值是30,一个汉字占2个水平位置,每个水平位置用一个字节的8位表示
//y表示垂直的位置,一行加16,最大值112
//index表示汉字数组里的第一个汉字
//显示汉字16×16
{
uint Startaddr;
uint i;
Startaddr=y*30+x;
for(i=index*32;i<(index+1)*32;i+=2)
{
OutComm3((uchar)(Startaddr),(uchar)(Startaddr>>8),0x24);
OutComm2(hz_table[i],0xc4);
Startaddr=Startaddr+1;
OutComm3((uchar)(Startaddr),(uchar)(Startaddr>>8),0x24);
OutComm2(hz_table[i+1],0xc4);
Startaddr=Startaddr+29;
}
}
void Disp_1hz(uchar x,uchar y,uchar i)//一次只显示一个汉字
//在指定的位置显示
//显示汉字16×16
{
uint Startaddr;
uchar j;
Startaddr=y*30+x;
for(j=0;j<32;j+=2)
{
OutComm3((uchar)(Startaddr),(uchar)(Startaddr>>8),0x24);
OutComm2(datetable[i*32+j],0xc4);
Startaddr=Startaddr+1;
OutComm3((uchar)(Startaddr),(uchar)(Startaddr>>8),0x24);
OutComm2(datetable[i*32+1+j],0xc4);
Startaddr=Startaddr+29;
}
}
void Disptime(uchar x,uchar y,uint i)//显示字符8×16
{ uchar j;
uint Startaddr;
Startaddr=y*30+x;
for(j=0;j<16;j++)
{
OutComm3((uchar)(Startaddr),(uchar)(Startaddr>>8),0x24);
OutComm2(timetable[i*16+j],0xc4);
Startaddr=Startaddr+30;
}
}
void disp_picture(uchar x,uchar y,uint h,uint lie,uchar *p)
{
uint Startaddr,j;
uchar i;
Startaddr=y*30+x;
for(j=0;j<h*lie/8;j+=h/8)
{
for(i=0;i<h/8;i++)
{OutComm3((uchar)(Startaddr),(uchar)(Startaddr>>8),0x24);
OutComm2(p[j+i],0xc4);
Startaddr=Startaddr+1;
}
Startaddr=Startaddr+30-h/8;
}
}
/////////////////////////////////////////////////////////
timer0() interrupt 1
{ uint j;
while(!(t200--)){
t200=2;
TL0=0Xf0;
TH0=0Xf0;
EA=0;
s++;
if(s>59)
{
s=0;
m++;
if(m>59)
{
m=0;
h++;
if(h>23)
{h=0;
day++;
if(day>7) {week++;
if(week==8)week=1;}
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day_last=31;break;
case 2:day_last=28;break;
case 4:
case 6:
case 9:
case 11:day_last=30;break;
default:break;
}
if(day>day_last)
{
day=1;
if(month<12)month++;
else {year++;month=1;}
}
}}}
disp();
Disptime(14,48,sbuffer[13]);
Disptime(15,48,sbuffer[12]);
Disptime(16,48,sbuffer[11]);
Disptime(17,48,sbuffer[10]);
Disp_1hz(18,48,0);//年
Disptime(20,48,sbuffer[9]);
Disptime(21,48,sbuffer[8]);
Disp_1hz(22,48,1); //月
Disptime(24,48,sbuffer[7]);
Disptime(25,48,sbuffer[6]);
Disp_1hz(26,48,2);//日
Disptime(14,64,sbuffer[5]);
Disptime(15,64,sbuffer[4]);
Disp_1hz(16,64,3);//时
Disptime(18,64,sbuffer[3]);
Disptime(19,64,sbuffer[2]);
Disp_1hz(20,64,4);//分
Disptime(22,64,sbuffer[1]);
Disptime(23,64,sbuffer[0]);
Disp_1hz(24,64,5);//秒
Disp_1hz(14,80,6); //星期
Disp_1hz(16,80,7); //星期
Disp_1hz(18,80,sbuffer[14]+9);
for(row=0;row<15;row++)Disphz(2*row,cas,row);
disp_picture(14,16,80,16, bjtime);
disp_picture(20,100,88,29,picturelgf);
disp_picture(0,16,112,112, clock_11);
disp_picture(0,16,112,112, clock_13);
disp_picture(0,16,112,112, clock_12);
disp_picture(0,16,112,112, clock_14);
disp_picture(0,16,112,112, clock_15);
EA=1;
}
}
/////////////////////////////////////////////////////////////////////
void main(void)
{ uint time,delay;
LCDInit();
data_init();
ClearScreen();
for(row=0;row<14;row++)
{
if(row>14)cas=16;
Disphz(2*row,cas,row);
}cas=0;//////////////////////////////////////////
disp_picture(14,16,80,16, bjtime);
disp_picture(20,100,88,29,picturelgf);
while(1){
while(!key_map) {
EA=0;
ClearScreen();
disp_picture(8,0,128,124,map);
for(delay=0;delay<60000;delay++);
ClearScreen();
}
EA=1;
while(!key_mat) {
EA=0;
ClearScreen();
disp_picture(0,0,232,128, mat);
for(delay=0;delay<60000;delay++);
ClearScreen();
}
EA=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -