当前位置:文档之家› 12864多功能数字钟源程序代码(调试成功)

12864多功能数字钟源程序代码(调试成功)

//////////////////////////////////////////////////////////////////////////////////
///// 功 能:提供128*64单色液晶屏通用显示驱动接口,包括任意位置的任意 /////
///// 图像的显示(行范围0-7,列范围0-127),用户也可自行修改部 /////
///// 分参数以满足特殊显示要求 /////
///// 硬件描述:stc89c52 / at89s52/ @12Mhz /////
///// 液晶TG12864B-01(无字库) /////
///// 本液晶为负压驱动:Vout引脚输出-10v电压,用一个10k的可调电阻 /////
///// 把Vout与GND相连,分压输出接到Vo端(18引脚) /////
///// 版权声明:共享资源,MCU小博士不承担任何责任,也不获取任何利益! /////
//////////////////////////////////////////////////////////////////////////////////

#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Data P2

sbit di=P3^2;
sbit rw=P3^3;
sbit e=P3^4;
sbit p_csr=P3^5; //c2
sbit p_csl=P3^6; //c1
sbit p_rst=P3^7;

//--------定义独立键盘----------------
sbit s1=P1^5; //功能键
sbit s2=P1^6; //++
sbit s3=P1^7; //--

uchar count,s1_num;
char miao,shi,fen;

/******************************延时*********************************/
void delay(uint k)
{ uint i;
for(;k>0;k--)
for(i=0;i<124;i++);
}


void init_timer()
{
TMOD=0x01;
TH0=(65536-49950)/256; //为了消除误差,数值应比50000小
TL0=(65536-49950)%256;
EA=1;
ET0=1;
TR0=1;
}
/////////////////////////////////
// 函数名:写命令到LCD //
// 输 入:cmdcode待写入命令 //
// 输 出:无 //
/////////////////////////////////
void write_command(uchar cmdcode,uchar csl,uchar csr)
{ p_csl=csl;
p_csr=csr;
di = 0;
rw = 0;
Data= cmdcode;
delay(0);
e = 1;
delay(0);
e = 0;
}

//////////////////////////////////
// 函数名:写数据到LCD //
// 输 入:Dispdata待写入数据 //
// 输 出:无 //
//////////////////////////////////
void write_data(uchar Dispdata,uchar csl,uchar csr)
{ p_csl=csl;
p_csr=csr;
di = 1;
rw = 0;
Data= Dispdata;
delay(0);
e = 1;
delay(0);
e = 0;
}


//设定起始行
void set_startline(uchar i)
{ i=0xc0+i;
write_data(i,1,1);
}
//定位X(列)方向,Y(页)方向
void set_xy(uchar row,uchar page)
{ row=row+0x40; // 定位到第0列 //
page=page+0xb8; // 定位到第0页 //
write_command(row,1,1);
write_command(page,1,1);
}
//屏幕开启、关闭
void display_on_off(uchar on_off)
{ on_off=on_off+0x3e; //on_off: 1为开,0为关
write_command(on_off,1,1);
}
//复位子函数
void reset()
{
p_rst=0;
delay(20);

p_rst=1;
delay(20);
}

//写数据到LCM
void lcd_write(uchar row,uchar page,uchar dat) /****列**页***地址******/
{ if(row>=64)
{ set_xy(row-64,page);
write_data(dat,0,1);
}
else
{ set_xy(row,page);
write_data(dat,1,0);
}
}
//显示汉字子函数
//xx为该行第xx个字,共8字,yy为第几页,共8行。
void disp_Hz(uchar row,uchar page,uchar n,uchar reverse)
{ uchar i,dx;
for(i=0;i<16;i++)
{ dx=Hanzi[2*i+n*32]; //2*i为选择偶数行,因其为列扫描
if(reverse)
dx=255-dx; //反白显示
lcd_write(row*16+i,page,dx);
dx=Hanzi[(2*i+1)+n*32];
if(reverse)
dx=255-dx;
lcd_write(row*16+i,page+1,dx);
}
}


void disp_Ez(uchar row,uchar page,uchar n,uchar reverse) //显示数字或英语
{ uchar i,dx;

for(i=0;i<8;i++)
{ dx=English[2*i+n*16];
if(reverse)
dx=255-dx;
lcd_write(row*8+i,page,dx); //
dx=English[(2*i+1)+n*16];
if(reverse)
dx=255-dx;
lcd_write(row*8+i,page+1,dx);
}
}

//********************LCM初始化***************************/
void lcd_init(void)
{ uchar row,page;
reset();
display_on_off(0);
for(page=0;page<8;page++)
{ for(row=0;row<128;row++)
lcd_write(row,page,0);
}
display_on_off(1);
set_startline(0);
}



/************时间显示程序*****************************/
void write_time(uchar row,uchar page,uchar date)
{ uchar shi,ge,i,temp;
shi=date/10;
ge=date%10;
for(i=0;i<8;i++)
{ temp=wendu[2*i+shi*16];
lcd_write(row*8+i,page,temp); //
temp=wendu[(2*i+1)+shi*16];
lcd_write(row*8+i,page+1,temp);
}
for(i=0;i<8;i++)
{ temp=wendu[2*i+ge*16];
lcd_write((row+1)*8+i,page,temp); //
temp=wendu[(2*i+1)+ge*16];
lcd_write((row+1)*8+i,page+1,temp);
}
}

void write_time_rs(uchar row,uchar page,uchar date)
{ uchar shi,ge,i,temp;
shi=date/10;
ge=date%10;
for(i=0;i<8;i++)
{ temp=wendu[2*i+shi*16];
temp=255-temp;
lcd_write(row*8+i,page,temp); //
temp=wendu[(2*i+1)+shi*16];
temp=255-temp;
lcd_write(row*8+i,page+1,temp);
}
for(i=0;i<8;i++)
{ temp=wendu[2*i+ge*16];
temp=255-temp;
lcd_write((row+1)*8+i,page,temp); //
temp=wendu[(2*i+1)+ge*16];
temp=255-temp;
lcd_write((row+1)*8+i,page+1,temp);
}
}

void keyscan()
{
if(s1==0)
{
delay(50); //消抖
if(s1==0) //
{
while(s1==1); //s1==0等待松手
s1_num++;
switch(s1_num) //if(s1_num==1)
{
case 1:
TR0=0; //时间停止
write_time_rs(12,4,miao);

break;

case 2:
TR0=0; //时间停止
write_time_rs(9,4,fen);
write_time(12,4,miao); //秒恢复反显

break;
case 3:
TR0=0; //时间

停止
write_time_rs(6,4,shi);
write_time(9,4,fen); //分恢复反显

break;

case 4:
TR0=1; //开定时器
write_time(6,4,shi); //时恢复反显
s1_num=0;
break;
default: break;
}
}
}
}

void time_adjust()
{
if(s2==0&&s1_num!=0)
{
delay(50);
if(s2==0)
{
while(s2==1); // 等待松手
switch(s1_num)
{
case 1:
{ miao++;
if(miao==60) miao=0;
write_time_rs(12,4,miao); //刷新
break;
}
case 2:
{
fen++;
if(fen==60) fen=0;
write_time_rs(9,4,fen); //刷新
break;
}
case 3:
{ shi++;
if(shi==24) shi=0;
write_time_rs(6,4,shi); //刷新
break;
}
default: break;
}
}
}
if(s3==0&&s1_num!=0)
{
delay(70);
if(s3==0)
{ while(s3==1); // 等待松手
switch(s1_num)
{case 1:
{
miao--;
if(miao==-1)
miao=59;
write_time_rs(12,4,miao);
break;
}
case 2:
{
fen--;
if(fen==-1)
fen=59;
write_time_rs(9,4,fen);
break;
}
case 3:
{
shi--;
if(shi==-1)
shi=23;
write_time_rs(6,4,shi);
break;
}
default: break;
}
}
}
}

/**************时间函数模块**********************************/

/******************温度程序模块********************/
void write_temperature(uchar row,uchar page,uchar n)
{ uchar i,temp;
for(i=0;i<8;i++)
{ temp=wendu[2*i+n*16];
lcd_write(row*8+i,page,temp); //
temp=wendu[(2*i+1)+n*16];
lcd_write(row*8+i,page+1,temp);
}
}

/*****************************主函数*************************/
/*************示例说明****************************************/
/* disp_Hz(i,6,i+1,0); ***********************/
//第6行第i=0个位置开始显示(共i个),显示从数组第i+1个字开始*/
/*************************************************************/
void main()
{ uchar i;
init_timer();
lcd_init();
Init_DS18B20();
/***************第0页显示"多功能数字钟"************************/
for(i=0;i<6;i++)
{
disp_Hz(i+1,0,i+6,0);
}
/****************第二页显示“室温:”**************************/
for(i=0;i<3;i++)
{
disp_Hz(i,2,i,0);
}
/*******************第四页显示"时间:00:00:00"***************/
for(i=0;i<3;i++)
{
disp_Hz(i,4,i+3,0);
}

for(i=0;i<8;i++)
{
disp_Ez(i+6,4,i,0);
}
/*************************第六页*****************************/
for(i=0;i<7;i++)
{
disp_Hz(i+1,6,i+12,0); //
}
while(1)
{
keyscan();
time_adjust();
read_temp();
temp_convert();
/*************************第二页

温度显示*********************/

for(i=0;i<8;i++)
{
write_temperature(i+6,2,temperature[i]); //空6格开始写
}

/******************走时程序模块********************************/
if(count==20)
{
count=0;
miao++;
write_time(12,4,miao); //刷新时间
if(miao==60)
{
miao=0;
write_time(12,4,miao); //刷新时间
fen++;
write_time(9,4,fen);
if(fen==60)
{
fen=0;
write_time(9,4,fen); //刷新
shi++;
write_time(6,4,shi);
if(shi==24)
{shi=0;
write_time(6,4,shi);
}
}
}
}
/******************走时程序模块********************************/

}
}

void timer0() interrupt 1 using 0
{
TH0=(65536-49950)/256; //为了消除误差,应该比50000小
TL0=(65536-49950)%256;
count++;
}

/**************************************阴码,逆向,逐列式********************************/
/****************PCtolCD2002************************************************************/
#ifndef ziku
#define ziku

unsigned char code Hanzi[]= {
0x00,0x40,0x10,0x40,0x2C,0x48,0x24,0x49,0xA4,0x49,0x64,0x49,0x25,0x49,0x26,0x7F,
0x24,0x49,0x24,0x49,0xA4,0x49,0x24,0x4B,0x34,0x48,0x2C,0x40,0x04,0x40,0x00,0x00,/*"室",0*/
0x10,0x02,0x21,0xFE,0x86,0x01,0x70,0x40,0x00,0x7F,0x7E,0x41,0x4A,0x41,0x4A,0x7F,
0x4A,0x41,0x4A,0x41,0x4A,0x7F,0x7E,0x41,0x00,0x41,0x00,0x7F,0x00,0x40,0x00,0x00,/*"温",1*/
0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",2*/
0x00,0x00,0xFC,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0xFC,0x07,0x10,0x00,0x90,0x00,
0x10,0x03,0x10,0x40,0x10,0x80,0xFF,0x7F,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,/*"时",0*/
0x00,0x00,0xF8,0xFF,0x01,0x00,0x06,0x00,0x00,0x00,0xF0,0x07,0x92,0x04,0x92,0x04,
0x92,0x04,0x92,0x04,0xF2,0x07,0x02,0x40,0x02,0x80,0xFE,0x7F,0x00,0x00,0x00,0x00,/*"间",1*/
0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",2*/


0x00,0x00,0x00,0x81,0x00,0x89,0x20,0x89,0x90,0x44,0x88,0x44,0x54,0x42,0x53,0x25,
0xA2,0x29,0x22,0x11,0x12,0x11,0x0A,0x09,0x06,0x05,0x00,0x03,0x00,0x01,0x00,0x00,/*"多",0*/
0x00,0x04,0x04,0x0C,0x04,0x04,0x04,0x04,0xFC,0x03,0x04,0x42,0x14,0x22,0x14,0x11,
0x10,0x0C,0x90,0x23,0x7F,0x20,0x10,0x60,0x10,0x20,0xF0,0x1F,0x00,0x00,0x00,0x00,/*"功",1*/
0x10,0x00,0xB8,0xFF,0x97,0x0A,0x92,0x0A,0x90,0x4A,0x94,0x8A,0xB8,0x7F,0x10,0x00,
0x00,0x00,0x7F,0x3F,0x48,0x44,0x48,0x44,0x44,0x42,0x74,0x72,0x20,0x20,0x00,0x00,/*"能",2*/
0x10,0x42,0x92,0x42,0x54,0x2A,0x38,0x2E,0xFF,0x13,0x38,0x1A,0x54,0x26,0x52,0x02,
0x80,0x40,0xF0,0x20,0x1F,0x13,0x12,0x0C,0x10,0x33,0xF0,0x60,0x10,0x20,0x00,0x00,/*"数",3*/
0x00,0x00,0x10,0x02,0x0C,0x02,0x24,0x02,0x24,0x02,0x24,0x42,0x25,0x82,0x26,0x7F,
0xA4,0x02,0x64,0x02,0x24,0x02,0x

04,0x02,0x14,0x02,0x0C,0x02,0x00,0x02,0x00,0x00,/*"字",4*/
0x40,0x01,0x30,0x01,0x2C,0x01,0xEB,0xFF,0x28,0x41,0x28,0x21,0x00,0x00,0xF8,0x01,
0x08,0x01,0x08,0x01,0xFF,0xFF,0x08,0x01,0x08,0x01,0xF8,0x01,0x00,0x00,0x00,0x00,/*"钟",5*/

0x82,0x04,0x42,0x84,0xA2,0x42,0x5A,0x35,0x92,0x24,0x57,0x45,0x32,0x85,0x02,0x7D,
0x32,0x05,0x57,0x05,0x92,0x14,0x52,0x25,0x32,0x65,0x02,0x02,0x02,0x02,0x00,0x00,/*"蔡",0*/
0x00,0x20,0x08,0x1C,0x48,0x00,0x48,0x00,0x48,0x3E,0x48,0x40,0x48,0x40,0x7F,0x41,
0x48,0x4E,0x48,0x44,0x48,0x40,0x48,0x70,0x48,0x22,0x48,0x1C,0x08,0x08,0x00,0x00,/*"志",1*/
0x00,0x80,0x00,0x60,0xF8,0x1F,0x28,0x41,0xE8,0x27,0x28,0x19,0x28,0x49,0x28,0x57,
0x08,0x20,0xFF,0x11,0x08,0x0E,0x0A,0x13,0xEC,0x20,0x48,0x40,0x00,0x30,0x00,0x00,/*"威",2*/
0x00,0x04,0x00,0x02,0x00,0x01,0xC0,0x00,0x70,0x00,0x20,0x40,0x00,0x80,0xFF,0x7F,
0x00,0x00,0x10,0x00,0x20,0x00,0xC0,0x00,0x80,0x01,0x00,0x07,0x00,0x02,0x00,0x00,/*"小",3*/
0x00,0x00,0x20,0x22,0x38,0x23,0xA7,0x22,0x62,0x12,0x18,0x12,0x00,0x20,0xFE,0x3F,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,/*"组",4*/
0x40,0x00,0x41,0x00,0xCE,0x7F,0x04,0x20,0x00,0x90,0x80,0x80,0x40,0x40,0xBE,0x43,
0x82,0x2C,0x82,0x10,0x82,0x10,0xBE,0x2C,0xC0,0x43,0x40,0xC0,0x40,0x40,0x00,0x00,/*"设",5*/
0x20,0x00,0x21,0x00,0x2E,0x00,0xE4,0x7F,0x00,0x20,0x00,0x10,0x20,0x08,0x20,0x00,
0x20,0x00,0x20,0x00,0xFF,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,/*"计",6*/
};
unsigned char code wendu[]={
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",0*/
0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1",1*/
0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00,/*"2",2*/
0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",3*/
0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,/*"4",4*/
0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*"5",5*/
0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00,/*"6",6*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",7*/
0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00,/*"8",8*/
0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00,/*"9",9*/
0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,/*"-",10*/
0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x00,0x00,/*"^",11*/
0xC0,0x07,0x30,0x18,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x38,0x08,0x00,0x00,/*"C",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",13*/
0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",14*/

};
unsigned char code English[]={

0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",0*/
0x

00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*":",2*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",3*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*":",5*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",6*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",7*/

0xE0,0x0F,0x10,0x18,0x08,0x24,0x08,0x24,0x08,0x38,0x10,0x50,0xE0,0x4F,0x00,0x00,/*"Q",0*/
0xE0,0x0F,0x10,0x18,0x08,0x24,0x08,0x24,0x08,0x38,0x10,0x50,0xE0,0x4F,0x00,0x00,/*"Q",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*":",2*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",3*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",4*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",5*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",6*/
0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",7*/
0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",8*/
0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",9*/
0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00,/*"8",10*/
0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",11*/

};


#endif

相关主题
文本预览
相关文档 最新文档