带字库12864 串口 时钟显示
51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)2009-10-19 16:47经过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。
目前还不能修改时间与日期,只是以预定时间以始。
适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟)实现功能:简单,数字时钟+日期(以后会不断完美)。
C语言源程序如下:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*DS1302 端口设置 */sbit SCK=P3^6; //DS1302时钟sbit SDA=P3^4; //DS1302 IOsbit RST = P3^5; // DS1302复位bit ReadRTC_Flag; //读DS1302全局变量/* 12864端口定义*/#define LCD_data P0 //带字库液晶12864数据口sbit LCD_RS = P2^4; //寄存器选择输入sbit LCD_RW = P2^5; //液晶读/写控制sbit LCD_EN = P2^6; //液晶使能控制sbit PSB=P2^1; //并口控制sbit RES=P2^3;uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字uchar code dis2[] = {"有志者,事竟成!"};uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp;#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};void lcd_pos(uchar X,uchar Y); //确定显示位置unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年09-10-19 16:07:00code unsigned charwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned charread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/*******************************************************************/ /* */ /* 延时函数 */ /* */ /*******************************************************************/void delay(unsigned int m) //延时程序{unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}/*******************************************************************/ /* */ /*检查LCD忙状态 *//*lcd_busy为1时,忙,等待。
12864zk红外遥控数字时钟

/*---------------------------------------------------------------------------红外遥控多功能数字时钟程序单片机:STC89C52RC晶振:12MHz时钟芯片:DS1302液晶屏:LCM-12864-ST7920功能描述: 大数字显示时间;能显示农历、温度和设置闹铃;有整点报时功能红外遥控和按键都能设置时间和闹铃说明:LCM12864使用并口连接方式,PSB、RST接高电平------------------------------------------------------------------------------*//*-------------------------------头文件---------------------------------------*/#include <reg52.h>#include <intrins.h>#include "LCD12864.h"#include "DS1302.h"#include "DS18B20.h"#include "nongli.h"#include "displaytime.h"#include "zk.h"#include "bell.h"#include "HW.H"#include "delay.h"#define uint unsigned int#define uchar unsigned char/*--------------------定义按键-----------------------------------------------*/sbit K1 = P1^0; //K1-设置sbit K2 = P1^1; //K2-确认、返回sbit K3 = P1^2; //K3-加sbit K4 = P1^3; //K4-减//K5=P1^4,K5-控制闹钟的打开与关闭,在"hw.h"中定义/*---------------------函数声明------------------------------*/void ds_w0(void);void ds_w(void);void Conver_week(bit c,uchar year,uchar month,uchar day);/*-----------------------------定义全局变量------------------------------*/bit w=0; //调时标志位unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)signed char address,item,item0,max,mini;unsigned char clk_ala[2]={0x00,0x00};//闹钟数据存放初,始值为00:00unsigned char hour,minute,time;//用于闹铃的设置/*-----------------------------日期、时间设置函数-----------------------------*/void tiaozheng(void){yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中week = read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中//----------------------------------lcm_w_test(0,0x80);lcm_w_word("20");//显示内容字符20lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示lcm_w_test(1,yy%16+0x30);//函数lcm_w_word("年");//----------------------------------lcm_w_test(1,(mo/16)+0x30);lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示lcm_w_word("月");//调用字符显示函数,显示文字月//----------------------------------/*lcm_w_test(0,0x88);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H (第三行左端)lcm_w_word("星期");//调用字符显示函数,显示文字星期lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示*///----------------------------------lcm_w_test(1,(dd/16)+0x30);lcm_w_test(1,dd%16+0x30);//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码lcm_w_word("日");//显示字符日//----------------------------------if(read_clock(0x85) != hh){//如果程序中的小时与1302芯片中的不同,hh = read_clock(0x85);//刷新程序中的小时数据}lcm_w_test(0,0x91);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H (第三行左端)lcm_w_test(1,(hh/16)+0x30);//显示十位lcm_w_test(1,hh%16+0x30);//显示个位lcm_w_word("时");//----------------------------------if(read_clock(0x83) != mm){//如果1302芯片中的分钟数据与程序中的分钟变量不相等mm = read_clock(0x83);//刷新程序中的分钟数据}lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数lcm_w_test(1,mm%16+0x30);//向液晶写数据,显示分钟的个位数lcm_w_word("分");//----------------------------------if(read_clock(0x81) != ss){//如果1302芯片中的分钟数据与程序中的秒钟变量不相等(0x81为读秒数据0x80为写秒数据)ss = read_clock(0x81);//刷新程序中的秒钟数据}lcm_w_test(1,(ss/16)+0x30);//向液晶写数据,显示分钟的十位数lcm_w_test(1,ss%16+0x30);//向液晶写数据,显示分钟的个位数lcm_w_word("秒");////////////////////////////////////////////////////////////////////////=========显示闹钟的设置时间===================hour=clk_ala[0]; //取出上一次的闹钟小时值minute=clk_ala[1]; //取出上一次的闹钟分钟值lcm_w_test(0,0x88);lcm_w_word("闹钟---");//----------------------------lcm_w_test(1,(hour/10)+0x30);//显示小时十位lcm_w_test(1,(hour%10)+0x30);//显示小时个位//----------------------------lcm_w_word(":");//----------------------------lcm_w_test(1,(minute/10)+0x30);//显示分钟的十位lcm_w_test(1,(minute%10)+0x30);//显示分钟的个位//----------------------------lcm_w_word("----");}/*****************************************************************************/ //被调数据加一或减一,并检查数据范围,写入1302指定地址保存void ds_w(void){item0=time;item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;//时间的调整if(K3 == 0||key_add==1){//如果按动上调键item++;//数加1}if(K4 == 0||key_minish==1){//如果按动下调键item--;//数减1}if(item>max) item=mini;//查看数值是否在有效范围之内if(item<mini) item=max;//如果数值小于最小值,则自动等于最大值write_clock(0x8e,0x00);//允许写1302芯片操作write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302write_clock(0x8e,0x80);//写保护,禁止写操作}/********************************************************************///===============闹钟时间的加减设置======================void ds_w0(void){item0=time;if(K3 == 0||key_add==1){//如果按动上调键item0++;//数加1}if(K4 == 0||key_minish==1){//如果按动下调键item0--;//数减1}if(item0>max) item0=mini;//查看数值是否在有效范围之内if(item0<mini)item0=max;//如果数值小于最小值,则自动等于最大值time=item0;//调整后的时间重新赋值给time(time为hour或minute),这步很重要,没有将无法更新闹钟数据}/****************************************************************************** ****************************///调整时间子函数,设置键、数据范围、上调加一,下调减一功能。
12864点阵LCD液晶屏带中文字库

功能
令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
待命
进入待命模式,执行其他指令都棵终止
0 0 0 0000001
模式
待命模式
卷动地 SR=1:允许输入垂直卷动地址
址开关 0 0 0 0 0 0 0 0 1 SR SR=0:允许输入 IRAM 和 CGRAM 地址
开启
反白
选择 2 行中的任一行作反白显示,并可决定反白与否。初始值 R1R
0 0 0 0 0 0 0 1 R1 R0
选择
0=00,第一次设定为反白显示,再次设定变回正常
睡眠
SL=0:进入睡眠模式
0 0 0 0 0 0 1 SL X X
模式
SL=1:脱离睡眠模式
CL=0/1:4/8 位数据 扩充
RE=1: 扩充指令操作 功能 0 0 0 0 1 CL X RE G 0
RE=0: 基本指令操作 设定
示移位控 0 0 0 0 0 1 S/C R/L X X RAM 的内容
制
DL=0/1:4/8 位数据 功能
0 0 0 0 1 DL X RE X X RE=1: 扩充指令操作 设定
RE=0: 基本指令操作
设定 CG
RAM
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定 CGRAM 地址
G=1/0:绘图开关
设定
设定绘图 RAM
绘图 RA
0 0 0 AC3 AC2 AC1 AC0 先设定垂直(列)地址 AC6AC5…AC0
001
M
AC6 AC5 AC4 AC3 AC2 AC1 AC0 再设定水平(行)地址 AC3AC2AC1AC0
地址
将以上 16 位地址连续写入即可
带中文字库的12864lcd显示程序

for(j = 100; j > 0; j--); }
// 检测 LCD是否处于忙状态 , 若忙返回 1, 空闲返回 0 bit checkBusy() { bit busy;
RS = 0; RW = 1; E = 1; delayUs(); busy = (bit)(LCD_DATA&0x80); E = 0; return busy; }
1
文档来源为 :从网络收集整理 .word 版本可编辑 .欢迎下载支持 .
// 等待 LCD到空闲 void wait() {
while(checkBusy()); }
// 写命令 void writeCmd(uchar cmd) {
wait(); RS = 0; RW = 0; E = 0; delayUs(); LCD_DATA = cmd; delayUs(); E = 1; delayUs(); E = 0; }3ຫໍສະໝຸດ delayMs(10); }
void setPosition(uchar x, uchar y) { uchar p;
switch(x%4) {
case 0: p = 0x80; break; // case 1: p = 0x90; break; // case 2: p = 0x88; break; // case 3: p = 0x98; break; // } p += y; writeCmd(p); }
PSB = 1; // 并口方式 writeCmd(0x30); // 基本指令 , 扩充指令为 34H delayMs(10); writeCmd(0x0c); // 显示开 , 关光标 delayMs(10); writeCmd(0x01); // 清屏
12864时钟显示程序

/************12864时钟显示函数*************//******实现时间走动、按键控制、蜂鸣器闹铃******/#include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P0^7;sbit rw=P0^6;sbit en=P0^5;sbit beet=P0^4; //蜂鸣器定义sbit key1=P3^5; //功能选择sbit key2=P3^4; //至加sbit key3=P3^3; //至减char hour=23;char minute=59;char second=46;int years=2012;char month=12;char day=30;uchar count=0;char mm;char cc;uchar code table1[]={"创新工作室"};uchar code table2[]={" 应用电子"};/*************************延时函数****************************/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*********地址初始化*************/void xieling_shu(uchar aa,uchar bb){if(aa==1){rs=0;}if(aa==0){rs=1;}rw=0;P2=bb;delay(1);en=1;delay(1);en=0;delay(1);}/***********************液晶12864写入地址*********************/ void xieludizhi(uchar x, uchar y){switch(x){case 1:xieling_shu(1,0x80 + y ); return;//return 返回的意思case 2:xieling_shu(1,0x90 + y ); return;case 3:xieling_shu(1,0x88 + y ); return;case 4:xieling_shu(1,0x98 + y ); return;}}/**********************液晶12864写入字符串********************/ void xiezifuchuan(uchar *dd){while(*dd != '\0'){xieling_shu(0,*dd++ );}}/********************** 液晶12864清屏函数*********************/ void qingping(){xieling_shu(1,0x01); //清屏xieling_shu(1,0x01); //清屏xieling_shu(1,0x01); //清屏delay(20);}/********************液晶12864初始化显示函数******************/ void init_12864(){ mm=0;cc=7; //选择星期初始化xieling_shu(1,0x30); //基本指令操作xieling_shu(1,0x30); //基本指令操作xieling_shu(1,0x0C); //0x0c: 无光标,OXOF: 光标反白显示xieling_shu(1,0x01); //清屏xieling_shu(1,0x06);}/******************* 液晶12864初始化字串显示******************/ void init_zifu(){//qingping();xieludizhi(1,0);xiezifuchuan(table1); //delay(1);xieludizhi(4,0);xiezifuchuan(table2); //delay(1);xieludizhi(3,0);xieling_shu(0,0x30+hour/10);xieling_shu(0,0x30+hour%10);xieling_shu(0,':');xieling_shu(0,0x30+minute/10);xieling_shu(0,0x30+minute%10);xieling_shu(0,':');xieling_shu(0,0x30+second/10);xieling_shu(0,0x30+second%10);xieludizhi(3,5);xiezifuchuan("星期");xieludizhi(2,0);xieling_shu(0,0x30+years/1000);xieling_shu(0,0x30+years%1000/100);xieling_shu(0,0x30+years%100/10);xieling_shu(0,0x30+years%10);xiezifuchuan("年");xieling_shu(0,0x30+month/10);xieling_shu(0,0x30+month%10);xiezifuchuan("月");xieling_shu(0,0x30+day/10);xieling_shu(0,0x30+day%10);xiezifuchuan("日");}/***************星期函数***************/void xingqi(){switch(cc){case 1: xieludizhi(3,7); xiezifuchuan("一"); return;case 2: xieludizhi(3,7); xiezifuchuan("二"); return;case 3: xieludizhi(3,7); xiezifuchuan("叁"); return;case 4: xieludizhi(3,7); xiezifuchuan("四"); return;case 5: xieludizhi(3,7); xiezifuchuan("五"); return;case 6: xieludizhi(3,7); xiezifuchuan("六"); return;case 7: xieludizhi(3,7); xiezifuchuan("日"); return;}}/***************按键程序***************/void anjian(){if(key1==0) //key1按键选择功能{ mm++;delay(1);if(mm==1){xieludizhi(3,3);xieling_shu(0,0x5f);}if(mm==2){TR0=1;xieludizhi(3,2);xieling_shu(0,0x5f);}if(mm==3){xieludizhi(3,0);xieling_shu(0,0x5f);}if(mm==4){xieludizhi(2,5);xieling_shu(0,0x5f);}if(mm==5){xieludizhi(2,3);xieling_shu(0,0x5f);}if(mm==6){xieludizhi(2,1);xieling_shu(0,0x5f);}if(mm==7){xieludizhi(3,5);xieling_shu(0,0x5f);}if(mm==8){xieludizhi(2,7);xieling_shu(0,0x02);}if(mm==9){xieludizhi(2,7);xieling_shu(1,0x01);mm=0;}} //key2按键控制if(mm==1&&key2==0) //秒加1{TR0=0;delay(1);if(key2==0){second++;if(second==60){second=0;}}}if(mm==1&&key3==0) //秒减1{TR0=0;delay(1);if(key3==0){second--;if(second==-1){second=59;}}}if(mm==2&&key2==0) //分加1 { delay(1);if(key2==0){minute++;if(minute==60){minute=0;}}}if(mm==2&&key3==0) //分减1 { delay(1);if(key3==0){minute--;if(minute==-1){minute=59;}}}if(mm==3&&key2==0) //时加1 { delay(1);if(key2==0){hour++;if(hour==24){hour=0;}}}if(mm==3&&key3==0) //时减1 { delay(1);if(key3==0){hour--;if(hour==-1){hour=23;}}}if(mm==4&&key2==0) //日加1 { delay(1);if(key2==0){day++;if(day==31){day=1;}}}if(mm==4&&key3==0) //日减1 { delay(1);if(key3==0){day--;if(day==0){day=30;}}}if(mm==5&&key2==0) //月加1 { delay(1);if(key2==0){month++;if(month==13){month=1;}}}if(mm==5&&key3==0) //月减1 { delay(1);if(key3==0){month--;if(month==0){month=12;}}}if(mm==6&&key2==0) //年加1 { delay(1);if(key2==0){years++;}}if(mm==6&&key3==0) //年减1 { delay(1);if(key3==0){years--;}}if(mm==7&&key2==0) //星期加1 { delay(1);if(key2==0){cc++;if(cc==8){cc=1;}}}if(mm==7&&key3==0) //星期减1 { delay(1);if(key3==0){cc--;if(cc==0){cc=7;}}}}/***************************定时器函数************************/void init_t0_t1() //定时器t0,t1初始化函数{TMOD=0x11;EA=1;ET0=1;TR0=1; //开启中断TH0=(65536-50000)/256;TL0=(65536-50000)%256;}/**************主函数**************/void main(){init_12864();init_t0_t1();while(1){init_zifu();anjian();xingqi();}}/***************中断函数***************/void time() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(hour==0&minute==0&second==0||hour==0&minute==1&second==0||hour==0&minute==1&s econd==5)//采用与或逻辑设定闹铃{beet=0;delay(5);beet=1;}count++;if(count==20){count=0;second++;}if(second==60){second=0;minute++;}if(minute==60){minute=0;hour++;}if(hour==24){hour=0;day++;cc++;if(cc==8){cc=1;}}if(day==31){day=1;month++;}if(month==13){month=1;years++;}}。
51单片机带字库12864液晶动态汉字显示C语言源程序

51单片机带字库12864液晶动态汉字显示C语言源程序2009-10-17 19:36实验芯片为:AT89S52,带字库液晶屏:12864,实现的目的:动态一个汉字一个汉字显示。
其实和显示汉字的程序一样,只是稍做一下修改即可。
C语言源程序如下:#include <stdio.h>#include <math.h>#include <reg52.h>#include <string.h>sbit RS=P2^4;sbit WRD=P2^5;sbit E=P2^6;sbit PSB=P2^1;sbit RES=P2^3;void TransferData(char data1,bit DI);void delayms(unsigned int n);void delay(unsigned int m);void lcd_mesg003(unsigned char code *addr1);unsigned char code IC_DAT[]={"我是一个中国人啊"};void initinal(void){delay(40);PSB=1; //并口工作模式delay(1);RES=0; //复位delay(1);RES=1; //复位置高delay(10);TransferData(0x30,0);delay(100);TransferData(0x30,0);delay(37);TransferData(0x08,0);delay(100);TransferData(0x10,0);delay(100);TransferData(0x0C,0);delay(100);TransferData(0x01,0);delay(10);TransferData(0x06,0);delay(100);}void main(void){while(1){initinal();//调用LCD字库初始化程序delay(100);lcd_mesg003(IC_DAT);}}void lcd_mesg003(unsigned char code *addr1){unsigned char i;//第一行TransferData(0x80,0);delay(100);for(i=0;i<16;i++){TransferData(*addr1,1);addr1++;delayms(50);}}void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据{WRD=0;RS=DI;delay(1);P0=data1;E=1;delay(1);E=0;}void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<2000;j++);}void delay(unsigned int m){unsigned int i,j;for(i=0;i<m;i++)for(j=0;j<10;j++);}原理就是在显示每个汉字的时候加了一个延时程序,当然可以用定时器来实现,这样的话,不占用CPU处理时间。
SG12864-12带汉字库LCD显示器

72us
DDRAM 的地址计数器(AC)到“00H”
卷动地址或
00 0
0
0
0
0
0
1 SR SR=1:允许输入垂直卷动地址
72us
IRAM 地址
选择
反白选择 0 0
睡眠模式 0 0
扩充功能设
00
定
设定 IRAM 地址或卷动 0 0
地址 设定绘图
00
RAM 地址
深圳市显能实业有限公司 SHENZHNE SHINE INDUSTRY CO;LTD SG12864 中文字库
7、设定 CGRAM 位址
CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L
L
L
H AC5 AC4 AC3 AC2 AC1 AC0
功能:设定 CGRAM 位址到位址计数器(AC)
8、设定 DDRAM 位址
CODE: RW RS
L
L
深圳市显能实业有限公司 SHENZHNE SHINE INDUSTRY CO;LTD SG12864 中文字库
X
深圳市显能实业有限公司 SHENZHNE SHINE INDUSTRY CO;LTD SG12864 中文字库
0
0
0
1
D
C
B C=1:游标 ON
开/关
B=1:游标位置 ON
游标或显示移
位控制
00 0
0
功能设定 0 0 0 0
0
1 S/C R/L X
0
1 DL X
X
RE
设定游标的移动与显示的移位控制位
X
元;这个指令并不改变 DDRAM 的内容
毕业设计—基于单片机的12864时钟显示

学士学位毕业论文(设计)题目:基于单片机的12864时钟显示摘要电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。
它可以对年、月、日、星期、时、分、秒进行计时,采用直观的数字显示,可以同时显示年月日时分秒等信息,还有时间校准等功能。
该电子时钟主要采用STC89C52单片机作为主控核心,用DS1302时钟芯片作为时钟、液晶12864显示屏显示。
STC89C52单片机是由深圳宏晶科技公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的12864液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。
此外,该电子时钟还具有时间校准等功能。
关键词:STC89C51单片机,DS1302时钟芯片,液晶12864AbstractElectronic clock is a very extensive daily timing tool, to the people has brought great convenience, more and more popular in the community. It can be the year, month, date, day, hour, minute, second for a time, using intuitive digital display, can display information such as year, month, day, hour, and time alignment functions. The electronic clock is used mainly as a master STC89C52 microcontroller core, with theDS1302 clock chip as a clock, LCD display12864. STC89C52 SCM is a Shenzhen Hong Crystal Technology has introduced, power consumption, voltage can be selected 4 ~ 6V voltage power supply; DS1302 clock chip is American DALLAS company launched with a fine current charging low-power real-time clock chip, it can year, month, date, day, hour, minute, second for a time, also has a leap year compensation and other functions, DS1302 and long life, small error; 12864 LCD digital display isused to display that can display year, month, date, day, hour, minute, second and so on. In addition, the electronic clock also has a time calibration function.Key Words:STC89C51 microcontroller, DS1302 clock chip, LCD 12864目录1绪论 (3)1.1时钟发展史 (3)1.2 目前的研究现状 (4)1.3研究目的及意义 (4)2 总体方案设计 (5)2.1 方案的选择 (5)2.1.1设计要求 (5)2.1.2方案的选择 (5)2.2总体方案组成框图 (6)3系统硬件设计 (6)3. 1主芯片模块 (6)3.1.1 中断系统 (8)3.1.2常用寄存器 (8)3.2晶振和复位电路 (10)3.2.1晶振电路 (10)3.2.2复位电路 (11)3.3 DS1302时钟芯片电路 (11)3.3.1 DS1302引脚图 (11)3.3.2 DS1302寄存器 (12)3.3.3 DS1302外围电路 (13)3.4 LCD12864显示模块 (13)3.4.1 LCD12864引脚功能 (13)3.4.2 LCD12864指令说明 (14)3.4.3 LCD12864电路接线 (15)3.5 红外遥控模块 (16)4 系统软件设计 (17)4.1 主程序设计 (17)4.2 LCD12864驱动程序 (19)4.3 DS1302驱动程序 (21)4.4 红外遥控程序 (24)5 调试结果 (25)5.1 正常显示日期时间画面 (26)5.2 进入调整时间日期画面 (26)5.3图片显示画面 (26)6总结 (27)致谢 (28)参考文献 (29)附录一 (31)附录二 (32)1绪论1.1时钟发展史很早以前,人类主要是利用天文现象和流动物质的连续运动来计时。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sendbyte(Ldata);//发送低四位
delaynms(1); //延时是必须的
}
void sendbyte(unsigned char bbyte) //发送一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SID=bbyte&0x80; //取出最高位
k=n%1000%100/10; //取余取整运算,求得十位数字
l=n%1000%100%10; //取余取整运算,求得个位数字
write(0,0x80); //写显示地址
write(1,ma4[i]); //将千位数字的字符常量写入LCD
write(1,ma4[j]); //将百位数字的字符常量写入LCD
write(1,ma4[i]); //将十位数字的字符常量写入LCD
write(1,ma4[j]); //将个位数字的字符常量写入LCD
}
/*********************************************************************
main function
write(0,0x01); //清屏,将DDRAM的地址计数器归零
}
void write(bit start, unsigned char ddata) //写指令或数据bit start;定义一个位的变量,他是1或0
{
unsigned char start_data,Hdata,Ldata;
if(start==0) start_data=0xf8;//写指令
write(1,ma4[i]); //将十位数字的字符常量写入LCD
write(1,ma4[j]); //将个位数字的字符常量写入LCD
}
/******************************************************************************
函数功能:显示日
******************************************************************************/
void DisplaySecond()
{
unsigned char i,j;
i=s/10;
j=s%10;
write(0,0x8d); //写显示地址,将十位数字显示在第2行第11列
/*12864LCD(ST7920)驱动程序
可显示年月日时分秒及加减时钟切换*/
#include <REGx51.H>
/*引脚定义*/
#define CS P2_0//片选高电平有效单片LCD使用时可固定高电平
#define SID P2_1//串数究谳
#define SCLK P2_2//串同步时钟信号
******************************************************************************/
void miao()
{
unsigned char i,j;
i=ss/10;
j=ss%10;
write(0,0x8d); //写显示地址,将十位数字显示在第2行第11列
write(1,ma4[i]); //将十位数字的字符常量写入LCD
write(1,ma4[j]); //将个位数字的字符常量写入LCD
}
/******************************************************************************
函数功能:显示小时
******************************************************************************/
voiБайду номын сангаас DisplayHour()
{
unsigned char i,j;
i=h/10;
j=h%10;
write(0,0x89); //写显示地址,将十位数字显示在第2行第5列
函数功能:显示小时
******************************************************************************/
void shi()
{
unsigned char i,j;
i=hh/10;
j=hh%10;
write(0,0x89); //写显示地址,将十位数字显示在第2行第5列
write(1,ma4[i]); //将十位数字的字符常量写入LCD
write(1,ma4[j]); //将个位数字的字符常量写入LCD
}
/******************************************************************************
函数功能:显示年
PSB=0; ;//串口驱动模式;PSB=1时为并行
// RESET=0; delaynms(1); RESET=1; //复位LCD
// CS=1; //串行数据口
write(0,0x30); // DL=0,4位数据;DL=1,8位数据RE=1,扩充指令操作;RE=0,基本指令操作;
write(0,0x0c); //显示打开,光标关,反白关
******************************************************************************/
void nian()
{
unsigned char i,j,k,l;
i=n/1000; //取整运算,求得千位数字
j=n%1000/100; //取余取整运算,求得百位数字
unsigned char code ma4[]={"0123456789"};
unsigned char code ma5[]={"年"};
unsigned charcode ma6[]={"月"};
unsigned char code ma7[]={"日"};
unsigned int count; //定义变量统计中断累计次数
******************************************************************************/
void DisplayMinute()
{
unsigned char i,j;
i=m/10;
j=m%10;
write(0,0x8b); //写显示地址,将十位数字显示在第2行第8列
else start_data=0xfa; //写数据
Hdata=ddata&0xf0;//取高四位
Ldata=(ddata<<4)&0xf0;//取低四位
sendbyte(start_data);//发送起始信号
delaynms(5); //延时是必须的
sendbyte(Hdata);//发送高四位
SCLK=1;
SCLK=0;
bbyte<<=1; //左移
}
}
void delaynms(unsigned int di) //延时
{
unsigned int da,db;
for(da=0;da<di;da++)
for(db=0;db<10;db++);
}
/******************************************************************************
void lcdtest(void);
void lcdcls(void);
/*存放字符串的数组*/
unsigned char code ma[] ={"2015年08月24日"};
unsigned char code ma2[]={"时分秒"};
unsigned char code ma3[]={"12864液晶时钟"};
unsigned int s,m,h; //定义变量储存秒、分钟和小时
unsigned int ss,mm,hh; //定义变量储存秒、分钟和小时
unsigned int n,u,r; //定义变量储存年、月、日
void lcdinit(void)//初始化LCD
{
delaynms(10); //启动等待,等LCM讲入工作状态
***********************************************************************/
void main(void)
{
unsigned char i;
lcdinit();
write(1,ma4[i]); //将十位数字的字符常量写入LCD
write(1,ma4[j]); //将个位数字的字符常量写入LCD
}
/******************************************************************************
函数功能:显示秒
void write(bit start, unsigned char ddata);//bit start;定义一个位的变量,他是1或0
void sendbyte(unsigned char bbyte);