📄 ocm12864.c
字号:
void chk_busy (void) //测试LCD是否处于忙状态
{
data_port=0xff;
di=0;
rw=1;
;
e=1;
while(bf||res==1);
e=0;
}
void wr_lcd (uchar data_command,uchar content) //写数据或命令到LCD
{
chk_busy ();
di=data_command;
rw=0;
data_port=content;
e=1;
;
e=0;
}
void lattice_disp (uchar data1,uchar data2) //写点阵 整屏清
{
uchar i,j;
cs1=1;cs2=1;
wr_lcd (command,disp_on); //开显示
for(j=0;j<8;j++)
{
wr_lcd (command,disp_x+j); // X 0~7 表示选择页地址
wr_lcd (command,disp_z); // Z 0~63 表示行选择地址
wr_lcd (command,disp_y); // Y 0~63 表示行具体某一位
for(i=0;i<32;i++) //16X16点阵为32个数据组成
{
wr_lcd (data,data1);
wr_lcd (data,data2);
}
}
}
void chn_disp (uchar t_f,uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar code *chn)
{ //指定位置(x,y)显示row_xl行(每行row_yl个)汉字(大小8xl*yl)
uchar i,j,k,l,a;
wr_lcd (command,disp_on); //开显示
for(l=0;l<row_xl;l++) //数据行数
{
for(k=0;k<row_yl;k++) //每行16位数据
{
for(j=0;j<xl;j++)
{
wr_lcd (command,disp_x+x+l*xl+j);
wr_lcd (command,disp_z);
wr_lcd (command,disp_y+y+k*yl);
a=l*xl*yl*row_yl+k*xl*yl+j*yl;
if(t_f==0)
for(i=0;i<yl;i++)
wr_lcd (data,chn[a+i]);
}
}
}
}
void init_lcd (void) // LCD初始化
{
delay(30);
rst=0;
rst=1;
cs1=1;cs2=1;
wr_lcd (command,disp_off);
wr_lcd (command,disp_on);
}
void display (void) // 待机显示
{
lattice_disp(0x00,0x00);
/**********************************************************/
cs1=1;cs2=0;
chn_disp (0,0,0,2,8,1,1,digital1+2*16);
chn_disp (0,0,8,2,8,1,1,digital1+0*16);
chn_disp (0,0,16,2,8,1,1,digital1+(year/10)*16);
chn_disp (0,0,24,2,8,1,1,digital1+(year%10)*16);
chn_disp (0,0,32,2,16,1,1,timepoint+96); //年
chn_disp (0,0,48,2,8,1,1,digital1+(month/10)*16);
chn_disp (0,0,56,2,8,1,1,digital1+(month%10)*16);
/*---------------------------------------------------------*/
cs1=0;cs2=1;
chn_disp (0,0,0,2,16,1,1,timepoint+128); //月
chn_disp (0,0,16,2,8,1,1,digital1+(date/10)*16);
chn_disp (0,0,24,2,8,1,1,digital1+(date%10)*16);
chn_disp (0,0,32,2,16,1,1,timepoint+160); //日
/*---------------------------------------------------------*/
cs1=1;cs2=0;
chn_disp (0,2,16,2,8,1,1,digital1+(hour/10)*16);
chn_disp (0,2,24,2,8,1,1,digital1+(hour%10)*16);
chn_disp (0,2,32,2,16,1,1,timepoint); //时
chn_disp (0,2,48,2,8,1,1,digital1+(minite/10)*16);
chn_disp (0,2,56,2,8,1,1,digital1+(minite%10)*16);
/*---------------------------------------------------------*/
cs1=0;cs2=1;
chn_disp (0,2,0,2,16,1,1,timepoint+32); //分
chn_disp (0,2,16,2,8,1,1,digital1+(second/10)*16);
chn_disp (0,2,24,2,8,1,1,digital1+(second%10)*16);
chn_disp (0,2,32,2,16,1,1,timepoint+64); //秒
/*---------------------------------------------------------*/
cs1=1;cs2=0;
chn_disp (0,4,8,2,16,1,2,timepoint+192); //星期
chn_disp (0,4,40,2,16,1,1,digital2+(week*16));
/*---------------------------------------------------------*/
cs1=0;cs2=1;
chn_disp (0,4,0,2,16,1,2,setdisp+128); //温度
chn_disp (0,4,32,2,8,1,1,digital1+(Temper/10)*16);
chn_disp (0,4,40,2,8,1,1,digital1+(Temper%10)*16);
chn_disp (0,4,48,2,16,1,1,setdisp+384);
/*---------------------------------------------------------*/
cs1=1;cs2=0;
chn_disp (0,6,0,2,16,1,4,Company);
/**********************************************************/
cs1=0;cs2=1;
chn_disp (0,6,0,2,16,1,3,Company+128);
/**********************************************************/
}
void display1 (void) //设定显示屏
{
lattice_disp(0x00,0x00);
cs1=1;cs2=0;
chn_disp (settimeoff_on,0,0,2,16,1,2,setdisp+0); //时间设定
chn_disp (settimeoff_on,0,32,2,16,1,2,setdisp+256);
chn_disp (setdateoff_on,2,0,2,16,1,2,setdisp+64); //日期设定
chn_disp (setdateoff_on,2,32,2,16,1,2,setdisp+256);
chn_disp (settempoff_on,4,0,2,16,1,2,setdisp+128); //温度设定
chn_disp (settempoff_on,4,32,2,16,1,2,setdisp+256);
chn_disp (setdelayoff_on,6,0,2,16,1,2,setdisp+192); //定时设定
chn_disp (setdelayoff_on,6,32,2,16,1,2,setdisp+256);
cs1=0;cs2=1;
chn_disp (0,0,0,2,8,1,1,digital1+(hour/10)*16); //一行 时间设定
chn_disp (0,0,8,2,8,1,1,digital1+(hour%10)*16);
chn_disp (0,0,16,2,8,1,1,point);
chn_disp (0,0,24,2,8,1,1,digital1+(minite/10)*16);
chn_disp (0,0,32,2,8,1,1,digital1+(minite%10)*16);
chn_disp (0,0,40,2,8,1,1,point);
chn_disp (0,0,48,2,8,1,1,digital1+(second/10)*16);
chn_disp (0,0,56,2,8,1,1,digital1+(second%10)*16);
chn_disp (0,2,0,2,8,1,1,digital1+(year/10)*16); //二行 日期设定
chn_disp (0,2,8,2,8,1,1,digital1+(year%10)*16);
chn_disp (0,2,16,2,8,1,1,point+16);
chn_disp (0,2,24,2,8,1,1,digital1+(month/10)*16);
chn_disp (0,2,32,2,8,1,1,digital1+(month%10)*16);
chn_disp (0,2,40,2,8,1,1,point+16);
chn_disp (0,2,48,2,8,1,1,digital1+(date/10)*16);
chn_disp (0,2,56,2,8,1,1,digital1+(date%10)*16);
chn_disp (0,4,8,2,8,1,1,digital1+(Temper/100)*16); //三行 温度设定
chn_disp (0,4,16,2,8,1,1,digital1+(Temper/10)*16);
chn_disp (0,4,24,2,8,1,1,point+32);
chn_disp (0,4,32,2,8,1,1,digital1+(Temper%10)*16);
chn_disp (0,4,40,2,16,1,2,setdisp+384);
chn_disp (0,6,0,2,8,1,1,digital1+(sethour/10)*16); //四行 定时设定
chn_disp (0,6,8,2,8,1,1,digital1+(sethour%10)*16);
chn_disp (0,6,16,2,8,1,1,point);
chn_disp (0,6,24,2,8,1,1,digital1+(setminite/10)*16);
chn_disp (0,6,32,2,8,1,1,digital1+(setminite%10)*16);
chn_disp (0,6,40,2,16,1,1,setdisp+320+(setoff_on*16));
chn_disp (0,6,56,2,8,1,1,digital1+setnumber*16);
}
void main () // 主程序
{
TMOD=0x11;
TL0=0xF0;
TH0=0xD8;
PT0=1;
TR0=1;
ET0=1;
TL1=0x00;
TH1=0x00;
PT1=0;
TR1=0;
ET1=1;
EA=1;
delay(65535);
delay(65535);
init_lcd ();
delay(65535);
while(1)
{
delay(50000);
display();}
}
void t0(void) interrupt 1 using 1
{
TL0=0xF0; //定时器自动装载方式,10ms定时
TH0=0xD8;
mir++;
if(mir==100)
{
mir=0;
second++;
if(second==59)
{
second=0;
minite++;
if(minite==59)
{
minite=0;
hour++;
if(hour==12) hour=1;
}
}
}
}
void t1(void) interrupt 3 using 1
{
TL1=0x00; //定时器自动装载方式,65.535ms定时
TH1=0x00;
b++;
if(b==15)
{
b=0;
if(falg==0)
display();
if(falg==1)
display1();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -