12864LCD显示倒计时程序

简介:第一行显示,距离系统爆炸时间第二行显示,还剩第三行显示,00时,00分,00秒第四行显示,周林按下旋钮开关,开始设定秒,秒编辑位闪动。

左右旋转设定数值,在按下开关,秒确定,设定分,分编辑位闪动左右调数值,再按下,分确定,小时位闪动。

左右转调小时,再按一下。

时间确定,开始倒计时。

到达定时时间后停止,并闪动。

#include <reg52.h>#include <intrins.h>/********************* 定义********************************/#define LCD_data P0 //数据口sbit LCD_RS = P2 ^ 0; //寄存器选择输入sbit LCD_RW = P2 ^ 1; //液晶读/写控制sbit LCD_EN = P2 ^ 2; //液晶使能控制sbit LCD_PSB = P2 ^ 3; //串/并方式控制sbit LCD_RST = P2 ^ 5; //液晶复位端口sbit sset=P3^4;//设置按钮sbit spk=P1^4;sbit sadd=P2^7;sbit sdel=P2^6;signed char second=0,minute=0,hour=0,count=0,keycount=0; signed char key=0;unsigned char code DIS1[] ={"距离系统爆炸时间"};unsigned char code DIS2[] ={"还剩:"};unsigned char code DIS31[] ={"时"};unsigned char code DIS32[] ={"分"};unsigned char code DIS33[] ={"秒"};unsigned char code DIS4[] ={"周林"};unsigned char code table2[]="0123456789";char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节/*********************延时子函数**************************/ void delayNOP()//us延时子函数(4.34us){_nop_();_nop_();_nop_();_nop_();}void delayms(unsigned int ms)//ms延时子函数{unsigned char y;while (ms--){for (y = 0; y < 114; y++)}}//******************检查LCD忙状态**************************bit lcd_busy()//检查LCD忙状态1忙,0闲{bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0 &0x80);LCD_EN = 0;return (result);}//***********************写指令数据***********************void lcd_wcmd(unsigned char cmd)//写指令数据到LCD{while (lcd_busy()){}LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;P0 = cmd;delayNOP();LCD_EN = 0;}void lcd_wdat(unsigned char dat)//写显示数据到LCD{while (lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;P0 = dat;delayNOP();LCD_EN = 0;}void writesmh(unsigned char add,unsigned char date)//显示个位和十位数据{unsigned char shi,ge;shi=date/10;ge=date%10;lcd_wcmd(0x80+add);delayms(5);lcd_wdat(table2[shi]);delayms(5);lcd_wdat(table2[ge]);delayms(5);}//*********************初始化设定**************************** void lcd_init(){LCD_PSB = 1; //并口方式LCD_RST = 0; //液晶复位delayms(5); //液晶复位LCD_RST = 1; //液晶复位delayms(5); //液晶复位lcd_wcmd(0x34); //扩充功能设定,扩充指令,选8位数据delayms(5);lcd_wcmd(0x30); //功能设定,基本指令操作,选8位数据delayms(5);lcd_wcmd(0x0C); //显示开,关光标,关光标反白允许。

delayms(5);lcd_wcmd(0x04); //光标的移动方向delayms(5);lcd_wcmd(0x01); //清除LCD的显示内容delayms(5);TMOD=0x01;TH0=0x3C;TL0=0xB0;EA=1;ET0=1;TR0=0;EX0=0; //外部中断0允许IT0=1; //外部中断0为边沿触发方式}//*********************设定显示位置子函数********************** void lcd_pos(unsigned char X, unsigned char Y)//设定显示位置{unsigned char pos;if (X == 1){X = 0x80;}else if (X == 2){X = 0x90;}else if (X == 3){X = 0x88;}else if (X == 4){X = 0x98;}pos = X + Y; //确定显示地址lcd_wcmd(pos); //写显示地址}//*****************清屏子函数***************************void clr_screen()//清屏子函数{lcd_wcmd(0x34); //扩充指令操作delayms(5);lcd_wcmd(0x30); //基本指令操作delayms(5);lcd_wcmd(0x01); //清屏delayms(5);}//******************闪烁子函数************************** void lcdflag(){lcd_wcmd(0x08); //关闭显示delayms(500);lcd_wcmd(0x0c); //开启显示delayms(500);lcd_wcmd(0x08);delayms(500);lcd_wcmd(0x0c);delayms(500);lcd_wcmd(0x08);delayms(500);lcd_wcmd(0x0c);delayms(500);}//******************写字符串子函数************************* void wr_string(unsigned char str[])//写字符串子函数{unsigned char num = 0;while (str[num]){lcd_wdat(str[num++]); //写数据}}//********************按键设置时间************************* void keyscan()//按键设置时间{if(sset==0){delayms(10);if(sset==0){EX0=1;keycount++;while(sset==0){;}if(keycount==1){TR0=0; //停止计时key=1;keycount=2;lcd_wcmd(0x8e);lcd_wcmd(0x0d);//秒位闪烁}if(keycount==2){;}if(keycount==3)keycount=4;lcd_wcmd(0x8c);lcd_wcmd(0x0d);//分位闪烁//lcd_wcmd(0x04);光标左移一位}if(keycount==4){;}if(keycount==5){keycount=6;lcd_wcmd(0x8a);lcd_wcmd(0x0d);//时位闪烁}if(keycount==6){;}if(keycount==7)keycount=0;lcd_wcmd(0x0c);//停止闪烁TR0=1; //开始计时EX0=1;}}}if(keycount!=0){if(keycount==2)//编辑秒{if(sadd==0)//数值加1{delayms(10);if(sadd==0){second++;if(second==60){second=0;}sadd=1;}writesmh(0x0e,second);lcd_wcmd(0x8e);lcd_wcmd(0x0d);//秒位闪烁}if(sdel==0)//数值减1{delayms(10);if(sdel==0){if(second==0){second=60;}second--;sdel=1;}writesmh(0x0e,second);lcd_wcmd(0x8e);lcd_wcmd(0x0d);//秒位闪烁}}if(keycount==4)//编辑分钟{if(sadd==0)//数值加1{delayms(10);;if(sadd==0){minute++;if(minute==60){minute=0;}sadd=1;}writesmh(0x0c,minute);lcd_wcmd(0x8c);lcd_wcmd(0x0d);//分位闪烁if(sdel==0)//数值减1{delayms(10);if(sdel==0){if(minute==0){minute=60;}minute--;sdel=1;}writesmh(0x0c,minute);lcd_wcmd(0x8c);lcd_wcmd(0x0d);//分位闪烁}}if(keycount==6)//编辑小时{if(sadd==0)//数值加1delayms(10);if(sadd==0){hour++;if(hour==24){minute=0;}sadd=1;}writesmh(0x0a,hour);lcd_wcmd(0x8a);lcd_wcmd(0x0d);//时位闪烁}if(sdel==0)//数值减1{delayms(10);if(sdel==0){if(hour==0){hour=24;}hour--;sdel=1;}writesmh(0x0a,hour);lcd_wcmd(0x8a);lcd_wcmd(0x0d);//时位闪烁}}}}//主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数主函数void main(){delayms(100); //上电,等待稳定lcd_init(); //初始化LCDlcd_pos(1, 0); //设置显示位置为第一行wr_string(DIS1);lcd_pos(2, 0); //设置显示位置为第二行wr_string(DIS2);lcd_pos(3, 3); //设置显示位置为第四行wr_string(DIS31);lcd_pos(3, 5); //设置显示位置为第四行wr_string(DIS32);lcd_pos(3, 7); //设置显示位置为第四行wr_string(DIS33);lcd_pos(4, 6); //设置显示位置为第四行wr_string(DIS4);writesmh(0x0e,second);delayms(5);writesmh(0x0c,minute);delayms(5);writesmh(0x0a,hour);delayms(5);while (1){keyscan();}}//**********************中断*************************** void time0() interrupt 1 using 0//倒计时中断{TH0=0x3C;TL0=0xB0;count++;if(count==20){count=0;second--;if(second<0){second=59;minute--;if(minute<0){minute=59;hour--;if(hour<0){hour=24;}lcd_pos(3, 2); //设置显示位置为第三行,第七列writesmh(0x0a,hour);}lcd_pos(3, 4); //设置显示位置为第三行,第七列writesmh(0x0c,minute);}lcd_pos(3, 6); //设置显示位置为第三行,第七列writesmh(0x0e,second);if((second==0)&&(minute==0)&&(hour==0))//到点后响铃{TR0=0;spk=0;second=0;minute=0;hour=0;lcdflag();spk=1;}}}void encoder(void) interrupt 0//外部中断0 旋转码开关中断程序{if(INT1==1){sadd=0;sdel=1;}if(INT1==0){sdel=0;sadd=1;}}//*********************************************************。

合集下载

12864时钟显示程序

12864时钟显示程序

12864时钟显示程序/*用LCD12864液晶显示器进行设置时钟,有独立键盘调节时间程序*/个人觉得在学习编写LCD12864显示程序时可以多结合1602一起来学习,很多东西是相通的,我这个程序就是,还有对于初学者来说,最好是理解程序每个模块的作用,掌握后对于以后的编程学习进度会更快,再补充说明一句,对于显示模块程序,着重需要对地址些函数部分理解,废话不多说,看程序吧:#include#define uchar unsigned char#define uint unsigned intsbit RS= P2^6;//数据/命令选择端(H/L)sbit RW= P2^5;//读写/选择端(H/L)sbit EP= P2^7;//使能信号sbit K1=P3^0; //开关定义sbit K2=P3^1;sbit K3=P3^2;uchar num,t;uchar K1num;char s,f,m; //可取负数uchar code table[]= " 2013-8-12 MON ";//日期显示uchar code table1[]=" 00: 00: 00 AM "; //时间显示uchar code table2[]="长沙今日多云"; //天气显示uchar code table3[]=" 南风39-30℃"; //气温显示void init1(); //中断子函数void delay(uint k) //延时函数{uint i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);}void write(uchar com) //命令指令函数{ //根据时序图来设置RS=0; //选择指令寄存器RW=0; //选择写P0=com; //将8位数据通过P0口传给12864delay(5); //延时一会,让12864准备接收数据EP=1; //使能线电平变化,数据送入1602的八位数据口delay(5);EP=0;}void read(uchar date) //写入指令函数{ //根据时序图来设置RS=1; //选择寄存器RW=0; //选择写P0=date; //将8位数据通过P0口传给12864delay(5);EP=1;delay(5);EP=0;}void init() //初始化函数{RS=0;EP=0;RW=0;write(0x38); //显示设置模式write(0x0c); //显示开关控制write(0x06); //光标设置write(0x01); //清屏设置write(0x80); //数据地址初始位for(num=0;num<16;num++) //查table表数据{read(table[num]); //读取表中内容delay(20);}write(0x90);//重新设置数据指针for(num=0;num<16;num++) //查table2表数据{read(table2[num]); //读取表中内容delay(20);}write(0x98);//重新设置数据指针for(num=0;num<16;num++) //查table3表数据{read(table3[num]); //读取表中内容delay(20);}write(0x88);//重新设置数据指针for(num=0;num<16;num++){read(table1[num]); //读取table1表中内容delay(20);}}void write_sfm(uchar add,uchar date) // 时分秒函数设置{ uchar shi ,ge;shi=date/10; // 取商ge=date%10; //取余write(0x83+add); //设置add位地置read(0x30+shi); //设置十位地置read(0x30+ge); //设置个位地址}void key() //独立开关控制{if(K1==0){delay(5);if(K1==0){K1num++;while(!K1); //判断按键是否按下if(K1num==1) //按一下调节秒{TR0=0; //关定时器write(0x83+10); //找到秒位置write(0x0f); //光标闪烁}}if(K1num==2){write(0x83+8);//再按一下调节分地址}if(K1num==3) //第三次按下调节时{write(0x83+6);}if(K1num==4) //按四次回到正常计时{K1num=0;write(0x0c);//光标不闪TR0=1;}}if(K1num!=0) //有按下{if(K2==0) //K2开关控制时分秒加{delay(5);if(K2==0) //消抖{while(!K2);//松手if(K1num==1) //秒调节{m++;if(m==60)m=0;write_sfm(10,m);write(0x83+10);//秒钟地址}if(K1num==2) //分钟调节{f++;if(f==60)f=0;write_sfm(8,f);write(0x83+8); //分钟地址}if(K1num==3) //小时调节{s++;if(s==23)s=0;write_sfm(6,s);write(0x83+6);//时地址}}}if(K3==0){delay(5);if(K3==0){while(!K3);if(K1num==1) //K3控制时分秒减{m--;if(m==-1)m=59;write_sfm(10,m);write(0x83+10);}if(K1num==2)f--;if(f==-1)f=59;write_sfm(8,f);write(0x83+8);}if(K1num==3){s--;if(s==-1)m=23;write_sfm(6,s);write(0x83+6);}}}}}void main() //主函数{init(); //调用子函数init1(); //调用定时子函数while(1){key();}}void init1() //定时子函数{TMOD=0x01;EA=1; //开总中断ET0=1; //开定时器中断TR0=1;TH0=(65536-50000)/256; //设置时间50ms TL0=(65536-50000)%256;}void e() interrupt 1 //定时器T0方式1中断{ TH0=(65536-50000)/256;TL0=(65536-50000)%256;t++;if(t==18) //一秒钟定时{m++;if(m==60) //秒设置{m=0;f++;if(f==60) //分设置{f=0;s++;if(s==24) //小时设置{s=0;}write_sfm(6,s); //时位数据读取}write_sfm(8,f); //分位数据读取}write_sfm(10,m); //秒位数据读取}}。

基于DS1302写的12864LCD时钟程序(word文档良心出品)

基于DS1302写的12864LCD时钟程序(word文档良心出品)

以下是我写的12864LCD并行口时钟显示程序,时钟用按键可调/***************12864.h头文件******************************/#ifndef _12864_h#define _12864_h/*****包含头文件**************/#include<reg51.h>#include"string.h"#include"DS1302.h"/********定义I/0口**********/#define LCD12864_DATA P0sbit LCD12864_E = P2^7;sbit LCD12864_RW = P2^5;sbit LCD12864_RS = P2^6;sbit LCD12864_RET= P2^0;sbit LCD12864_PSB =P2^2;/******声明全局函数*********/void Delay1ms(unsigned int); //声明延时函数void BusyChk_12864(void); //声明忙检测函数void WrCom(unsigned char); //声明写入命令函数//unsigned char ReDat(void); //声明读数据函数void WrDat(unsigned char); //声明写数据函数void LcdInit(void); //12864初始化函数void SetAddress(unsigned char ,unsigned char); //设置地址转换void DisplayString(unsigned char ,unsigned char,unsigned char *p);//行显示字符void DisplayTime();void DisplayDay();void DisplayWeek();#endif/*****************************12864.c***********************************/#include"12864.h"/****************************************************************************** ** 函数名: Delay1ms* 函数功能: 延时函数,延时1ms* 输入: c* 输出 e : 无* 说名: 该函数是在12MHZ晶振下,12分频单片机的延时。

单片机制作的12864液晶万年历_C语言程序

单片机制作的12864液晶万年历_C语言程序

#include<reg52.H>#include<intrins.h>#include<math.h>////////////////////////////////////////DS18B20#define uchar unsigned char#define uint unsigned intsbit DQ = P1 ^ 0; // 定义DS18B20的单总线#define Lcd_Bus P0sbit LCD_RS=P2^7; //数据/命令选择sbit LCD_RW=P2^6; //读写控制sbit LCD_EN=P2^5; //片选信号#define LCD_DA TA P0 //8 bit数据线#define LOW 0#define HIGH 1//初始化指令#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H#define AC_INIT 0x02 //将AC设置为00H。

且游标移到原点位置#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)#define FUN_MODE 0x30 //工作模式:8位基本指令集#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白#define DISPLAY_OFF 0x08 //显示关#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH#define SET_DD_AC 0x80#define FUN_MODEK 0x36 //扩展指令集,8位指令#define X1address 0x80 //上半屏X轴起始地址#define X2address 0x88 //下半屏X轴起始地址#define Y address 0x80 //Y轴起始地址#define Set_Column 0x40#define Set_Page 0xB8uchar code shu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};uchar code xingqi[]="星期";uchar code hanzishu[]="一二三四五六日";unsigned char TempData = 0;double DS18B20Data;uint jiemian=0;//////////////////////////////////////////DS1302sbit DS1302_RST = P1^4;sbit DS1302_IO = P1^3;sbit DS1302_SCK = P1^2;unsigned char table[]={0X00,0X18,0X0c,0X15,0X06,0X01,0X0a};//0s 24min 12hour 14ri 5yue 5zhou 2010nianunsigned char data table1[7];//uchar code table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};uchar code shuzi[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,};unsigned char aa,bb;uchar miaoge,miaoshi,fenge,fenshi,shige,shishi,rige,rishi,yuege,yueshi,zhou,niange,nianshi;uchar shezhinum=0;//unsigned char shi,ge;////////////////////////////////////////////////键盘扫描sbit key_mnue = P3^7;sbit key_jia = P2^0;sbit key_jian = P2^1;sbit key_enter= P2^2;uchar key_number=0;//int nian,yue,ri,shi,fen;/////////////////////////////////////////////////红外sbit HW_IRQ = P3 ^ 2; // 定义38KHz一体化红外接收头与CPU的连接unsigned char DT;static unsigned char data IRCode[3],IRCON,IRCON2;//////////////////////////////////////////////////蜂鸣器sbit BEEP =P1^1;/****************************************************************************** *************** 函数名称:DS18B20_Delay()* 功能:DS18B20软件延时专用* 入口参数:count 延时参数,值越大,延时越长* 出口参数:无******************************************************************************* **************/void DS18B20_Delay(uint count) //延时函数{while(count--);}/****************************************************************************** *************** 函数名称:DS18B20_Init()* 功能:DS18B20初始化* 入口参数:无* 出口参数:返回值为1则初始化成功* 返回值为0则初始化失败******************************************************************************* **************/uchar DS18B20_Init(void){uchar x = 0;DQ = 1; // DQ复位DS18B20_Delay(8); // 稍做延时DQ = 0; // 单片机将DQ拉低DS18B20_Delay(80); // 精确延时,大于480usDQ = 1; // 拉高总线DS18B20_Delay(14); // 稍做延时后x = DQ; // 若x=0则初始化成功,若x=1则初始化失败DS18B20_Delay(20);return (~x);}/****************************************************************************** *************** 函数名称:DS18B20_Read1Byte()* 功能:从DS18B20读一个字节* 入口参数:无* 出口参数:从DS18B20读出的一个字节******************************************************************************* **************/uchar DS18B20_Read1Byte(void){uchar i = 0;uchar dat = 0;for(i=8;i>0;i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ) dat |= 0x80;DS18B20_Delay(4);}return (dat);}/****************************************************************************** *************** 函数名称:DS18B20_Write1Byte()* 功能:向DS18B20写一个字节* 入口参数:dat 要写入DS18B20的一字节数据* 出口参数:无******************************************************************************* **************/void DS18B20_Write1Byte(uchar dat){uchar i = 0;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;DS18B20_Delay(5);DQ = 1;dat>>=1;}}/****************************************************************************** *************** 函数名称:Read_Disp_Temperature()* 功能:读取并显示温度* 入口参数:无* 出口参数:无******************************************************************************* **************/double Read_Disp_Temperature(void){uint a = 0, b = 0, c = 0,d = 0,e = 0, t = 0;double tt = 0;DS18B20_Init();DS18B20_Write1Byte(0xCC); // 跳过读序号列号的操作DS18B20_Write1Byte(0x44); // 启动温度转换DS18B20_Init();DS18B20_Write1Byte(0xCC); // 跳过读序号列号的操作DS18B20_Write1Byte(0xBE); // 读取温度寄存器a = DS18B20_Read1Byte();b = DS18B20_Read1Byte();t = b;t <<= 8;t = t | a;//tt = t * 0.0625;return t;}//***************************************************************** //函数名称:delay(uint t)延时函数。

倒计时LCD显示程序

倒计时LCD显示程序

倒计时显示程序程序:#include<reg52.h> //52单片机头文件,一般不要改动,里面包含特殊功能寄存器的定义#include <intrins.h>#define uchar unsigned char //将unsigned char定义为uchar,简化输写。

提高编程速度#define uint unsigned int //将unsigned char定义为uint,简化输写。

提高编程速度sbit lcdrs=P1^0; //数据命令选择控制sbit lcdrw=P1^1; //读/写选择控制sbit lcden=P1^2; //使能信号sbit SCL2=P1^3; //SCL2定义为P1口的第3位脚,连接DS1302SCL 和ADC0831SCL脚sbit SDA2=P1^4; //SDA2定义为P1口的第4位脚,连接DS1302SCL 和ADC0831SDA脚sbit RST = P1^5; // DS1302片选脚sbit H1=P0^4; //高四位分别对应P04-P07sbit H2=P0^5;sbit H3=P0^6;sbit H4=P0^7;sbit D=P1^7;unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0}; unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0}; code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};uchar t0[]=" - - ";uchar t1[]=" : : ";uchar wendu[]="0123456789";uchar shi,ge;uchar nian,yue,ri,shi,fen;uchar key,num;long number;uchar j;uchar flag,m,n;uchar qian2,bai2,shi2,ge2; void delay1(uchar z){uchar x,y;for(x=1000;x>1;x--)for(y=z;y>1;y--);}void delay(uchar z){uchar x,y;for(x=1000;x>1;x--)for(y=z;y>1;y--);}void write_com(uchar com) {lcdrs=0;P2=com;delay1(5);lcden=1;delay1(5);lcden=0;}void write_date(uchar date) {lcdrs=1;P2=date;delay1(5);lcden=1;delay1(5);lcden=0;}void init_lcd(){uchar i;lcden=0;lcdrw=0;write_com(0x38);write_com(0x01);write_com(0x0c);write_com(0x06);write_com(0x80);for(i=0;i<16;i++){write_date(t0[i]);delay(0);}write_com(0x80+0x40);for(i=0;i<16;i++){write_date(t1[i]);delay(0);}}/**************************DS1302************************************ */void Write_Ds1302_Byte(unsigned char temp){unsigned char i;for (i=0;i<8;i++) //循环8次写入数据{SCL2=0;SDA2=temp&0x01; //每次传输低字节temp>>=1; //右移一位SCL2=1;}}/******************************************************************** ********/void Write_Ds1302( unsigned char address,unsigned char dat ) {RST=0;_nop_();SCL2=0;_nop_();RST=1;_nop_(); //启动Write_Ds1302_Byte(address); //发送地址Write_Ds1302_Byte(dat); //发送数据RST=0; //恢复}/******************************************************************** ********/unsigned char Read_Ds1302 ( unsigned char address ){unsigned char i,temp=0x00;RST=0;_nop_();SCL2=0;_nop_();RST=1;_nop_();Write_Ds1302_Byte(address);for (i=0;i<8;i++) //循环8次读取数据{if(SDA2)temp|=0x80; //每次传输低字节SCL2=0;temp>>=1; //右移一位SCL2=1;}RST=0;_nop_(); //以下为DS1302复位的稳定时间RST=0;SCL2=0;_nop_();SCL2=1;_nop_();SDA2=0;_nop_();SDA2=1;_nop_();return (temp); //返回}/*读取日历*/void Read_RTC(void){unsigned char i,*p;p=read_rtc_address; //地址传递for(i=0;i<7;i++) //分7次读取年月日时分秒星期{l_tmpdate[i]=Read_Ds1302(*p);p++;}}/*设定日历*/void Set_RTC(void){unsigned char i,*p,tmp;for(i=0;i<7;i++){tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}Write_Ds1302(0x8e,0x00);p=write_rtc_address; //传地址for(i=0;i<7;i++) //7次写入年月日时分秒星期{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x80,0x00);}void jiaoshi(){switch(j){case 0:break;case 1:{nian=num/10*16+num%10;Write_Ds1302(0x8c,nian);//年break;}case 2:{yue=num/10*16+num%10;Write_Ds1302(0x88,yue); //月break;}case 3:{ri=num/10*16+num%10;Write_Ds1302(0x86,ri); //日break;}case 4:{shi=num/10*16+num%10;Write_Ds1302(0x84,shi); //时break;}case 5:{fen=num/10*16+num%10;Write_Ds1302(0x82,fen); //分break;}}}void display(){uchar nians,niang,yues,yueg,ris,rig;uchar shis,shig,fens,feng,miaos,miaog;uchar qian1,bai1,shi1,ge1;nians=l_tmpdate[6]/16;niang=l_tmpdate[6]&0x0f;yues=l_tmpdate[4]/16;yueg=l_tmpdate[4]&0x0f;ris=l_tmpdate[3]/16;rig=l_tmpdate[3]&0x0f;shis=l_tmpdate[2]/16/10;shig=l_tmpdate[2]&0x0f;fens=l_tmpdate[1]/16;feng=l_tmpdate[1]&0x0f;miaos=l_tmpdate[0]/16;miaog=l_tmpdate[0]&0x0f;if(shis==0&&shig==0&&fens==0&&feng==0&&miaos==0&&miaog==0)number--;if(number==0) D=0;write_com(0x80+4);write_date(wendu[nians]);write_com(0x80+5);write_date(wendu[niang]);write_com(0x80+7);write_date(wendu[yues]);write_com(0x80+8);write_date(wendu[yueg]);write_com(0x80+10);write_date(wendu[ris]);write_com(0x80+11);write_date(wendu[rig]);write_com(0x80+0x40);write_date(wendu[shis]);write_com(0x80+0x40+1); write_date(wendu[shig]);write_com(0x80+0x40+3); write_date(wendu[fens]);write_com(0x80+0x40+4); write_date(wendu[feng]);write_com(0x80+0x40+6); write_date(wendu[miaos]);write_com(0x80+0x40+7); write_date(wendu[miaog]);qian1=number/1000;bai1=number%1000/100;shi1=number%1000%100/10;ge1=number%10;write_com(0x80+0x40+10); write_date(wendu[qian1]);write_com(0x80+0x40+11); write_date(wendu[bai1]);write_com(0x80+0x40+12);write_date(wendu[shi1]);write_com(0x80+0x40+13);write_date(wendu[ge1]);}void Init(){EA=1; //首先开启总中断EX0=1; //开启外部中断 0IT0=1; // 设置成下降沿触发方式EX1=1; //开启外部中断 0IT1=1;}/***************************键盘*************************************/uchar saomiao(){P0=0xfe;if(H1==0){key=1;} //按键盘S1,显示"0"if(H2==0){key=2;} //按键盘S2,显示"1"if(H3==0){key=3;} //按键盘S3,显示"2"if(H4==0){key=4;} //按键盘S4,显示"3"P0=0xfd;if(H1==0){key=5;} //按键盘S5,显示"4"if(H2==0){key=6;} //按键盘S6,显示"5"if(H3==0){key=7;} //按键盘S7,显示"6"if(H4==0){key=8;} //按键盘S8,显示"7"P0=0xfb;if(H1==0){key=9;} //按键盘S9,显示"8"if(H2==0){key=0;} //按键盘S10,显示"9"P0=0xf0;if((H1==1)&&(H2==1)&&(H3==1)&&(H4==1)){key=100;}return(key);}/**************************键盘扫描***************************************/uchar jianpan(){num=0;if(m==1){if(j<=5){n=j;if(j==1)write_com(0x80+4);if(j==2)write_com(0x80+7);if(j==3)write_com(0x80+10);if(j==4)write_com(0x80+0x40);if(j==5)write_com(0x80+0x40+3);while((saomiao()==100)&&m==1&&(j-n==0));while((saomiao()!=100)&&m==1&&(j-n==0)){shi=saomiao();if(j==1){write_com(0x80+4);write_date(wendu[shi]);}if(j==2){write_com(0x80+7);write_date(wendu[shi]);}if(j==3){write_com(0x80+10);write_date(wendu[shi]);}if(j==4){write_com(0x80+0x40);write_date(wendu[shi]);}if(j==5){write_com(0x80+0x40+3);write_date(wendu[shi]);}}while((saomiao()==100)&&m==1&&(j-n==0)); while((saomiao()!=100)&&m==1&&(j-n==0)) {ge=saomiao();if(j==1){write_com(0x80+5);write_date(wendu[ge]);write_com(0x80+4);}if(j==2){write_com(0x80+8);write_date(wendu[ge]);write_com(0x80+7);}if(j==3){write_com(0x80+11);write_date(wendu[ge]);write_com(0x80+10);}if(j==4){write_com(0x80+0x40+1);write_date(wendu[ge]);write_com(0x80+0x40);}if(j==5){write_com(0x80+0x40+4);write_date(wendu[ge]);write_com(0x80+0x40+3);}num=shi*10+ge;}}if(j==6){write_com(0x80+0x40+10);while((saomiao()==100)&&m==1);while((saomiao()!=100)&&m==1){qian2=saomiao();write_com(0x80+0x40+10);write_date(wendu[qian2]);}while((saomiao()==100)&&m==1);while((saomiao()!=100)&&m==1){bai2=saomiao();write_com(0x80+0x40+11);write_date(wendu[bai2]);}while((saomiao()==100)&&m==1);while((saomiao()!=100)&&m==1){shi2=saomiao();write_com(0x80+0x40+12);write_date(wendu[shi2]);}while((saomiao()==100)&&m==1);while((saomiao()!=100)&&m==1){ge2=saomiao();write_com(0x80+0x40+13);write_date(wendu[ge2]);}number=qian2*1000+bai2*100+shi2*10+ge2;}}return(num);}void main(){ D=1;Init();init_lcd();Set_RTC();number=1234;j=0;m=0;while(1){num=jianpan();jiaoshi();if(m==0){Read_RTC();display();delay1(10);}}}void INTI0() interrupt 0{m=0;j=0;Write_Ds1302(0x80,0x00);Write_Ds1302(0x8e,0x80); //写保护,禁止写write_com(0x0c);delay(50);}void INTI1() interrupt 2{Write_Ds1302(0x8e,0x00); //1302写保护,允许写Write_Ds1302(0x80,0x80);m=1;j++;write_com(0x0f);if(j==7){j=1;}delay(50);}。

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]);}}(注:范文素材和资料部分来自网络,供参考。

12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)

//12864汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)#include &lt;reg52.h&gt;#include &lt;intrins.h&gt;#define uchar unsigned charvoid lcd_ini();void ascii_change(void);void delay();void wri_add(uchar com);void wri_dat(uchar com1);void shan(void);void disp();void tkey(void);sbit cs=P1^7;sbit sid=P1^6;sbit sclk=P1^5;bit flag=1;uchar dat,count,f=1;//f测试哪个单元为当前闪烁状态uchar data clock[3]={23,45,12};uchar code clockname[10]={&quot;北京时间:&quot;};uchar data num[6];/*******主程序*************/void main(){lcd_ini();count=10;//机器周期为1us,每次定时50ms,此变量用来控制循环次数,在下面赋值为20,共定时1秒TMOD=0x01;TL0=0XB0;TH0=0X3C;EA=1;ET0=1;IT0=1;EX0=1;TR0=1;while(1){back:ascii_change();disp();delay();if(flag==1)goto back;tkey();shan();delay();}}/****lcd初始化*******/void lcd_ini(){wri_add(0x30);delay();wri_add(0x0c);delay();wri_add(0x01);delay();wri_add(0x06);delay();}/********定时程序*************/ void timer1() interrupt 1 using 2 {TL0=0XB0;TH0=0X3C;count--;if(count==0){count=10;clock[2]++;//秒//}elsegoto out;if(clock[2]==60){clock[2]=0;clock[1]++;//分//}if(clock[1]==60){clock[1]=0;clock[0]++;}if(clock[0]==24)//时//clock[0]=0;out:_nop_();}/*******十位个位转换成ASCII码************/ void ascii_change(void){num[5]=clock[2]-(clock[2]/10)*10+0x30;num[4]=clock[2]/10+0x30;num[3]=clock[1]-(clock[1]/10)*10+0x30;num[2]=clock[1]/10+0x30;num[1]=clock[0]-(clock[0]/10)*10+0x30;num[0]=clock[0]/10+0x30;}/********廷时程序*************/void delay(){uchar i,j;for (i=250;i&gt;0;i--)for (j=250;j&gt;0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i&lt;=8;i++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com;dat=dat&amp;0xf0;for(j=1;j&lt;=8;j++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&amp;0xf0;for(k=1;k&lt;=8;k++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i&lt;=8;i++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com1;dat=dat&amp;0xf0;for(j=1;j&lt;=8;j++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&amp;0xf0;for(k=1;k&lt;=8;k++){sid=(bit)(dat&amp;0x80);sclk=0;sclk=1;sclk=0;dat=dat&lt;&lt;1;}}/******display program***********/ void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i&lt;=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i&lt;=6;i++) {k++;if(k==3||k==5)wri_dat(clockname[8]);//时间之间的冒号。

12864液晶显示程序(串口)


/*------------------初始化-----------------*/
void init_lcd (void)
{
// rst=1;
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
void lcd_string(uchar x0,uchar y0,uchar k,uchar *chn)
{
uchar adr,i;
switch(x0)
{
case 0: adr = 0x80 + y0;
break; //在第1行y列显示
case 1: adr = 0x90 + y0;
break; //在第2行y列显示
case 2: adr = 0x88 + y0;
break; //在第3行y列显示
case 3: adr = 0x98 + y0;
break; //在第4行y列显示
default: ;
}
wr_lcd (comm,0x30);
{
case 0: adr = 0x80 + y0;
break; //在第1行y列显示
case 1: adr = 0x90 + y0;
break; //在第2行y列显示
case 2: adr = 0x88 + y0;
break; //在第3行y列显示
case 3: adr = 0x98 + y0;
#define comm 0
#define dat 1

基于51单片机的12864液晶时钟完整程序(已通过)

void init_ds1302() //
{
uchar flag ;
flag=uc_R1302(0x81); // 在秒寄存器读数 ,ch=
if (flag&0x80) //
{
v_W1302(0x8e,0x00); //
v_W1302(0x80,0x45); //0秒
v_W1302(0x82,0x29); //35分钟
T_RST = 1;
v_WTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST =0;
return(ucDa);
}
/********************************************************/
void days()
{
if ( yue== 0x01 && ri== 0x01 ){ lcd_write_string(4,3,"元旦节"); }
if ( yue== 0x02 && ri== 0x14 ){ lcd_write_string(4,3,"情人节"); }
if ( yue== 0x03 && ri== 0x08 ){ lcd_write_string(4,3,"妇女节"); }
}
void WRI(char instru) //液晶写指令
{
lcd_check_busy();
RS = 0 ; //显示指令
RW = 0 ; //写

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]);}}。

LCD12864液晶显示倒计时设计

长沙学院《单片机原理及应用》课程设计说明书题目LCD12864液晶显示倒计时器系(部)专业(班级)姓名学号指导教师起止日期课程设计任务书系(部):电子与通信工程系专业:目录概述 (4)一、设计目的 (5)二、设计任务与要求 (5)1、课题内容 (5)2、要求 (5)三、设计原理 (6)1、模块简介 (6)(1)单片机概述 (6)(2)LCD12864概述 (6)2、单片机最小系统电路 (6)3、电路总图 (7)4、软件设计思路 (7)5、设计结果 (8)四、设计心得及体会 (8)参考文献 (9)概述近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。

在生活和生产的各领域中,凡是有自动控制要求的地方都会有单片机的身影出现;从简单到复杂,从空中、地面到地下,凡是能想像到的地方几乎都有使用单片的需求。

模拟多通道压力系统是利用压力传感器采集当前压力并反映在显示器上,它可以分析压力过量程,并发出报警。

并采用电子秤原理可根据输入单价准确的计算出物体的金额。

本篇论文讨论了简单的倒计时器的设计与制作,对于倒计时器中的四位LED数码显示器来说,我为了简化线路、降低成本,采用以软件为主的接口方法,即不使用专门的硬件译码器,而采用软件程序进行译码。

1、加深对单片机的了解和运用,掌握单片机芯片80C5X系列的逻辑功能及使用方法,并且提高学生的设计能力,以及提高综合运用所学知识的实际运用能力。

1、培养我们查阅数据手册的能力,以及提高我们对查阅资料的运用和理解。

2、通过设计的过程了解单片机的开发过程,以及对软件硬件设备的选择和应用。

3、学习并加深对Keil的运用,4、熟悉模拟电路的应用与集成电路的引脚排列。

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