64行显示的管理能力,该指令中L5~L0为显示起始行的地址,取值在0~3FH(1~64行)范围内,它规定了显示屏上最顶一行所对应的显示存储器的行地址。
4)页面地址设置
1 0 1 1 1 P2 P1 P0 该指令设置了页面地址—X地址寄存器的内容。LCM将显示存储器分成8页,指令代码中P2~P0就是要确定当前所要选择的页面地址,取值范围为0~7H,代表第1~8页。该指令规定了以后的读/写操作将在哪一个页面上进行
5)列地址设置
0 1 C5 C4 C3 C2 C1 C0 该指令设置了Y地址数计数器的内容,LCM通过CS的选择分别具有64列显示的管理能力,C5~C0=0~3FH(1~64)代表某一页面上的某一单元地址,随后的一次读或写数据将在这个单元上进行。Y地址计数器具有自动加一功能,在每一次读/写数据后它将自动加一,所以在连续进行读/写数据时,Y地址计数器不必每次都设置一次。
6)写显示数据
该操作将8位数据写入先前已确定的显示存储器的单元内。操作完成后列地址计数器自动加一。
页面地址的设置和列地址的设置将显示存储器单元唯一地确定下来,为后来的显示数据的读/写作了地址的选通。
③接口电路
21
6.总图 (1)原理图
(2)PCB图
22
三软件方案
1.流程图
2.程序 (1)主程序
#include #include\ // 定义变量和子程序 #include\// 12864显示 #include\ // ds1302时钟
/********************主函数************************/ main() { Init1302(); InitLCD(); Inti_main(); while(1) { adc(); donetime(); ShowTime();
23
key(); Showniao(); show(); } }
/*********************按键处理***********************/ void key() {
/******************时间调整**************************/ if(k1==0&&(num==0||num==3)) {
k1_time++; if(k1_time==10||k1_time?==0) { vlu=(vlu+1)%7; switch (vlu) { case 0:flag_WEE=0;break; case 1:flag_YEA=1;break; case 2:flag_MON=1;flag_YEA=0;break; case 3:flag_DAY=1;flag_MON=0;break; case 4:flag_HOU=1;flag_DAY=0;break; case 5:flag_MIN=1;flag_HOU=0;break; case 6:flag_WEE=1;flag_MIN=0;break; default:break; } } }
else k1_time=0;
/******************时间++**************************/ if(k2==0) {
k2_time++; if(k2_time==8||k2_time==0) { if(vlu!=0) { switch (vlu) { case 1:year++;if(year>=100)year=0;break; case 2:month++;if(month>=13)month=0;break; case
3:day++;if(runnian()==0&&day>=ping_tian[month])day=0;
if(runnian()==1&&day>=run_tian[month])day=0; break; case 4:hour++;if(hour>=24)hour=0;break; case 5:minute++;if(minute>=60)minute=0;break; case 6:week++;if(week>=8)week=1;break; default:break; } SetTime(); } if(num!=0&&num!=3) { switch(num) { case 1:shi++;if(shi>=24)shi=0;break; case 2:fen++;if(fen>=60)fen=0;break; } } } }
else k2_time=0;
/*****************时间显示**************************/ void ShowTime() {
24
ShowSecond(); ShowMinute(); ShowHour(); Showweek(); ShowDay(); ShowMonth(); ShowYear(); }
/*****************闹钟显示***********************/ void Showniao() { if((!flag_SHI||half_s)&&flag_NIAO) { ShowASC(6,64,shi/10+0x30); ShowASC(6,72,shi+0x30); } else { ShowASC(6,64,0x3a); ShowASC(6,72,0x3a); } if((!flag_FEN||half_s)&&flag_NIAO) { ShowASC(6,88,fen/10+0x30); ShowASC(6,96,fen+0x30); } else { ShowASC(6,88,0x3a); ShowASC(6,96,0x3a); } }
/****************判断2000-2099中的闰年*******************/ bit runnian(void) { if(year%4==0) flag_run=1; else flag_run=0; return flag_run; }
/****************温度显示***************************/ void adc(void) { uint adc_data; adc_data=P1; adc_data=adc_data*10/51; ShowASC(0,80,adc_data/10+0x30); ShowASC(0,88,adc_data+0x30); }
/*****************初始化*************************/ void Inti_main(void) { EA=1; TMOD=0x01; TH0=-50000/256; TL0=-50000%6; ET0=1; TR0=1; }
/*****************闹钟铃声*************************/ void show(void) {
if(hour==shi&&minute==fen&&Ms50==9&&niao_hao)
25