LCD12864指针式模拟时钟(基于51)

合集下载

基于51单片机的数码管时钟(带闹钟调时秒表)

基于51单片机的数码管时钟(带闹钟调时秒表)

基于51单片机的数码管时钟(带闹钟调时秒表)/**************************************************************** ************ ** *********************************************************** ** * * ** * * ** * 基于51单片机的数码管时钟程序* ** ** * * ** * * *********************************************************** ** ** ************************************************************ ****************/#include<stdio.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //申明u1锁存器的锁存端sbit wela=P2^7; //申明u2锁存器的锁存端sbit key1=P3^0; //功能键sbit key2=P3^1;//增大键sbit key3=P3^2;//减小键sbit key4=P3^3;//秒表查看键sbit beep=P2^3;//蜂鸣端uchar num,num1,num2,numm;uchar numf,num,nums,num;uchar s,s1,f,f1,m,m1;uchar ns,ns1,nf,nf1;uchar numns,numnf;uchar dingshi;void display(uchar m,uchar m1,ucharf,uchar f1,uchar s,uchar s1);void display1(uchar nf,uchar nf1,uchar ns,uchar ns1);void key();void key1();void alram();void di();void delayms(xms);void T0_time() interrupt 1;void miaobiao();uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x77,0x7c,0x39,0x5e,0x79,0x71};/*********************************************************主函数void main()*********************************************************/int main(){TMOD=0X01;TH0=(65536-46080)/256;TL0=(65536-46080)%256;EA=1;ET0=1;TR0=1;nums=12;numf=0;num2=0;num=0;while(1){if(dingshi==0){keyscan();display(m,m1,f,f1,s,s1);alarm();}else{miaobiao();keyscan1();display1(nf,nf1,ns,ns1);}}return 0;}/********************************************************* 蜂鸣器函数di()*********************************************************/ void di(){beep=0;delayms(100);beep=1;}/********************************************************** 按键调时函数key()**********************************************************/ void keyscan(){if(key1==0){delayms(10);display(m,m1,f,f1,s,s1);}}}/********************************************** 按键设定闹钟函数keyscan1();***********************************************/ void keyscan1(){if(key1==0){delayms(10);if(key1==0){ numns++;if(numns==24);numns=0;while(!key1);di();display1(nf,nf1,ns,ns1);}}if(key2==0){delayms(10);if(key2==0){ numnf++;if(numnf==24);numnf=0;while(!key2);di();display1(nf,nf1,ns,ns1);}}if(key3==0){delayms(10);if(key3==0){dingshi=0;while(!key1);di();display1(nf,nf1,ns,ns1);}}}/********************************************************* 闹钟函数alram()*********************************************************/ void alram(){if((nums==numns)&&(numnf==numf))beep=0;}/*********************************************************秒表函数miaobiao()*********************************************************/ void miaobiao(){if(key4==0){delayms(100);if(key4==0){while(!key4);di();displaym(uchar m,uchar m1);}}}/********************************************************* 正常显示函数display()*********************************************************/ void display(uchar m,uchar m1,ucharf,uchar f1,uchar s,uchar s1){dula=1;P0=table[m1]//秒位第1位dula=0;PO=0xff;// 送入位选信号前关闭所有显示,防止打开位选锁存时wela=1;P0=0xef;wela=0;delayms(10);dula=1;P0=table[m]; //秒第2位dula=0;P0=0xff;wela=1;P0=0xdf;wela=0;delayms(100)dula=1;P0=table[f1]; //分第1位dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayms(100)dula=1;P0=table[f]; //分第2位dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delayms(10)dula=1;P0=table[s1]; //时第1位dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayms(100)dula=1;P0=table[s]; //时第2位dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(10)}/********************************************************** ***调时闹钟显示函数display1()*********************************************************** **/void display1(uchar nf,uchar nf1,uchar ns,uchar ns1){nf1=numnf/10;nf=numnf%10;ns1=nums/10;ns=nums%10;dula=1;P0=table[nf1];//分第1位dula=0;P0=0xff;wela=1;P0=0xfb;//待改参数wela=0;delayms(10);dula=1;P0=table[nf];//分第2位dula=0;P0=0xff;wela=1;P0=0xf7;//待改参数wela=0;delayms(10);P0=table[ns1];//时第1位dula=0;P0=0xff;wela=1;P0=0xfe;//待改参数wela=0;delayms(10);dula=1;P0=table[ns];//时第2位dula=0;P0=0xfd;wela=1;P0=0xff;//待改参数wela=0;delayms(10);}/********************************************************** ***秒表显示函数displaym()*********************************************************** **/void displaym(uchar m,uchar m1){dula=1;P0=table[m1];//秒位第一位P0=0xff;wela=1;P0=0Xbf;wela=0;delayms(10);dula=1;P0=table[m];dula=0;P0=0xff;wela=1;P0=0X7f;wela=0;delayms(10);}/**************************************************** 中断服务函数void T0_time() interrupt 1****************************************************/ void T0_time() interrupt 1{TH0=(65536-45872)/256; //46080TL0=(65536-45872)%256;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if(nums==24)nums=0;}}}/*************************************************** 延时函数delayms()***************************************************/ void delayms(xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }。

电子信息工程专业毕业设计--基于51单片机的12864液晶显示器的设计和研究

电子信息工程专业毕业设计--基于51单片机的12864液晶显示器的设计和研究

目录设计总说明 (I)INTRODUCTION (II)1 绪论 (1)1.1课题背景及研究意义 (1)1.2课题研究的主要内容 (1)1.3国内外发展状况与存在问题 (1)2 总体方案设计与论述 (2)2.1 系统需求分析 (2)2.2 系统总体方案设计 (2)2.2.1 设计方案论证 (2)2.2.2总体结构框图 (3)3系统单元模块设计 (3)3.1系统硬件示意图 (3)3.2主控芯片(STC89C52模块)[5] (4)3.3 时钟控制模块[13] (6)3.3.1 DS1302简介 (6)3.3.2引脚及功能表 (7)3.3.3工作原理 (7)3.3.4 DS1302电路设计图[9] (8)3.4 温度控制模块 (8)3.5 12864接口电路模块 (9)3.6 按键电路模块 (9)3.7 电源电路模块 (10)3.8 印制电路板[9] (10)4系统整体调试与结果分析 (11)4.1 系统总体程序流程介绍 (11)4.2 按键程序设计 (13)4.3 12864驱动程序设计[15] (14)4.3.1 ST7920芯片介绍[14] (14)4.3.2 ST7920驱动程序设计 (17)4.4 12864应用程序设计 (20)4.4.1 文字显示程序设计 (20)4.4.2 点、线显示程序设计 (22)4.4.3 图形、图片显示程序设计 (23)4.5 菜单程序设计 (26)5设计调试及进一步研究 (28)5.1 系统测试 (28)5.1.1 软件调试 (28)5.1.2 硬件调试 (29)5.2 进一步研究的工作 (30)6总结 (30)鸣谢................................................................................................................................ 错误!未定义书签。

基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计1. 本文概述随着现代科技的发展,电子时钟已成为日常生活中不可或缺的一部分。

本文旨在介绍一种基于51单片机的多功能电子钟的设计与实现。

51单片机因其结构简单、成本低廉、易于编程等特点,在工业控制和教学实验中得到了广泛应用。

本文将重点阐述如何利用51单片机的这些特性来设计和实现一个具有基本时间显示、闹钟设定、温度显示等功能的电子钟。

本文的结构安排如下:将详细介绍51单片机的基本原理和特点,为后续的设计提供理论基础。

接着,将分析电子钟的功能需求,包括时间显示、闹钟设定、温度显示等,并基于这些需求进行系统设计。

将详细讨论电子钟的硬件设计,包括51单片机的选型、时钟电路、显示电路、温度传感器电路等。

软件设计部分将介绍如何通过编程实现电子钟的各项功能,包括时间管理、闹钟控制、温度读取等。

本文将通过实验验证所设计的电子钟的功能和性能,并对实验结果进行分析讨论。

通过本文的研究,旨在为电子钟的设计提供一种实用、经济、可靠的方法,同时也为51单片机的应用提供一个新的实践案例。

2. 51单片机概述51单片机,作为一种经典的微控制器,因其高性能、低功耗和易编程的特性而被广泛应用于工业控制、智能仪器和家用电器等领域。

它基于Intel 8051微处理器的架构,具备基本的算术逻辑单元(ALU)、程序计数器(PC)、累加器(ACC)和寄存器组等核心部件。

51单片机的核心是其8位CPU,能够处理8位数据和执行相应的指令集。

51单片机的内部结构主要包括中央处理单元(CPU)、存储器、定时器计数器、并行IO口、串行通信口等。

其存储器分为程序存储器(ROM)和数据存储器(RAM)。

程序存储器通常用于存放程序代码,而数据存储器则用于存放运行中的数据和临时变量。

51单片机还包含特殊功能寄存器(SFR),用于控制IO端口、定时器计数器和串行通信等。

51单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。

LCD12864可调电子钟.

LCD12864可调电子钟.

#include<reg51.h>#include"ziku.h"#define uchar unsigned char#define uint unsigned int/***************赋值************/#define lcd_on 0x3f //LCD开显示#define lcd_off 0x3e //LCD关显示#define lcd_row 0xc0 //LCD行初始化,共64行 #define lcd_col 0x40 //LCD列初始化,共64列 #define lcd_page 0xb8 //LCD页初始化,共8页 /**********定义变量*******/uchar a,b,c,h,m,s,yue,ri,xingqi;uint mun,nian,n;/*************定义LCD控制字*********/sbit lcd_cs1=P2^0; //LCD右屏sbit lcd_cs2=P2^1;sbit lcd_rs=P2^2;sbit lcd_rw=P2^3;sbit lcd_en=P2^4;sbit duan=P2^6; //LCD左屏 //LCD数据、指令寄存器 //LCD读、写操作 //LCD使能信号 //数码管段选择信号 sbit wei=P2^7; //数码管位选择信号 /*************定义按键************/sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;/***************************************************/ /*延时函数*/void delayms(uint z){int x,y;}/***************************************************/ /*定时器初始化*/ void timer_init(){TMOD=0x01; //选择定时器方式TH0=(65536-50000)/256; //设置定时时间为50ms}/***************************************************/ /*LCD选屏函数*/ void select_screen(uchar screen){switch(screen) { case 0: TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //启动定时器 for(x=z;x>0;x--) for(y=110;y>0;y--); //选择LCD全屏 lcd_cs1=0; lcd_cs2=0; break; //选择LCD左屏 case 1: lcd_cs1=0; lcd_cs2=1; break; case 2: //选择LCD右屏 lcd_cs1=1; lcd_cs2=0; break; }}/**************************************************/ /*LCD写指令函数*/ void write_com(uchar com){}/**************************************************/ /*LCD写数据函数*/ void write_date(uchar date){lcd_rw=0;} lcd_rs=1; P0=date; lcd_en=1; lcd_en=0; lcd_rw=0; lcd_rs=0; P0=com; lcd_en=1;lcd_en=0;/**************************************************/ /*LCD清屏函数*/ void clear_screen(uchar screen){int x,y; select_screen(screen); for(x=0xb8;x<0xc0;x++) { } write_com(x);write_com(lcd_col); for(y=0;y<64;y++) { } write_date(0x00);}/**************************************************//*LCD初始化*/void lcd_init(){duan=0;}/**************************************************//*年、月、日、星期、时间初始化*/void data_init(){}/**************************************************//*LCD显示汉字函数*/void lcd_display_hanzi(uchar screen,uchar row,uchar col,uint mun){ /*screen:选择屏幕参数,0:全屏、1:左屏、2:右屏。

时钟显示12864

时钟显示12864

主程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#include<intrins.h>#include<math.h>#include<zhongduan.h>#include<ku.h>#define LCD_databus P0sbit sck=P1^0;sbit io=P1^1;sbit rst=P3^6;sbit RS=P2^2; //RS为0---命令;1----数据sbit RW=P2^1; //RW为1---写;0---读sbit EN=P2^0; //使能端sbit CS1=P2^4; //片选1低电平有效,控制左半屏sbit CS2=P2^3; //片选1低电平有效,控制右半屏sbit k1=P1^4;sbit k2=P1^5;sbit k3=P1^6;sbit k4=P1^7;uint t0,t1,t2,j0,j1,j2,shu=12,yue=7;void write_ds1302(uchar add,uchar dat);void write_ds1302_byte(uchar dat);uchar read_ds1302(uchar add);void set_rtc(void);void read_rtc(void);void time_pros(void);void display(void);uchar disp[20];uchar time_data[7]={12,6,7,27,12,3,3}; //设定起始时间uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//年周月天时分秒uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};void delay(uint z){uint x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}void Read_busy()//读“忙”函数-----数据线的最高位DB71则busy{P0=0x00;RS=0;RW=1;EN=1;while(P0 & 0x80);EN=0;}void write_LCD_command(uchar value) //写命令函数{Read_busy(); //对LCD的每次读写都要读忙RS=0; //选择命令RW=0; //读操作LCD_databus=value;EN=1; //EN由1----0锁存有效数据_nop_();_nop_();EN=0;}void write_LCD_data(uchar value)//写数据函数{Read_busy();RS=1; //选择数据RW=0;LCD_databus=value;EN=1; //EN由1----0锁存有效数据_nop_();_nop_();EN=0;}uchar Read_LCD(void) //读数据函数{uchar value;Read_busy();LCD_databus=0xFF; //先进行一次空读操作RS=1;RW=1;EN=1;_nop_();_nop_();EN=0;LCD_databus=0xFF; //读取真正的数据RS=1;RW=1;EN=1;value=LCD_databus;_nop_();_nop_();EN=0;return value;}void Set_page(uchar page) //设置“页”LCD12864共8页,一页是8行点阵点{page=0xb8|page; //页的首地址为0xB8write_LCD_command(page);}void Set_line(uchar startline) //设置显示的起始行{startline=0xC0|startline; //起始行地址为0xC0write_LCD_command(startline); //设置从哪行开始:共0--63;一般从0 行开始显示}void Set_column(uchar column) //设置显示的列{column=column &0x3f; //列的最大值为64column= 0x40|column; //列的首地址为0x40write_LCD_command(column); //规定显示的列的位置}void SetOnOff(uchar onoff) //显示开关函数:0x3E是关显示,0x3F是开显示{onoff=0x3e|onoff; //onoff:1---开显示;0---关显示write_LCD_command(onoff);}void SelectScreen(uchar screen) //选择屏幕{switch(screen){case 0: CS1=0;CS2=0;break; //全屏case 1: CS1=0;CS2=1;break;//左半屏case 2: CS1=1;CS2=0;break;//右半屏case 3: CS1=1;CS2=1;break;//无屏default:break;}}void ClearScreen(uchar screen) //清屏函数{uchar i,j;SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏for(i=0;i<8;i++) //控制页数0-7,共8页{Set_page(i);Set_column(0);for(j=0;j<64;j++) //控制列数0-63,共64列{write_LCD_data(0x00); //写入0,地址指针自加1 }}}void InitLCD() //LCD的初始化{SetOnOff(1); //开显示SelectScreen(0);ClearScreen(0); //清屏Set_line(0); //开始行:0}void Display_SZ(uchar ss,uchar page,uchar column,uchar *p){uchar i;SelectScreen(ss);Set_page(page); //写上半页Set_column(column*8); //控制列for(i=0;i<8;i++) //控制8列的数据输出{write_LCD_data(p[i]); //汉字的上半部分}Set_page(page+1); //写下半页Set_column(column*8); //控制列for(i=0;i<8;i++) //控制8列的数据输出{write_LCD_data(p[i+8]); //汉字的下半部分}}void Display_HZ(uchar ss,uchar page,uchar column,uchar *p){uchar i;SelectScreen(ss);Set_page(page); //写上半页Set_column(column*16); //控制列for(i=0;i<16;i++) //控制16列的数据输出{write_LCD_data(p[i]); //汉字的上半部分}Set_page(page+1); //写下半页Set_column(column*16); //控制列for(i=0;i<16;i++) //控制16列的数据输出{write_LCD_data(p[i+16]); //汉字的下半部分}}void write_ds1302_byte(uchar dat){uchar i;for(i=0;i<8;i++){sck=0;io=dat&0x01;dat=dat>>1;sck=1;}}void write_ds1302(uchar add,uchar dat){rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);write_ds1302_byte(dat);rst=0;_nop_();io=1;sck=1;}uchar read_ds1302(uchar add){uchar i,value;rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);for(i=0;i<8;i++){value=value>>1;sck=0;if(io)value=value|0x80;sck=1;}rst=0;_nop_();sck=0;_nop_();sck=1;io=1;return value;}void set_rtc(void){uchar i,j;Display_HZ(2,6,0,lin);Display_HZ(2,6,1,peng);for(i=0;i<7;i++){j=time_data[i]/10;time_data[i]=time_data[i]%10;time_data[i]=time_data[i]+j*16;}write_ds1302(0x8e,0x00);for(i=0;i<7;i++){write_ds1302(write_add[i],time_data[i]);}write_ds1302(0x8e,0x80);}void read_rtc(void){uchar i;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]);}}void time_pros(void){disp[0]=time_data[6]%16; //秒disp[1]=time_data[6]/16;disp[2]=time_data[5]%16; //分disp[3]=time_data[5]/16;disp[4]=time_data[4]%16; //时disp[5]=time_data[4]/16;disp[6]=time_data[3]%16; //天disp[7]=time_data[3]/16;disp[8]=time_data[2]%16; //月disp[9]=time_data[2]/16;disp[10]=time_data[1]%16; //周disp[11]=time_data[1]/16;disp[12]=time_data[0]%16; //年disp[13]=time_data[0]/16;}void dingshi() interrupt 1{TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=0;t0=1;t1=1;t2=1;while(1){if(k1==0){delay(200);j1++;}if(j1==1)while(t1){switch(disp[12]) //年{case 0:Display_SZ(1,0,1,tiao_0);break;case 1:Display_SZ(1,0,1,tiao_1);break;case 2:Display_SZ(1,0,1,tiao_2);break;case 3:Display_SZ(1,0,1,tiao_3);break;case 4:Display_SZ(1,0,1,tiao_4);break;case 5:Display_SZ(1,0,1,tiao_5);break;case 6:Display_SZ(1,0,1,tiao_6);break;case 7:Display_SZ(1,0,1,tiao_7);break;case 8:Display_SZ(1,0,1,tiao_8);break;case 9:Display_SZ(1,0,1,tiao_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,tiao_0);break;case 1:Display_SZ(1,0,0,tiao_1);break;case 2:Display_SZ(1,0,0,tiao_2);break;case 3:Display_SZ(1,0,0,tiao_3);break;case 4:Display_SZ(1,0,0,tiao_4);break;case 5:Display_SZ(1,0,0,tiao_5);break;case 6:Display_SZ(1,0,0,tiao_6);break;case 7:Display_SZ(1,0,0,tiao_7);break;case 8:Display_SZ(1,0,0,tiao_8);break;case 9:Display_SZ(1,0,0,tiao_9);break;}if(k2==0){delay(180);shu++;j0=shu/10;time_data[0]=shu%10;time_data[0]=time_data[0]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[0],time_data[0]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[12]) //年{case 0:Display_SZ(1,0,1,tiao_0);break;case 1:Display_SZ(1,0,1,tiao_1);break;case 2:Display_SZ(1,0,1,tiao_2);break;case 3:Display_SZ(1,0,1,tiao_3);break;case 4:Display_SZ(1,0,1,tiao_4);break;case 5:Display_SZ(1,0,1,tiao_5);break;case 6:Display_SZ(1,0,1,tiao_6);break;case 7:Display_SZ(1,0,1,tiao_7);break;case 8:Display_SZ(1,0,1,tiao_8);break;case 9:Display_SZ(1,0,1,tiao_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,tiao_0);break;case 1:Display_SZ(1,0,0,tiao_1);break;case 2:Display_SZ(1,0,0,tiao_2);break;case 3:Display_SZ(1,0,0,tiao_3);break;case 4:Display_SZ(1,0,0,tiao_4);break;case 5:Display_SZ(1,0,0,tiao_5);break;case 6:Display_SZ(1,0,0,tiao_6);break;case 7:Display_SZ(1,0,0,tiao_7);break;case 8:Display_SZ(1,0,0,tiao_8);break;case 9:Display_SZ(1,0,0,tiao_9);break;}}if(k3==0){delay(180);shu--;j0=shu/10;time_data[0]=shu%10;time_data[0]=time_data[0]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[0],time_data[0]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[12]) //年{case 0:Display_SZ(1,0,1,tiao_0);break;case 1:Display_SZ(1,0,1,tiao_1);break;case 2:Display_SZ(1,0,1,tiao_2);break;case 3:Display_SZ(1,0,1,tiao_3);break;case 4:Display_SZ(1,0,1,tiao_4);break;case 5:Display_SZ(1,0,1,tiao_5);break;case 6:Display_SZ(1,0,1,tiao_6);break;case 7:Display_SZ(1,0,1,tiao_7);break;case 8:Display_SZ(1,0,1,tiao_8);break;case 9:Display_SZ(1,0,1,tiao_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,tiao_0);break;case 1:Display_SZ(1,0,0,tiao_1);break;case 2:Display_SZ(1,0,0,tiao_2);break;case 3:Display_SZ(1,0,0,tiao_3);break;case 4:Display_SZ(1,0,0,tiao_4);break;case 5:Display_SZ(1,0,0,tiao_5);break;case 6:Display_SZ(1,0,0,tiao_6);break;case 7:Display_SZ(1,0,0,tiao_7);break;case 8:Display_SZ(1,0,0,tiao_8);break;case 9:Display_SZ(1,0,0,tiao_9);break;}}if(k1==0){t1=0;delay(200);j1=2;}}if(j1==2)while(t2){switch(disp[8]) //月{case 0:Display_SZ(1,0,4,tiao_0);break;case 1:Display_SZ(1,0,4,tiao_1);break;case 2:Display_SZ(1,0,4,tiao_2);break;case 3:Display_SZ(1,0,4,tiao_3);break;case 4:Display_SZ(1,0,4,tiao_4);break;case 5:Display_SZ(1,0,4,tiao_5);break;case 6:Display_SZ(1,0,4,tiao_6);break;case 7:Display_SZ(1,0,4,tiao_7);break;case 8:Display_SZ(1,0,4,tiao_8);break;case 9:Display_SZ(1,0,4,tiao_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,tiao_0);break;case 1:Display_SZ(1,0,3,tiao_1);break;case 2:Display_SZ(1,0,3,tiao_2);break;case 3:Display_SZ(1,0,3,tiao_3);break;case 4:Display_SZ(1,0,3,tiao_4);break;case 5:Display_SZ(1,0,3,tiao_5);break;case 6:Display_SZ(1,0,3,tiao_6);break;case 7:Display_SZ(1,0,3,tiao_7);break;case 8:Display_SZ(1,0,3,tiao_8);break;case 9:Display_SZ(1,0,3,tiao_9);break;}switch(disp[12]) //年{case 0:Display_SZ(1,0,1,shu_0);break;case 1:Display_SZ(1,0,1,shu_1);break;case 2:Display_SZ(1,0,1,shu_2);break;case 3:Display_SZ(1,0,1,shu_3);break;case 4:Display_SZ(1,0,1,shu_4);break;case 5:Display_SZ(1,0,1,shu_5);break;case 6:Display_SZ(1,0,1,shu_6);break;case 7:Display_SZ(1,0,1,shu_7);break;case 8:Display_SZ(1,0,1,shu_8);break;case 9:Display_SZ(1,0,1,shu_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,shu_0);break;case 1:Display_SZ(1,0,0,shu_1);break;case 2:Display_SZ(1,0,0,shu_2);break;case 3:Display_SZ(1,0,0,shu_3);break;case 4:Display_SZ(1,0,0,shu_4);break;case 5:Display_SZ(1,0,0,shu_5);break;case 6:Display_SZ(1,0,0,shu_6);break;case 7:Display_SZ(1,0,0,shu_7);break;case 8:Display_SZ(1,0,0,shu_8);break;case 9:Display_SZ(1,0,0,shu_9);break;}if(k2==0){delay(180);yue++;j0=yue/10;time_data[2]=yue%10;time_data[2]=time_data[2]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[2],time_data[2]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[8]) //月{case 0:Display_SZ(1,0,4,tiao_0);break;case 1:Display_SZ(1,0,4,tiao_1);break;case 2:Display_SZ(1,0,4,tiao_2);break;case 3:Display_SZ(1,0,4,tiao_3);break;case 4:Display_SZ(1,0,4,tiao_4);break;case 5:Display_SZ(1,0,4,tiao_5);break;case 6:Display_SZ(1,0,4,tiao_6);break;case 7:Display_SZ(1,0,4,tiao_7);break;case 8:Display_SZ(1,0,4,tiao_8);break;case 9:Display_SZ(1,0,4,tiao_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,tiao_0);break;case 1:Display_SZ(1,0,3,tiao_1);break;case 2:Display_SZ(1,0,3,tiao_2);break;case 3:Display_SZ(1,0,3,tiao_3);break;case 4:Display_SZ(1,0,3,tiao_4);break;case 5:Display_SZ(1,0,3,tiao_5);break;case 6:Display_SZ(1,0,3,tiao_6);break;case 7:Display_SZ(1,0,3,tiao_7);break;case 8:Display_SZ(1,0,3,tiao_8);break;case 9:Display_SZ(1,0,3,tiao_9);break;}}if(k3==0){delay(180);yue--;j0=yue/10;time_data[2]=yue%10;time_data[2]=time_data[2]+j0*16;write_ds1302(0x8e,0x00);write_ds1302(write_add[2],time_data[2]);write_ds1302(0x8e,0x80);read_rtc();time_pros();switch(disp[8]) //月{case 0:Display_SZ(1,0,4,tiao_0);break;case 1:Display_SZ(1,0,4,tiao_1);break;case 2:Display_SZ(1,0,4,tiao_2);break;case 3:Display_SZ(1,0,4,tiao_3);break;case 4:Display_SZ(1,0,4,tiao_4);break;case 5:Display_SZ(1,0,4,tiao_5);break;case 6:Display_SZ(1,0,4,tiao_6);break;case 7:Display_SZ(1,0,4,tiao_7);break;case 8:Display_SZ(1,0,4,tiao_8);break;case 9:Display_SZ(1,0,4,tiao_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,tiao_0);break;case 1:Display_SZ(1,0,3,tiao_1);break;case 2:Display_SZ(1,0,3,tiao_2);break;case 3:Display_SZ(1,0,3,tiao_3);break;case 4:Display_SZ(1,0,3,tiao_4);break;case 5:Display_SZ(1,0,3,tiao_5);break;case 6:Display_SZ(1,0,3,tiao_6);break;case 7:Display_SZ(1,0,3,tiao_7);break;case 8:Display_SZ(1,0,3,tiao_8);break;case 9:Display_SZ(1,0,3,tiao_9);break;}}if(k1==0){t2=0;delay(200);j1=3;}}if(j1==3)break;}}void main(){delay(200);TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;InitLCD(); //初始12864ClearScreen(0); //清屏Set_line(0);//set_rtc(); //设定起始时间Display_SZ(1,2,2,maohao);Display_SZ(1,2,5,maohao);Display_SZ(1,0,2,xie);Display_SZ(1,0,5,xie);Display_HZ(2,0,1,xing);Display_HZ(2,0,2,qi);while(1){read_rtc();time_pros();if(k1==0)TR0=1;switch(disp[0]) //秒{case 0:Display_SZ(1,2,7,shu_0);break;case 1:Display_SZ(1,2,7,shu_1);break;case 2:Display_SZ(1,2,7,shu_2);break;case 3:Display_SZ(1,2,7,shu_3);break;case 4:Display_SZ(1,2,7,shu_4);break;case 5:Display_SZ(1,2,7,shu_5);break;case 6:Display_SZ(1,2,7,shu_6);break;case 7:Display_SZ(1,2,7,shu_7);break;case 8:Display_SZ(1,2,7,shu_8);break;case 9:Display_SZ(1,2,7,shu_9);break;}switch(disp[1]) //秒{case 0:Display_SZ(1,2,6,shu_0);break;case 1:Display_SZ(1,2,6,shu_1);break;case 3:Display_SZ(1,2,6,shu_3);break;case 4:Display_SZ(1,2,6,shu_4);break;case 5:Display_SZ(1,2,6,shu_5);break;case 6:Display_SZ(1,2,6,shu_6);break;case 7:Display_SZ(1,2,6,shu_7);break;case 8:Display_SZ(1,2,6,shu_8);break;case 9:Display_SZ(1,2,6,shu_9);break;}switch(disp[2]) //分{case 0:Display_SZ(1,2,4,shu_0);break;case 1:Display_SZ(1,2,4,shu_1);break;case 2:Display_SZ(1,2,4,shu_2);break;case 3:Display_SZ(1,2,4,shu_3);break;case 4:Display_SZ(1,2,4,shu_4);break;case 5:Display_SZ(1,2,4,shu_5);break;case 6:Display_SZ(1,2,4,shu_6);break;case 7:Display_SZ(1,2,4,shu_7);break;case 8:Display_SZ(1,2,4,shu_8);break;case 9:Display_SZ(1,2,4,shu_9);break;}switch(disp[3]) //分{case 0:Display_SZ(1,2,3,shu_0);break;case 1:Display_SZ(1,2,3,shu_1);break;case 2:Display_SZ(1,2,3,shu_2);break;case 3:Display_SZ(1,2,3,shu_3);break;case 4:Display_SZ(1,2,3,shu_4);break;case 5:Display_SZ(1,2,3,shu_5);break;case 6:Display_SZ(1,2,3,shu_6);break;case 7:Display_SZ(1,2,3,shu_7);break;case 8:Display_SZ(1,2,3,shu_8);break;case 9:Display_SZ(1,2,3,shu_9);break;}switch(disp[4]) //时{case 0:Display_SZ(1,2,1,shu_0);break;case 1:Display_SZ(1,2,1,shu_1);break;case 2:Display_SZ(1,2,1,shu_2);break;case 3:Display_SZ(1,2,1,shu_3);break;case 4:Display_SZ(1,2,1,shu_4);break;case 5:Display_SZ(1,2,1,shu_5);break;case 6:Display_SZ(1,2,1,shu_6);break;case 8:Display_SZ(1,2,1,shu_8);break;case 9:Display_SZ(1,2,1,shu_9);break;}switch(disp[5]) //时{case 0:Display_SZ(1,2,0,shu_0);break;case 1:Display_SZ(1,2,0,shu_1);break;case 2:Display_SZ(1,2,0,shu_2);break;case 3:Display_SZ(1,2,0,shu_3);break;case 4:Display_SZ(1,2,0,shu_4);break;case 5:Display_SZ(1,2,0,shu_5);break;case 6:Display_SZ(1,2,0,shu_6);break;case 7:Display_SZ(1,2,0,shu_7);break;case 8:Display_SZ(1,2,0,shu_8);break;case 9:Display_SZ(1,2,0,shu_9);break;}switch(disp[12]) //年{case 0:Display_SZ(1,0,1,shu_0);break;case 1:Display_SZ(1,0,1,shu_1);break;case 2:Display_SZ(1,0,1,shu_2);break;case 3:Display_SZ(1,0,1,shu_3);break;case 4:Display_SZ(1,0,1,shu_4);break;case 5:Display_SZ(1,0,1,shu_5);break;case 6:Display_SZ(1,0,1,shu_6);break;case 7:Display_SZ(1,0,1,shu_7);break;case 8:Display_SZ(1,0,1,shu_8);break;case 9:Display_SZ(1,0,1,shu_9);break;}switch(disp[13]) //年{case 0:Display_SZ(1,0,0,shu_0);break;case 1:Display_SZ(1,0,0,shu_1);break;case 2:Display_SZ(1,0,0,shu_2);break;case 3:Display_SZ(1,0,0,shu_3);break;case 4:Display_SZ(1,0,0,shu_4);break;case 5:Display_SZ(1,0,0,shu_5);break;case 6:Display_SZ(1,0,0,shu_6);break;case 7:Display_SZ(1,0,0,shu_7);break;case 8:Display_SZ(1,0,0,shu_8);break;case 9:Display_SZ(1,0,0,shu_9);break;}switch(disp[8]) //月{case 0:Display_SZ(1,0,4,shu_0);break;case 1:Display_SZ(1,0,4,shu_1);break;case 2:Display_SZ(1,0,4,shu_2);break;case 3:Display_SZ(1,0,4,shu_3);break;case 4:Display_SZ(1,0,4,shu_4);break;case 5:Display_SZ(1,0,4,shu_5);break;case 6:Display_SZ(1,0,4,shu_6);break;case 7:Display_SZ(1,0,4,shu_7);break;case 8:Display_SZ(1,0,4,shu_8);break;case 9:Display_SZ(1,0,4,shu_9);break;}switch(disp[9]) //月{case 0:Display_SZ(1,0,3,shu_0);break;case 1:Display_SZ(1,0,3,shu_1);break;case 2:Display_SZ(1,0,3,shu_2);break;case 3:Display_SZ(1,0,3,shu_3);break;case 4:Display_SZ(1,0,3,shu_4);break;case 5:Display_SZ(1,0,3,shu_5);break;case 6:Display_SZ(1,0,3,shu_6);break;case 7:Display_SZ(1,0,3,shu_7);break;case 8:Display_SZ(1,0,3,shu_8);break;case 9:Display_SZ(1,0,3,shu_9);break;}switch(disp[6]) //天{case 0:Display_SZ(1,0,7,shu_0);break;case 1:Display_SZ(1,0,7,shu_1);break;case 2:Display_SZ(1,0,7,shu_2);break;case 3:Display_SZ(1,0,7,shu_3);break;case 4:Display_SZ(1,0,7,shu_4);break;case 5:Display_SZ(1,0,7,shu_5);break;case 6:Display_SZ(1,0,7,shu_6);break;case 7:Display_SZ(1,0,7,shu_7);break;case 8:Display_SZ(1,0,7,shu_8);break;case 9:Display_SZ(1,0,7,shu_9);break;}switch(disp[7]) //天{case 0:Display_SZ(1,0,6,shu_0);break;case 1:Display_SZ(1,0,6,shu_1);break;case 2:Display_SZ(1,0,6,shu_2);break;case 3:Display_SZ(1,0,6,shu_3);break;case 4:Display_SZ(1,0,6,shu_4);break;case 5:Display_SZ(1,0,6,shu_5);break;case 6:Display_SZ(1,0,6,shu_6);break;case 7:Display_SZ(1,0,6,shu_7);break;case 8:Display_SZ(1,0,6,shu_8);break;case 9:Display_SZ(1,0,6,shu_9);break;}switch(disp[10]){case 1:Display_HZ(2,0,3,yi);break;case 2:Display_HZ(2,0,3,er);break;case 3:Display_HZ(2,0,3,san);break;case 4:Display_HZ(2,0,3,si);break;case 5:Display_HZ(2,0,3,wu);break;case 6:Display_HZ(2,0,3,liu);break;case 7:Display_HZ(2,0,3,ri);break;}}}字库code char shu_0[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}; code char shu_1[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}; code char shu_2[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}; code char shu_3[]={/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}; code char shu_4[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}; code char shu_5[]={/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}; code char shu_7[]={/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}; code char shu_8[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}; code char shu_9[]={/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}; code char lin[]={/*-- 文字: 林--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x90,0xFF,0x90,0x10,0x00,0x10,0x10,0xD0,0xFF,0x90,0x10,0x10,0x10,0x00,0x08,0x06,0x01,0xFF,0x00,0x13,0x08,0x04,0x03,0x00,0xFF,0x01,0x06,0x18,0x08,0x00}; code char peng[]={/*-- 文字: 鹏--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x12,0xFE,0x00,0xFE,0x12,0xFE,0x00,0xFC,0x0E,0x35,0x44,0x7C,0x00,0x00,0x20,0x1F,0x21,0x7F,0x20,0x1F,0x41,0x7F,0x08,0x09,0x09,0x29,0x49,0x21,0x1F,0x00}; code char xing[]={/*-- 文字: 星--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00, 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00}; code char qi[]={/*-- 文字: 期--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00}; code char yi[]={/*-- 文字: 一--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; code char er[]={/*-- 文字: 二--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00}; code char san[]={/*-- 文字: 三--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}; code char si[]={/*-- 文字: 四--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00};/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00}; code char liu[]={/*-- 文字: 六--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00}; code char ri[]={/*-- 文字: 日--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00}; code char maohao[]={/*-- 文字: : --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00}; code char xie[]={/*-- 文字: / --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00}; code char duo[]={/*-- 文字: 多--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x20,0x90,0x88,0x54,0x53,0xA2,0x22,0x12,0x0A,0x06,0x00,0x00,0x00,0x00,0x81,0x89,0x89,0x44,0x44,0x42,0x25,0x29,0x11,0x11,0x09,0x05,0x03,0x01,0x00}; code char yun[]={/*-- 文字: 云--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x40,0x44,0x44,0x44,0x44,0xC4,0xC4,0x44,0x44,0x46,0x46,0x64,0x60,0x40,0x00,0x00,0x20,0x70,0x38,0x2C,0x27,0x23,0x31,0x10,0x12,0x14,0x18,0x70,0x20,0x00,0x00}; code char qing[]={/*-- 文字: 晴--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x44,0x44,0xFC,0x20,0x22,0xAA,0xAA,0xBF,0xAA,0xAA,0xAA,0x22,0x20,0x00, 0x00,0x0F,0x04,0x04,0x0F,0x00,0x00,0xFF,0x0A,0x0A,0x4A,0x8A,0x7F,0x00,0x00,0x00}; code char tiao_0[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x1F,0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xF0,0xEF,0xDF,0xDF,0xEF,0xF0,0xFF}; code char tiao_1[]={/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xEF,0xEF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xDF,0xC0,0xDF,0xDF,0xFF,0xFF}; code char tiao_2[]={/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x8F,0xF7,0xF7,0xF7,0x77,0x8F,0xFF,0xFF,0xCF,0xD7,0xDB,0xDD,0xDE,0xCF,0xFF}; code char tiao_3[]={/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xCF,0xF7,0x77,0x77,0xB7,0xCF,0xFF,0xFF,0xE7,0xDF,0xDF,0xDF,0xEE,0xF1,0xFF}; code char tiao_4[]={/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xFF,0x3F,0xDF,0xEF,0x07,0xFF,0xFF,0xFF,0xF8,0xFB,0xDB,0xDB,0xC0,0xDB,0xFF}; code char tiao_5[]={/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x07,0xF7,0x77,0x77,0xF7,0xF7,0xFF,0xFF,0xE6,0xDE,0xDF,0xDF,0xEE,0xF1,0xFF}; code char tiao_6[]={/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x1F,0xEF,0x77,0x77,0xE7,0xFF,0xFF,0xFF,0xF0,0xEE,0xDF,0xDF,0xEE,0xF1,0xFF}; code char tiao_7[]={/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0xC7,0xF7,0xF7,0x37,0xC7,0xF7,0xFF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF}; code char tiao_8[]={/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x8F,0x77,0xF7,0xF7,0x77,0x8F,0xFF,0xFF,0xE3,0xDD,0xDE,0xDE,0xDD,0xE3,0xFF}; code char tiao_9[]={/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0xFF,0x1F,0xEF,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xFF,0xCE,0xDD,0xDD,0xEE,0xF0,0xFF};。

LCD12864显示实时时钟例程可运行

LCD12864显示实时时钟例程可运行

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

下面是一段12864液晶显示实时时钟的程序:/****************************************************************************** *********时间:2012.11.30晶振:11.0592MHz芯片:STC89C52RC功能描述:在12864上显示年、月、日、星期、时、分和秒等时间信息******************************************************************************* ********/#include<reg52.h>#define uchar unsigned charsbit CLK=P1^4; //DS1302引脚定义sbit IO=P1^5;sbit CE=P1^6;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit RS=P2^4; //12864引脚定义数据口为P0sbit RW=P2^5;sbit EN=P2^6;sbit PSB=P2^1;sbit RET=P2^3;void Input_1byte(uchar TD) //DS1302输入一字节数据{uchar i;ACC=TD;for(i=8;i>0;i--){IO=ACC0;CLK=1;CLK=0;ACC=ACC>>1;}}uchar Output_1byte(void) //DS1302输出一字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=IO;CLK=1;CLK=0;}return(ACC);}void Write_DS1302(uchar add,uchar dat)//向DS1302写{CE=0;CLK=0;CE=1;Input_1byte(add);Input_1byte(dat);CE=0;}uchar Read_DS1302(uchar add) //从DS1302读{uchar inf; //信息临时存储变量CE=0;CLK=0;CE=1;Input_1byte(add);inf=Output_1byte();CE=0;return(inf);}/**********************DS1302初始化*****************************/void init_1302(){if(Read_DS1302(0xd1)==0x55) //判断内存单元的内容,是否进行初始化 {return;}else{Write_DS1302(0x8e,0x00); //关闭写保护Write_DS1302(0x90,0x00); //电池充电设置Write_DS1302(0x80,0x00); //秒Write_DS1302(0x82,0x54); //分Write_DS1302(0x84,0x20); //时Write_DS1302(0x86,0x30); //日Write_DS1302(0x88,0x11); //月Write_DS1302(0x8a,0x05); //星期Write_DS1302(0x8c,0x12); //年Write_DS1302(0xd0,0x55); //写RAMWrite_DS1302(0x8e,0x80); //打开写保护}}/**********************延时函数*****************************/ void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/**********************12864判忙*****************************/ void check_busy(){RS=0;RW=1;EN=1;while((P0&0x80)==0x80);EN=0;}/**********************12864写指令*****************************/ void write_com(uchar com){check_busy();RS=0;RW=0;EN=1;P0=com;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864写数据*****************************/void write_data(uchar dat){check_busy();RS=1;RW=0;EN=1;P0=dat;DelayUs2x(250);EN=0;DelayUs2x(250);}/**********************12864初始化函数*****************************/void init(){DelayMs(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式DelayMs(1); //延时RET=0; //复位DelayMs(1); //延时RET=1; //复位置高DelayMs(200);write_com(0x30); //选择基本指令集DelayUs2x(250); //延时大于100uswrite_com(0x30); //选择8bit数据流DelayUs2x(200); //延时大于37uswrite_com(0x0c); //开显示(无游标、不反白)DelayUs2x(250); //延时大于100uswrite_com(0x01); //清除显示,并且设定地址指针为00HDelayMs(200); //延时大于10mswrite_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动DelayUs2x(250); //延时大于100us}/**********************清屏*****************************/void clrscreen(){write_com(0x01);DelayMs(15);}/*********************************************************主函数********************************************************/void main(){uchar sec,sec1,sec2;uchar min,min1,min2;uchar hour,hour1,hour2;uchar date,date1,date2;uchar mon,mon1,mon2;uchar day;uchar year,year1,year2;uchar table1[]="年月日时分秒星期温度摄氏"; //长度24uchar table2[]={0XD2,0XBB, 0XB6,0XFE, 0XC8,0XFD, 0XCB,0XC4, 0XCE,0XE5, 0XCE,0XF9, 0XC8,0XD5}; //长度14 uchar table3[]="0123456789"; //长度10init(); //液晶初始化clrscreen();DelayMs(200);init_1302(); //1302初始化只初始化一下就可以需要下载两次DelayMs(50);write_com(0x80); //显示20write_data('2');write_data('0');write_com(0x82); //显示年write_data(table1[0]);write_data(table1[1]);write_com(0x84); //显示月write_data(table1[2]);write_data(table1[3]);write_com(0x86); //显示日write_data(table1[4]);write_data(table1[5]);write_com(0x91); //显示时write_data(table1[6]);write_data(table1[7]);write_com(0x93); //显示分write_data(table1[8]);write_data(table1[9]);write_com(0x95); //显示秒write_data(table1[10]);write_data(table1[11]);write_com(0x88); //显示星期write_data(table1[12]);write_data(table1[13]);write_data(table1[14]);write_data(table1[15]);while(1){sec=Read_DS1302(0x81); ////读秒sec1=sec&0x0f; //个位sec2=sec>>4; //十位min=Read_DS1302(0x83); ////读分min1=min&0x0f; //个位min2=min>>4; //十位hour=Read_DS1302(0x85); ////读时hour1=hour&0x0f; //个位hour2=hour>>4; //十位date=Read_DS1302(0x87); ////读日date1=date&0x0f; //个位date2=date>>4; //十位mon=Read_DS1302(0x89); ////读月mon1=mon&0x0f; //个位mon2=mon>>4; //十位year=Read_DS1302(0x8d); ////读年year1=year&0x0f; //个位year2=year>>4; //十位day=Read_DS1302(0x8b); ////读星期write_com(0x94); //送显示内容write_data(table3[sec2]); //秒write_data(table3[sec1]);write_com(0x92);write_data(table3[min2]); //分write_data(table3[min1]);write_com(0x90);write_data(table3[hour2]); //时write_data(table3[hour1]);write_com(0x85);write_data(table3[date2]); //日write_data(table3[date1]);write_com(0x83);write_data(table3[mon2]); //月write_data(table3[mon1]);write_com(0x81);write_data(table3[year2]); //年write_data(table3[year1]);write_com(0x8a);write_data(table2[2*day-2]); //星期write_data(table2[2*day-1]);}}。

基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电⼦闹钟设计报告(附原理图、PCB图、程序)成都信息⼯程学院第五届嵌⼊式创新技术⼤赛基于MCS51的智能电⼦闹钟设计报告姓名学院班级实物图⽬录1.电⼦时钟的设计原理和⽅法 (1)1.1设计原理 (1)1.2 硬件电路的设计 (1)1.2.1 STC89C51RC简介 (1)1.2.2 键盘电路的设计 (2)1.2.3蜂鸣器驱动电路 (3)1.2.4 数码管驱动电路 (3)1.2.5 电源电路 (4)1.3软件部分的设计 (4)1.3.1主程序部分的设计 (4)1.3.2中断计时器及时间进位 (5)1.3.3 闹钟⼦函数 (7)1.3.4 按键扫描 (8)1.3.5 时钟闹钟设置 (9)1.3.6 显⽰数字函数 (10)1.3.7 显⽰界⾯函数 (10)1.3.8 闹钟记录及读取 (11)2.硬件调试 (13)附录A:电路原理图 (15)附录B:电路PCB图 (16)附录C:源程序 (17)1.电⼦时钟的设计原理和⽅法1.1设计原理系统框图1.2硬件电路的设计1.2.1 STC89C51RC简介STC89C52R CSTC89C51RC是⼀种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory )的低电压、⾼性能CMOS8位微型处理器,即单⽚机芯⽚。

单⽚机的可擦除只读存储器可以反复擦除1000次,内部FLASH 擦写次数为100000次以上。

该芯⽚使⽤⾼密度⾮易失存储制造技术,与⼯业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU 和闪烁存储器集成在单个芯⽚中,使得STC89C51RC 成为了⼀种性价⽐极⾼的微型处理器芯⽚,在许多电路设计中都得到了应⽤。

STC89C51RC 单⽚机特点:⼯作电压:5.5V-3.4V ⼯作频率:0-40MHz ⽤户应⽤程序空间:8K ⽚上集成128*8RAMISP (在系统可编程)/IAP (在应⽤可编程),⽆需专⽤编程器/仿真器可通过串⼝(P3.0/P3.1)直接下载⽤户程序EEPROM 功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使⽤外部中断4路通⽤异步串⾏⼝(UART ),还可⽤定时器软件实现多个UART ⼯作温度范围:0-75℃引脚说明:VCC:供电电压 GND :接地P0:P0是⼀个8位漏级开路双向I/O ⼝,低8位地址复⽤总线端⼝。

多功能电子钟毕业设计

多功能电子钟毕业设计

多功能电子钟毕业设计本文主要介绍了一款多功能电子钟的设计方案,其中包括时钟、定时器、闹钟、日历、温度显示等多种功能。

通过硬件和软件的相结合,实现了这种多功能的电子钟,具有易操作、准确显示、功能多样等特点。

本设计可用于家庭、实验室、工作室等多种场合。

一、设计目标随着现代科技的发展,电子钟成为人们生活中不可缺少的一部分。

因此,本文设计了一款多功能电子钟,集时钟、定时器、闹钟、日历、温度显示等多种功能于一身,方便人们的日常生活。

二、设计原理该电子钟的各项功能均用单片机控制实现。

电子钟的控制部分是基于51单片机进行设计。

时钟的原理是通过一个晶振来控制芯片的工作频率,从而达到时钟的准确显示。

使用DS1302进行存储和控制时间。

定时器的原理是通过定时器中断进行实现,通过设定定时器的计数值即可实现定时器的功能。

闹钟的原理是通过设定一个“警报时间”来实现,当时间到达“警报时间”时,闹钟就会开始响铃。

日历的原理是通过读取DS1302中存储的日期信息进行实现。

温度显示的原理是通过使用DS18B20传感器实现对温度的检测。

三、硬件设计本设计的硬件主要由以下部分组成:显示部分、按键部分、计时器部分、DS1302时钟芯片、DS18B20温度传感器、单片机及其外设(如LCD12864液晶屏等)。

1.显示部分本设计采用LCD12864液晶屏进行显示。

2.按键部分本设计采用4个按键T1~T4,T1键用于切换时间制式;T2键用于设定时间和日期等;T3键用于设定闹钟;T4键用于定时器的设定。

3.计时器部分本设计采用计时器555进行固定时间的计时。

4. DS1302时钟芯片DS1302时钟芯片是一种用于实现实时时钟的芯片,本设计将其用于控制电子钟的时间。

5. DS18B20温度传感器DS18B20温度传感器是一种用于测量温度的芯片,本设计将其用于温度显示功能。

6. 单片机及其外设本设计采用AT89C52单片机进行控制,其外设包括LCD12864液晶屏、DS1302时钟芯片、DS18B20温度传感器等。

Protues中单片机驱动12864仿真

Protues中单片机驱动12864仿真
3.其次在“其他选项”中,选择如下:
4.上面设置好之后我们就可以在文字输入区输入汉字了,以“Ctrl”+“Enter”结束:
5.然后点击“C51格式”,在点阵生成区就会出现相应的模如下,我们可以把每个汉字对应的模存放在相应的数组中:
上面为取模软件的使用方法,下面开始正式教给读者单片机驱动lcd12864液晶显示屏的方法,在这之前,需要对无字库lcd12864液晶显示屏有个基础的了解,相关引脚如下:
void LCDWriteChineseBlack (char leftright, char page, char column, char chinese[]);//12864指定页指定列显示一个汉字,以黑色背景白色文本显示
void LCDWriteNum (char leftright, char page, char column, char num[]);//12864指定屏指定页指定列显示一个数字
void LCDDelay (char t)
{
char i, j;
for (i = 0; i < t; i ++ )
for (j = 0; j < 10 ;j ++ );
}
void CheckState ( )
{
char dat;
LCDRs = 0;
LCDRw = 1;
do
{
dat = 0x00;
LCDEn = 1;
参数leftright用来使能左半屏或者右半屏(‘L’或者’R’),
参数page用来选择在哪一页显示(0~7),
参数column用来选择在哪一列显示(0~64),
参数num[]即为待显示汉字的模。

51单片机LCD12864绘图

51单片机LCD12864绘图

LCD12864绘图方法如下:一、绘图方法:1、使用扩展指令集并关闭绘图显示2、输入y轴坐标3、输入x轴坐标4、写入数据D15-D85、写入数据D7-D06、开绘图显示7、返回普通指令对应程序如下:LCD_write_comm(0x34);//使用扩充指令集LCD_delay();LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80+x);//x坐标起始地址LCD_delay();LCD_write_date(0x55);//写入数据D15-D8LCD_delay();LCD_write_date(0x55);//写入数据D7-D0LCD_delay();LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();程序执行效果则是第一行的第1-16个像素点会描出0x5555的二进制像素点,则后面的整个屏幕则是花屏,如果只想看到这0x5555,这几个像素点,则必须要给LCD的RAM重新赋值,也可以说是清屏,程序如下:void LCD12864_RAM_Cls(){u8 x,y;//xy坐标LCD_write_comm(0x34);//使用扩充指令集LCD_delay();for(y=0;y<32;y++){LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80);//x坐标起始地址LCD_delay();for(x=0;x<16;x++){LCD_write_date(0x00);LCD_delay();LCD_write_date(0x00);LCD_delay();}}LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();}二、坐标与显示X轴坐标设定初始值后会自动加1,取值范围0-15Y轴需要人为加1,取值范围为0-31整个屏幕分为上下屏,上屏对应坐标为x(0-7)y(0-31),下屏对应坐标为x(8-15)y(0-31)三、LCD12864图片显示代码1、Main.c#include"common.h"#include"delay.h"#include"12864.h"unsigned char code Picture[]= // 图片数据表{//此处添加图片取模16进制码共1024Byte,取模方式:从左到右从上到下0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x01, 0x80,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x01,0x80,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x01, 0x80,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x01, 0xC0,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x3F,0x81,0xFF,0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0xFE,0xF0,0x00,0x00,0x01,0x00,0x00,0xC0,0x1C,0x00,0x00,0x00,0x00,0x01, 0x80,0x03,0xC0,0x07,0x80,0x00,0x03,0xE0,0x07,0x00,0x1C,0x00,0x00,0x00,0x00,0x01, 0x80,0x03,0x80,0x03,0x60,0x00,0x03,0xE0,0x0C,0x00,0x0E,0x00,0x00,0x00,0x00,0x01, 0x80,0x07,0x00,0x00,0xC0,0x00,0x00,0x20,0x18,0x00,0x07,0x00,0x00,0x00,0x00,0x01, 0x80,0x09,0x01,0x80,0x60,0x00,0x00,0x20,0x73,0x9F,0x03,0x80,0x00,0x00,0x00,0x01, 0x80,0x1E,0x0F,0xF2,0x20,0x00,0x00,0x20,0x67,0xFF,0xC1,0xC0,0x00,0x00,0x00,0x01, 0x80,0x1E,0x1F,0xF9,0x30,0x00,0x00,0x20,0xEF,0xFF,0xE0,0xE0,0x00,0x00,0x00,0x01, 0x80,0x38,0x3F,0xFC,0x90,0x00,0x00,0x20,0xCB,0xFF,0xF9,0xF0,0x00,0x00,0x00,0x01, 0x80,0x7F,0x7F,0xFE,0x10,0x00,0x00,0x20,0xDB,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x01, 0x80,0x6E,0xF9,0xBF,0x10,0x00,0x00,0x20,0xF7,0xED,0xFF,0xF0,0x00,0x00,0x00,0x01, 0x80,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x00,0x00,0x00,0x01, 0x80,0x7C,0xFC,0x3F,0x10,0x00,0x00,0x20,0x67,0xE1,0xFD,0xE0,0x00,0x00,0x00,0x01, 0x80,0x38,0xFC,0x3F,0x18,0x00,0x00,0x20,0x87,0xE0,0xFD,0xC0,0x00,0x00,0x00,0x01, 0x80,0x38,0xF1,0x8F,0x18,0x00,0x1F,0xE7,0x87,0x9C,0x7D,0xC0,0x00,0x00,0x00,0x01, 0x80,0x1C,0xFE,0x1F,0x81,0xFF,0xFF,0xC0,0x0F,0xE0,0xFF,0x80,0x00,0x00,0x00,0x01, 0x80,0x0C,0xFC,0x3F,0x80,0x00,0x00,0x00,0x0F,0xE1,0xF8,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0xF9,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xFE,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xF9,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x01,0xC0,0x02,0x80,0x00,0x00,0x00,0x1C,0x01, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};void main(){LCD12864_init();//LCD初始化//LCD12864_RAM_Cls();LCD_Picture_show(Picture);while(1);}2、common.h#ifndef __COMMON_H#define __COMMON_H#include<STC12C5A60S2.h>#include "intrins.h"#define u8 unsigned char//无符号字符型#define u16 unsigned int//无符号整型#endif3、delay.h#ifndef __DELAY_H#define __DELAY_H#include "common.h"#define MAIN_Fosc 24000000L //定义主时钟void delay_ms(u16 ms);void LCD_delay();//LCD延时函数#endif4、delay.c#include "delay.h"//-------毫秒延时函数---------------void delay_ms(u16 ms){u16 i;do{i = MAIN_Fosc / 13000;while(--i) ; //14T per loop }while(--ms);}//------LCD延时函数-----------------void LCD_delay(void){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}5、12864.h#ifndef __12864_H#define __12864_h#include "common.h"sbit CS =P1^1;//片选sbit SID=P1^2;//数据口sbit CLK=P1^3;//同步时钟void LCD_write_spi(u8 date);//LCD SPI数据写入void LCD_write_comm(u8 comm);//LCD写指令void LCD_write_date(u8 date);//LCD写数据void LCD12864_init();//LCD初始化void LCD12864_RAM_Cls();//RAM清屏void LCD_print(u8 *date);//LCD字符串显示void LCD_Picture_show(u8 *date);#endif6、12864.c#include"common.h"#include"delay.h"#include"12864.h"//------LCD SPI数据写入--------------------void LCD_write_spi(u8 date){u8 i;for(i=0;i<8;i++){CS=1;if(date&0x80){SID=1;}else{SID=0;}date <<= 1;CLK=1;LCD_delay();CLK=0;}}//------LCD写指令--------------------void LCD_write_comm(u8 comm){u8 date = 0xf8;//串行写入指令到LCD(数据手册)u8 comm_H = comm&0xf0;u8 comm_L = comm<<4;CS =0;CLK=0;SID=0;LCD_delay();LCD_write_spi(date);LCD_write_spi(comm_H);LCD_write_spi(comm_L);CS=0;}//------LCD写数据-----------------------void LCD_write_date(u8 date){u8 date2 = 0xfa;//串行写入指令到LCD(数据手册)u8 date_H = date&0xf0;u8 date_L = date<<4;CS =0;CLK=0;SID=0;LCD_delay();LCD_write_spi(date2);LCD_write_spi(date_H);LCD_write_spi(date_L);CS=0;}//-----LCD初始化--------------------------void LCD12864_init(){LCD_write_comm(0x01);//清屏幕delay_ms(1);LCD_write_comm(0x0c);//开显示,游标显示关闭LCD_delay();LCD_write_comm(0x81);//设定坐标LCD_delay();}//-----写RAM清屏--------------------------void LCD12864_RAM_Cls(){u8 x,y;//xy坐标LCD_write_comm(0x34);//使用扩充指令集LCD_delay();for(y=0;y<32;y++){LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80);//x坐标起始地址LCD_delay();for(x=0;x<16;x++){LCD_write_date(0x00);LCD_delay();LCD_write_date(0x00);LCD_delay();}}LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();}//----LCD字符串显示-----------------------void LCD_print(u8 *date){u8 j=0;while(date[j]!='\0'){LCD_write_date(date[j]);j++;LCD_delay();}}//----图片显示-----------------------------void LCD_Picture_show(u8 *date){u8 x,y;//xy坐标LCD_write_comm(0x34);//使用扩充指令集LCD_delay();for(y=0;y<32;y++){LCD_write_comm(0x80+y);//y坐标起始地址LCD_delay();LCD_write_comm(0x80);//x坐标起始地址LCD_delay();for(x=0;x<8;x++)//写上半屏幕{LCD_write_date(date[16*y+x*2]);LCD_delay();LCD_write_date(date[16*y+x*2+1]);LCD_delay();}for(x=0;x<8;x++)//写下半屏幕{LCD_write_date(date[16*(y+32)+x*2]);LCD_delay();LCD_write_date(date[16*(y+32)+x*2+1]);LCD_delay();}}LCD_write_comm(0x36);//显示RAMLCD_delay();LCD_write_comm(0x30);//退出扩展指令集LCD_delay();}四、程序执行效果。

基于51单片机的12864液晶显示的万年历

基于51单片机的12864液晶显示的万年历

附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下

LCD显示的指针式电子钟

LCD显示的指针式电子钟

信息工程学院课程设计报告书题目: LCD显示的指针式电子钟专业:电子信息的科学与技术班级: 0311410学号: 031141012学生姓名:何标指导教师:高林2014年 5 月 15 日信息工程学院课程设计任务书2014年5月20 日信息工程学院课程设计成绩评定表目录1 任务提出与方案论证 (6)1.1设计要求 (6)1.2原理说明 (6)2 总体设计 (7)3 详细设计 (8)3.1 AT89C51单片机简介 (8)3.2时钟模块设计 (9)3.3 显示模块设计 (10)3.4 设置模块 (10)3.5 振荡电路 (10)3.6 复位设置 (11)4 总结 (12)参考文献 (13)附录仿真电路图 (14)摘要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。

本设计就是应用单片机强大的控制功能制作而成的指针式电子钟,该指针式电子钟实现如下功能:液晶屏模拟表盘与时分秒指针显示当前时钟,K1键用于选择调节对象,K2键用于调整时分秒,在按下K4键时确定调节值,时钟继续运行。

本设计采用的是AT89C51单片机,AT89C51单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时。

芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。

显示器件采用PG12864LCD液晶,12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4个(16×16点阵)汉字。

基于51单片机的多功能电子钟的设计

基于51单片机的多功能电子钟的设计

B-1 多功能电子钟设计报告组员:彭希灵、冯旭鑫、张正鹏完成时间:2016年5月9日目录1.摘要 (4)2.设计任务 (4)2.1基本要求 (4)2.2发挥部分 (4)3.方案论证与比较 (5)3.1显示部分 (5)3.2时钟部分 (5)3.3闹铃部分 (6)3.4温度采集部分 (6)4.总体方案 (6)4.1工作原理 (6)4.2总体设计 (6)5.系统硬件设计 (7)5.1 STC89C51单片机最小系统 (7)5.2时钟模块 (8)5.3 LCD液晶显示模块 (9)5.4闹钟响铃模块 (10)5.5温度测量模块 (10)6.系统软件设计 (11)6.1 main模块 (11)6.2 ds1302模块 (11)6.3 lcd12864模块 (12)6.4 key模块 (12)6.5 ringlock模块 (13)6.6 menu模块和DS18B20模块 (13)7.测试与结果分析 (13)8.总结 (14)参考文献 (14)附录一 (15)附录二 (16)1.摘要本设计采用LCD12864液晶屏幕显示系统,以STC89C52单片机为核心,由铃声响铃模块、DS1302时钟控制模块、LCD12864显示模块、键盘控制模块、菜单模块和DS18B20温度模块等功能模块组成。

基于题目的基本要求,本系统对时间显示、闹钟的设定和控制以及时间日期的设定进行了重点设计。

此外,还扩展了掉电存储、红外遥控、温度采集等功能。

本系统大部分功能由软件来实现。

在该设计中不仅成功的实现了题中的基本要求,多数发挥部分也得到了实现,而且还具有一定的创新功能。

2.设计任务2.1基本要求(1)准确计时,以数字形式显示年月、日、时、分、秒。

(2)小时以24小时计时形式,分秒计时为60进位,日期平年和闰年将自行更换。

(3)采用矩阵按键和4个独立按键对电子表进行控制,可进行闹钟设定、控制及时间日期的设定。

(4)闹钟功能:可任意设定闹钟时间,一旦走时到该时间,能以蜂鸣器发声、LED发光的形式告警提示。

51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】

51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】
void buzz_pro(uchar be)//蜂鸣器发声函数
{
switch(be)
{//uint i;
/*用于整点响铃*/case 0:{
buzz=~buzz;
//delay1();
}break;
/*用于闹铃报时*/case 1:{
buzz=~buzz;
//delay(10);
}break;
}
}
void write_com(uchar com)//命令写入函数
{
rs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void write_date(uchar date)//数据写入函数
{
rs=1;
delay(3);
P0=date;
delay(3);
write_date(0x30+ge);
}
void write_ymd(uchar add,uchar date)//年月日写入子程序
{
uchar sh,ge;
sh=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
sbit buzz=P1^5; //蜂鸣器控制端
uchar code week0[]="Sun";
uchar code week1[]="Mon";
uchar code week2[]="Tue";

LCD12864的原理分析以及使用方法(含代码分析)

LCD12864的原理分析以及使用方法(含代码分析)

LCD12864液晶显示模块的使用与分析(函代码分析)一、LCD12864功能应用LCD12864液晶显示模块能显示中文汉字、数字、字符,能显示数字与字符的个数为64个(4行,每行16个数字或字符),能显示汉字的个数为32个(4行,每行8个汉字)。

其内置了8192个中文汉字(16*16的点阵)、128个字符(8*16点阵)、以及64*256 点阵显示RAM(GDRAM)。

图1外观尺寸图图2外观尺寸图图3 LCD12864读操作时序图4 LCD12864写操作时序二、LCD12864主要技术参数(1)工作电压:3.3V-5.5V,模块最佳电压为5V。

(2)可以在显示界面显示数字、字母和中文汉字。

(3)与外部单片机的通信方式有并行或串行两种通信方式,这里主要介绍并行通信方式。

(4)显示内容:128 列× 64 行(5)显示颜色:黄绿/蓝屏/灰屏(6)LCD 类型:STN(7)与MCU 接口:8 位或4 位并行/3 位串行(8)配置LED 背光(9)多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等三、LCD12864液晶显示的电路用法分析图5 LCD12864电路连接图图6 LCD12864电路连接图LCD12864模块主要用来显示所要的界面信息或数据,所以要求能显示汉字,字符和数字,而LCD12864满足系统要求的显示功能。

LCD12864在显示字母和数字时,是4*16的显示字符模块,即可以显示4行,每行可以显示16个字母或数字;在显示汉字时,是4*8的汉字显示模块,即可以显示4行,每行可以显示8个汉字。

下面进行介绍的是并行通信的显示方式。

按照电路原理图跟单片机最小系统进行连线,如图6所示。

LCD12864共有20个引脚,其引脚具体功能如表1所示,由表可得LCD12864引脚组成为8位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个电源背光引脚(BLK,BLA),控制LCD的背景亮度;一个VO引脚,外接一个上拉电阻(控制LCD12864的字符对比度,让字符更加的清晰可见);RST复位引脚,低电平有效,此处直接接高电平;第16、17位空引脚,不用管;剩下的RS,RW,EN 和PSB四个引脚则跟LCD12864的写入息息相关,通过PSB可以控制LCD12864跟单片机的通信方式,输入高电平,则LCD12864跟单片机的通信模式为并行通信,低电平则为串行通信。

基于51单片机的数字钟设计报告

基于51单片机的数字钟设计报告

数字钟项目硬件总体设计说明书编制单位:侏罗纪工作室作者发布日期:2011-1-22审核人:批准人:目录1.引言 (1)1.1.编写目的: (1)1.2.背景 (1)1.3.定义 (2)1.4.参考资料 (2)2.总体设计 (3)2.1开发与运行环境 (3)2.2硬件功能描述 (3)2.3硬件结构 (3)3.硬件模块设计 (4)3.1.描述 (4)3.1.1.AT89C51单片机简介 (4)3.1.2. 键盘电路的设计 (5)3.1.3. 段码驱动电路 (5)3.1.4. 显示器的选择 (7)3.1.5. 蜂鸣器驱动电路 (8)3.2.功能 (8)4.嵌入式软件设计 (9)4.1.流程逻辑 (9)4.2.算法 (10)4.2.1. 中断定时器的设置 (26)4.2.2. 闹钟子函数 (27)4.2.1. 计时函数 (28)4.2.2. 键盘扫描函数 (29)4.2.3. 时间和闹钟的设置 (30)5.经验总结 (31)6.附录 (37)1.引言1.1.编写目的:20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。

而钟表的数字化给人们生产生活带来了极大的方便。

数字钟是通过数字电路实现时,分,秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品。

由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气的自动启用等。

LCD12864液晶电子钟

LCD12864液晶电子钟

长沙学院《单片机原理及应用》课程设计说明书题目 LCD12864液晶显示电子钟设计系(部)专业(班级)姓名学号指导教师起止日期《单片机原理及应用》课程设计任务书系(部):专业:课题名称LCD12864液晶显示电子钟设计设计内容及要求1、课题内容:设计一种基于AT89S52 单片机的液晶显示电子时钟,要求如下:(1)、能正确显示时间、日期和星期显示格式为:时间:XX 小时:XX 分:XX 秒;日期:XX 年:XX 月:XX 日;星期:X。

(2)、时间能够由按键调整,误差小于1S。

(3)、闹钟功能:时间运行到与闹钟设定时间时,闹钟响(持续响3秒)。

(4)、报时功能:时间运行到正点时间时,闹钟响,几点钟就响几声(每声持续响2 秒,每两声之间时间间隔1 秒)。

液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三行显示日期和星期;第四行显示最近一个闹钟的设定时间。

2、要求:完成该系统的硬件和软件的设计,在Proteus 软件上仿真通过,并提交一篇课程设计说明书。

设计工作量1、汇编或C51 语言程序设计;2、程序调试;3、在Proteus 上进行仿真成功,进行实验板下载调试;4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、调试过程,参考文献、设计总结等。

进度安排起止日期设计内容(或预期目标)备注第一天课题介绍,答疑,收集材料,C51介绍第二天设计方案论证,练习编写C51程序第三天——第六天程序设计第六天——第八天程序调试、仿真第九天——第十天系统测试并编写设计说明书教研室意见年月日系(部)主管领导意见年月日目录一、整体方案设计 (4)1、单片机的选择 (4)2、单片机结构 (4)二、前期准备 (5)三、程序设计 (8)1、键盘约定 (8)2、界面显示 (9)3、全局变量的定义 (9)4、系统时钟 (9)5、闹钟控制时间的设定 (9)四、总结与体会 (10)参考文献 (11)一、整体方案设计1、单片机的选择单片微型计算机主要由微处理器、存储器、I/O接口电路等组成。

LCD12864液晶显示电子钟设计

LCD12864液晶显示电子钟设计

LCD12864液晶显示电子钟设计
介绍:
设计目标:
设计一个能够实时显示时间和日期的电子钟,能够精确地获取当前的时间,并对用户的操作作出相应的响应。

设计原理:
该电子钟设计采用了单片机ATmega16作为核心,配合RTC(实时时钟)模块,通过控制液晶显示屏来显示时间和日期。

硬件设计:
1.电源电路:使用直流电源电压为5V,通过稳压芯片将输入电压稳定在5V。

2.单片机电路:将ATmega16与晶振、复位电路、电源电路等连接起来。

3.RTC电路:通过连接RTC芯片和单片机,实现对实时时钟的读取和控制功能。

4.液晶显示屏电路:将液晶显示屏与单片机进行连接,通过单片机控制液晶显示屏的显示。

软件设计:
1.初始化:对单片机和RTC进行初始化设置。

2.获取时间:从RTC读取当前时间和日期。

3.显示时间:将获取到的时间和日期分别显示在液晶显示屏的相应位置。

4.操作功能:通过按键控制,实现对时间和日期的调整和设置功能。

设计步骤:
1.确定电路设计需求和所需元器件。

2.搭建硬件电路,完成电路连接。

3.使用相关软件进行单片机和RTC的编程设置。

4.测试整个电路是否能够正确工作,如对时间进行调整并观察液晶显示屏的显示是否准确。

5.根据需求进行适当的优化和完善设计。

总结:。

LCD12864液晶使用手册

LCD12864液晶使用手册

八、测试硬件电路VEE’8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

基本特性:l 低电源电压(VDD:+3.0--+5.5V)l 显示分辨率:128×64点l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)l 内置 128个16×8点阵字符l 2MHZ时钟频率l 显示方式:STN、半透、正显l 驱动方式:1/32DUTY,1/5BIASl 视角方向:6点l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10l 通讯方式:串行、并口可选l 内置DC-DC转换电路,无需外加负压l 无需片选信号,简化软件设计l 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接口说明*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

2.2并行接口管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线8 DB1 H/L 三态数据线应用说明用带中文字库的128X64显示模块时应注意以下几点:①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

基于51单片机的12864LCD显示驱动

基于51单片机的12864LCD显示驱动

基于51单片机的12864LCD显示驱动摘要:利用51单片机对12864LCD显示屏进行驱动,并令其显示动态及静态图像。

可使用4位/8位并行、2线或3线串行多种接口方式,拥有多种字库的点阵图形液晶显示模块;接口方式灵活,操作指令简单、方便,可构成全中文人机交互图形界面。

可以显示汉字,也可完成图形显示;电压、功耗较低;硬件电路结构与显示程序都要简洁,同时价格也略低于相同点阵的图形液晶模块。

关键词:51单片机12864LCD 显示屏动态静态图像引言带中文字库的TS128X64(图1)具有4位/8位并行、2线或3线串行多种接口方式,引脚功能见图2。

其内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集。

图1 TS12864液晶实物图该模块接口方式灵活和操作指令简单、方便,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字。

也可完成图形显示,有低电压低功耗的特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构还是显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

本设计讲采用STC89C52对TS128X64进行驱动,设计并制作LCD驱动电路,使其可通过按键切换LCD的显示内容,并且实现对数字,汉字,英文以及图片的显示,滚屏,以及动画功能。

1.硬件设备STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。

STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#define LCD_data P0 //数据口
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
sbit LCD_RST = P3^7; //液晶复位端口
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void delay(int ms); //void delay1(int ms);//延时函数 void Delay_S(void); //延时 1s 误差 0us //bit lcd_busy();//lcd 测忙函数 //void lcd_wcmd(uchar cmd);//写命令函数 //void lcd_wdat(uchar dat);//写数据函数 //uchar lcd_rdat();//读数据函数 void lcd_init();//lcd 初始化函数 //void lcd_pos(uchar X,uchar Y);//确定坐标函数 //void lcdflag(); //闪烁函数 //void photodisplay(uchar *bmp);//显示图片函数*/ //void DrawPoint(unsigned char x,unsigned char y,unsigned char color);//打点函数 void line(unsigned char x0,unsigned char y0, unsigned char x1,unsigned char y1,unsigned char color);//画直线函数 //void rect(int x0, int y0, int x1, int y1); //画矩形函数 //void rectfill(int x0, int y0, int x1, int y1);//画实心矩形函数 void circle(int x1, int y1, unsigned int r);//画圆函数 //void circlefill(int x1, int y1, unsigned int r,unsigned char color);//画实心圆函数
/************************************************************
* 描述:
*
* 12864 标准字库液晶演示 数据 p0,控制 p2
*
************************************************************/
/*******************************************************************/
#ifndef LCD12864_BSP_H_ #define LCD12864_BSP_H_
#define uchar unsigned char #define uint unsigned int
#define pi 3.1412926
//定义π
/************* 12864LCD 引脚定义 *************/
void DISPd(char x0,char y0,char R,char Time,char step,char color);//画时钟指针函数 void clr_screen();//清屏函数
#endif
/**************************************************************************/ /********************第一版,功能正常,待修改完善**************************/ /********************作者:WHJWNAVY*************************************/ /********************QQ:805400349******************************************/ /********************请尊重作者劳动成果!**********************************/ /********************时间:2012.07.14***************************************/ /********************文件名:lcd12864_bsp.c*********************************/ /********************作用:相关函数定义及硬件驱动程序**********************/ /*************************************************************************/ #include <reg51.h> #include <intrins.h> #include<stdlib.h> #include<math.h> #include "lcd12864_bsp.h"
基于 51 单片机的 12864 指针式模拟时钟
效果图:
/****************************************************************************/ /******************第一版,功能正常,待修改完善******************************/ /******************作者:WHJWNAVY****************************************/ /******************QQ:805400349*********************************************/ /******************请尊重作者劳动成果!**************************************/ /******************时间:2012.07.14******************************************/ /*******************文件名:lcd12864_ZZZMB.c********************************/ /*******************作用:主函数,时间处理及指针显示*************************/ /****************************************************************************/
DrawHand(x0,y0,15,k,6,0);//消除原来的时针位置 k++; if(k==60)k=0; DrawHand(x0,y0,15,k,6,1);//显示新的时针位置 } } Delay_S(); //“一秒”的长度 DrawHand(x0,y0,25,i,6,0); // 消除秒针位置 if((i==j)||(i==k)||(j==k)) //处理指针相遇 { DrawHand(x0,y0,20,j,6,1); //显示分针 DrawHand(x0,y0,15,k,6,1); //显示时针 } } } }
i=0;j=0;k=45;
delay(100);
//上电,等待稳定
lcd_init();
//初始化 LCD
clr_screen(); //清屏 DISP_BP(); //画表盘 DrawHand(x0,y0,25,i,6,1); //显示秒针 DrawHand(x0,y0,20,j,6,1); //显示分针 DrawHand(x0,y0,15,k,6,1); //显示时针 while(1) { for(i=0;i<60;i++) //秒 {
/*********************************************************
*
*
* 主函数
*
*
*
*********************************************************/
void main()
{
uchar i,j,k;
DrawHand(x0,y0,25,i,6,1); //显示秒针位置 if(i==0) //分 { DrawHand(x0,y0,20,j,6,0); //消除原来分针位置 j++; if(j==60)j=0; DrawHand(x0,y0,20,j,6,1); //显示新的分针位置 if(((j+1)%12)==0) //时 {
/*************************************************************************/ /********************第一版,功能正常,待修改完善*************************/ /********************作者:WHJWNAVY***********************************/ /********************QQ:805400349****************************************/ /********************请尊重作者劳动成果!*********************************/ /*********************时间:2012.07.14*************************************/ /*********************文件名:lcd12864_bsp.h********************************/ /*********************作用:头文件,相关函数声明及硬件端口定义*************/ /**************************************************************************/
相关文档
最新文档