12864LCD显示倒计时程序
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文档良心出品)
以下是我写的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语言程序
#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显示程序
倒计时显示程序程序:#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显示实时时钟例程可运行
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汉字液晶显示--按键电子时钟程序(具有闪烁,移位,加一,减一功能)#include <reg52.h>#include <intrins.h>#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]={"北京时间:"};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>0;i--)for (j=250;j>0;j--);}/*****Write address*********/void wri_add(uchar com){uchar i,j,k;cs=0;cs=1;dat=0xf8;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/*********Write data*************/ void wri_dat(uchar com1){uchar i,j,k;cs=0;cs=1;dat=0xfa;for(i=1;i<=8;i++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=dat&0xf0;for(j=1;j<=8;j++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}dat=com1;dat=_cror_(dat,4);// 此为高低四位交换dat=dat&0xf0;for(k=1;k<=8;k++){sid=(bit)(dat&0x80);sclk=0;sclk=1;sclk=0;dat=dat<<1;}}/******display program***********/ void disp(){uchar i,k=0;wri_add(0x80);for (i=1;i<=9;i++)wri_dat(clockname[i-1]);wri_add(0x90);for (i=1;i<=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液晶时钟完整程序(已通过)
{
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、熟悉模拟电路的应用与集成电路的引脚排列。
无字库LCD12864(无时钟芯片显示时间)
/************************************************************************** 在无字库的12864LCD上显示时、分、秒;没有用时钟芯片MCU:STC89C52晶振:11.0592MHz作者:罗元俊时间:2014.06.25**************************************************************************/ #include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;#define Port P0 // 数据端口#define Disp_On 0x3f // 开显示#define Disp_Off 0x3e // 关显示#define Col_Add 0x40 // 列地址#define Page_Add 0xb8 // 页地址#define Start_Line 0xc0 // 起始页sbit RS = P2^6;sbit RW = P2^5;sbit EN = P2^7;sbit CS1 = P3^2;sbit CS2 = P3^3;uint t = 0; //全局变量:秒表(用于计数时间的增量)uchar sec,min,hour; // 全局变量:秒、分、时uchar a,b,c,d,e,f; // 秒、分、时的个位和十位uchar code HZ_tab[][32] = {{/*-- 文字: 潜--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0xC2,0x0C,0x80,0x10,0x94,0x54,0x3F,0x54,0x90,0x54,0x3F,0x54,0x94,0x10,0x00,0x04,0x04,0x7E,0x01,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x01,0x00},{/*-- 文字: 龙--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x10,0x11,0x16,0xD0,0x10,0x10,0x00,0x80,0x40,0x20,0x18,0x06,0x41,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00},{/*-- 文字: 花--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x04,0x04,0x84,0x6F,0x04,0x04,0x04,0xE4,0x04,0x8F,0x44,0x24,0x04,0x04,0x00,0x04,0x02,0x01,0xFF,0x00,0x10,0x08,0x04,0x3F,0x41,0x40,0x40,0x40,0x40,0x78,0x00},{/*-- 文字: 园--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFE,0x02,0x42,0x4A,0xCA,0x4A,0x4A,0xCA,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x50,0x4C,0x43,0x40,0x40,0x4F,0x50,0x50,0x5C,0x40,0xFF,0x00,0x00},{/*-- 文字: 输--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x88,0x68,0x1F,0xC8,0x08,0x10,0xC8,0x54,0x52,0xD1,0x12,0x94,0x08,0xD0,0x10,0x00,0x09,0x19,0x09,0xFF,0x05,0x00,0xFF,0x12,0x92,0xFF,0x00,0x5F,0x80,0x7F,0x00,0x00},{/*-- 文字: 入--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x01,0xE2,0x1C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x80,0x00},{/*-- 文字: 密--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x8C,0x44,0x04,0xE4,0x04,0x95,0xA6,0x44,0x24,0x14,0x84,0x44,0x94,0x0C,0x00,0x02,0x02,0x7A,0x41,0x41,0x43,0x42,0x7E,0x42,0x42,0x42,0x43,0xF8,0x00,0x00,0x00},{/*-- 文字: 码--*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x84,0xE4,0x5C,0x44,0xC4,0x00,0x02,0xF2,0x82,0x82,0x82,0xFE,0x80,0x80,0x00,0x02,0x01,0x7F,0x10,0x10,0x3F,0x00,0x08,0x08,0x08,0x08,0x48,0x88,0x40,0x3F,0x00}};uchar code SZ_tab[][16] = {{/*-- 文字: 0 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, //0 {/*-- 文字: 1 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, //1 {/*-- 文字: 2 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, //2 {/*-- 文字: 3 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}, //3 {/*-- 文字: 4 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}, //4{/*-- 文字: 5 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00}, //5 {/*-- 文字: 6 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}, //6 {/*-- 文字: 7 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}, //7 {/*-- 文字: 8 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}, //8 {/*-- 文字: 9 --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}, //9 {/*-- 文字: - --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, //10 {/*-- 文字: : --*//*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00} //11 };void delayms(uint xms) //延时子程序{uint x,y;for(x = xms;x > 0;x--)for(y = 2;y > 0;y--);}void DetBusybit(void) //忙位检测子程序{Port = 0xff; //读状态值时,先给数据端口赋高电平RS = 0;RW = 1;EN = 1;while(Port & 0x80); //如果LCD处于忙状态,程序就此停止delayms(2);EN = 0;}void LCD_WrCom_L(uchar com) // 写左半屏指令子程序{DetBusybit();CS1 = 1; CS2 = 0;RS = 0;RW = 0;EN = 1;Port = com;delayms(5);EN = 0;}void LCD_WrCom_R(uchar com) // 写右半屏指令子程序{DetBusybit();CS1 = 0; CS2 = 1;RS = 0;RW = 0;EN = 1;Port = com;delayms(5);EN = 0;}void LCD_WrDat_L(uchar dat) // 写左半屏数据子程序{DetBusybit();CS1 = 1; CS2 = 0;RS = 1;RW = 0;EN = 1;Port = dat;delayms(5);EN = 0;}void LCD_WrDat_R(uchar dat) // 写右半屏数据子程序{DetBusybit();CS1 = 0; CS2 = 1;RS = 1;RW = 0;EN = 1;Port = dat;delayms(5);EN = 0;}void Clear_L(void) // 左半屏清屏{uchar i,j;CS1 = 1; CS2 = 0;LCD_WrCom_L(Page_Add + 0);LCD_WrCom_L(Col_Add + 0);for(j = 0; j < 8; j++)LCD_WrCom_L(Page_Add + j);for(i = 0; i < 64; i++)LCD_WrDat_L(0x00);}void Clear_R(void) // 右半屏清屏{uchar i,j;CS1 = 0; CS2 = 1;LCD_WrCom_R(Page_Add + 0);LCD_WrCom_R(Col_Add + 0);for(j = 0; j < 8; j++)LCD_WrCom_R(Page_Add + j);for(i = 0; i < 64; i++)LCD_WrDat_R(0x00);}void Disp_HZ_L(uchar pag,uchar col,uchar n) // 显示左半屏汉字16*16 {uchar i = 0,j = 0;CS1 = 1; CS2 = 0;for(i = 0; i < 2; i++){LCD_WrCom_L(Page_Add + pag + i);LCD_WrCom_L(Col_Add + col);for(j = 0; j < 16; j++)LCD_WrDat_L(HZ_tab[n][16*i+j]);}}void Disp_SZ_L(uchar pag,uchar col,uchar n) // 显示左半屏数字8*16 {uchar i = 0,j = 0,k = 0;CS1 = 1; CS2 = 0;for(i = 0; i < 2; i++){LCD_WrCom_L(Page_Add + pag + i);LCD_WrCom_L(Col_Add + col);for(j = 0; j < 8; j++){LCD_WrDat_L(SZ_tab[n][8*i+j]);}}}void Disp_HZ_R(uchar pag,uchar col,uchar n) // 显示右半屏汉字16*16 {uchar i = 0,j = 0;CS1 = 0; CS2 = 1;for(i = 0; i < 2; i++){LCD_WrCom_R(Page_Add + pag + i);LCD_WrCom_R(Col_Add + col);for(j = 0; j < 16; j++)LCD_WrDat_R(HZ_tab[n][16*i+j]);}}void Disp_SZ_R(uchar pag,uchar col,uchar n) // 显示右半屏数字8*16 {uchar i = 0,j = 0;CS1 = 0; CS2 = 1;for(i = 0; i < 2; i++){LCD_WrCom_R(Page_Add + pag + i);LCD_WrCom_R(Col_Add + col);for(j = 0; j < 8; j++){LCD_WrDat_R(SZ_tab[n][8*i+j]);}}}void TimerInit(void) //定时器初始化函数{TMOD = 0x02; //设置定时器0为工作模式2TH0 = 0x47; //装初值TL0 = 0x47; //设定时间为0.2msEA = 1;ET0 = 1;TR0 = 1; //启动定时器0}void LCD_Init(void) // LCD初始化子程序{delayms(10);LCD_WrCom_L(Disp_Off); LCD_WrCom_R(Disp_Off);LCD_WrCom_L(Page_Add + 0); LCD_WrCom_R(Page_Add + 0);LCD_WrCom_L(Start_Line + 0); LCD_WrCom_R(Start_Line + 0);LCD_WrCom_L(Col_Add + 0); LCD_WrCom_R(Col_Add + 0);LCD_WrCom_L(Disp_On); LCD_WrCom_R(Disp_On); }void main(void){LCD_Init();TimerInit();Clear_L();Clear_R();while(1){sec = t%60; //秒钟分离min = (t/60)%60; //分钟分离hour = (t/3600)%60; //时钟分离a = sec%10; //秒钟个位分离b = (sec/10)%10; //秒钟十位分离c = min%10; //分钟个位分离d = (min/10)%10; //分钟十位分离e = hour%10; //时钟个位分离f = (hour/10)%10; //时钟十位分?Disp_HZ_L(0,32,0); // 第0页,第16列,第0个字Disp_HZ_L(0,48,1);Disp_HZ_R(0,0,2);Disp_HZ_R(0,16,3);Disp_SZ_L(2,24,2);Disp_SZ_L(2,32,0);Disp_SZ_L(2,40,1);Disp_SZ_L(2,48,4);Disp_SZ_L(2,56,10);Disp_SZ_R(2,0,0);Disp_SZ_R(2,8,6);Disp_SZ_R(2,16,10);Disp_SZ_R(2,24,2);Disp_SZ_R(2,32,7);Disp_SZ_L(4,32,f);Disp_SZ_L(4,40,e);Disp_SZ_L(4,48,11);Disp_SZ_L(4,56,d);Disp_SZ_R(4,0,c);Disp_SZ_R(4,8,11);Disp_SZ_R(4,16,b);Disp_SZ_R(4,24,a);Disp_HZ_L(6,0,4);Disp_HZ_L(6,16,5);Disp_HZ_L(6,32,6);Disp_HZ_L(6,48,7);Disp_SZ_R(6,0,11);}}void timer0(void) interrupt 1{uint i;i++;if(i == 5000) //1s时间到{t++; //秒表计时开始i = 0;}}。
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); //显示开,关光标,关光标反白允许。
12864LCD液晶显示屏程序(南京航空航天大学金城学院)
附:实验箱程序#include<reg52.h>#include<ABSACC.H>typedef unsigned char uchar;typedef unsigned int uint;#define LLCD_CMD_WR XBYTE[0xfe04] //地址需根据实际情况计算改变(下同)#define LLCD_CMD_RD XBYTE[0xfe06]#define LLCD_DATA_WR XBYTE[0xfe05]#define LLCD_DATA_RD XBYTE[0xfe07]#define RLCD_CMD_WR XBYTE[0xfe00]#define RLCD_CMD_RD XBYTE[0xfe02]#define RLCD_DATA_WR XBYTE[0xfe01]#define RLCD_DATA_RD XBYTE[0xfe03]sbit busy=P0^7;code uchar hanzil[]={0x08,0x64,0x23,0xA6,0xAA,0xA2,0xAA,0xB4,0xA3,0xA2,0xA6,0x2A,0x22,0x62,0x20,0x00,0x00,0x00,0x00,0xFF,0x4A,0x4A,0x4A,0x4A,0x4A,0x4A,0x4B,0xF8,0x00,0x00,0x00,0x00,/*"管",0*/0x42,0x42,0xFE,0x42,0x42,0x00,0x40,0x5E,0x50,0xD0,0x5F,0x50,0x50,0x5E,0x40,0x00,0x10,0x10,0x0F,0x08,0x04,0x00,0xFF,0x01,0x01,0x7F,0x01,0x3F,0x41,0x81,0x7F,0x00,/*"瑞",1*/0x00,0x00,0x60,0x50,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x98,0xF0,0x70,0x00,0x00,0x00,0x00,0x20,0x30,0x28,0x28,0x24,0x24,0x22,0x22,0x21,0x20,0x30,0x18,0x00,0x00,/*"2",0*/0x00,0x00,0x00,0x60,0x90,0x08,0x08,0x10,0x20,0x10,0x08,0x08,0x90,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,/*"心",0*/0x00,0x00,0x00,0x60,0x90,0x08,0x08,0x10,0x20,0x10,0x08,0x08,0x90,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,/*"心",0*/0x00,0xE0,0xF0,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x18,0x10,0xF0,0xC0,0x00,0x00,0x00,0x00,0x11,0x33,0x22,0x22,0x22,0x22,0x22,0x32,0x11,0x1D,0x0F,0x03,0x00,0x00,/*"9",3*/0x00,0x00,0x00,0x60,0x90,0x08,0x08,0x10,0x20,0x10,0x08,0x08,0x90,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,/*"心",0*/0x00,0x00,0x30,0x30,0x08,0x08,0x88,0x88,0x88,0x88,0x58,0x70,0x30,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x11,0x1F,0x0E,0x00,0x00,/*"3",5*/0x00,0x00,0x30,0x30,0x08,0x08,0x88,0x88,0x88,0x88,0x58,0x70,0x30,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x11,0x1F,0x0E,0x00,0x00,/*"3",6*/0x00,0x00,0x60,0x50,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x98,0xF0,0x70,0x00,0x00,0x00,0x00,0x20,0x30,0x28,0x28,0x24,0x24,0x22,0x22,0x21,0x20,0x30,0x18,0x00,0x00,/*"2",7*/0x00,0x00,0x60,0x50,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x98,0xF0,0x70,0x00,0x00,0x00,0x00,0x20,0x30,0x28,0x28,0x24,0x24,0x22,0x22,0x21,0x20,0x30,0x18,0x00,0x00,/*"2",8*/0x00,0x00,0x30,0x30,0x08,0x08,0x88,0x88,0x88,0x88,0x58,0x70,0x30,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x31,0x11,0x1F,0x0E,0x00,0x00,/*"3",9*/0x00,0x00,0x20,0x10,0x08,0x10,0x20,0x00,0x00,0x20,0x10,0x08,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x08,0x08,0x04,0x02,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/};void lcd_cmd_wr(uchar cmdcode,uchar right);void lcd_data_wr(uchar ldata,uchar right);void lcd_busy_rd(uchar right);void lcd_hanzi_wr(uchar posx,uchar posy,uchar *hanzi);void lcd_str_wr(uchar row,uchar col,uchar n,uchar *str);void lcd_rol();void lcd_init();void delay(uint nms);void main(){lcd_init();lcd_str_wr(1,1,13,hanzil); //起始行、列、汉字长度delay(100);while(1){lcd_rol();delay(1000);}}void lcd_cmd_wr(uchar cmdcode,uchar right) {lcd_busy_rd(right);if(right==1){ RLCD_CMD_WR=cmdcode; }else{ LLCD_CMD_WR=cmdcode; }}void lcd_data_wr(uchar ldata,uchar right) {lcd_busy_rd(right);if(right==1){RLCD_DATA_WR=ldata;}else{LLCD_DATA_WR=ldata;}}void lcd_busy_rd(uchar right){if(right==0)RLCD_CMD_RD;elseLLCD_CMD_RD;}void delay(uint nms){uint i;for(;nms>0;nms--)for(i=0;i<500;i++);}void lcd_init(void) //LCD初始化子程序{uint k,m;lcd_cmd_wr(0x3e+1,0);lcd_cmd_wr(0xc0+0,0);lcd_cmd_wr(0xb8+0,0);lcd_cmd_wr(0x40+0,0);lcd_cmd_wr(0x3e+1,1);lcd_cmd_wr(0xc0+0,1);lcd_cmd_wr(0x40+0,1);lcd_cmd_wr(0xb8+0,1);for(k=0;k<8;k++) //页循环{for(m=0;m<64;m++) //列循环{lcd_data_wr(0x00,0);lcd_data_wr(0x00,1);}lcd_cmd_wr(0xb8+k+1,0);lcd_cmd_wr(0x40+0,0);lcd_cmd_wr(0xb8+k+1,1);lcd_cmd_wr(0x40+0,1);}}void lcd_hanzi_wr(uchar posx,uchar posy,uchar*hanzi) //显示汉字子程序{uchar i;if(posy<4) //左半屏{lcd_cmd_wr(0xb8+2*posx,0);lcd_cmd_wr(0x40+16*posy,0);for(i=0;i<16;i++){lcd_data_wr(hanzi[i],0);}lcd_cmd_wr(0xb8+2*posx+1,0);lcd_cmd_wr(0x40+16*posy,0);for(i=16;i<32;i++){lcd_data_wr(hanzi[i],0);}}else //右半屏{lcd_cmd_wr(0xb8+posx*2,1);lcd_cmd_wr(0x40+16*(posy-4),1);for(i=0;i<16;i++){lcd_data_wr(hanzi[i],1);}lcd_cmd_wr(0xb8+2*posx+1,1);lcd_cmd_wr(0x40+16*(posy-4),1);for(i=16;i<32;i++){lcd_data_wr(hanzi[i],1);}}}void lcd_str_wr(uchar row,uchar col,uchar n,uchar*str) {uchar i;for(i=0;i<n;i++){if(col>7){row++;col=col-8;}lcd_hanzi_wr(row,col,str+i*32);col++;}}void lcd_rol(void) //滚动上移子程序{uchar i;for(i=0;i<64;i++){lcd_cmd_wr(0xc0+i,0);lcd_cmd_wr(0xc0+i,1);delay(10);}}PROTEUS仿真实验现象。
stm3212864lcd显示时间和温度
stm3212864lcd显示时间和温度#include "stm32f10x.h"#include "stdio.h"//-------------------------------------------------------------------------------------------------#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1 #define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2#define KEY0_PRES 1 //KEY0#define KEY1_PRES 2 //KEY1#define WKUP_PRES 3 //WK_UP//-------------------------------------------------------------------------------------------------//位带操作,实现51类似的GPIO控制功能//具体实现思想,参考<>第五章(87页~92页).//IO口操作宏定义#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))//IO口地址映射#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08//IO口操作,只对单一的IO口!//确保n的值小于16!#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入//-------------------------------------------------------------------------------------------------#define LED0 PAout(8) // PA8#define LED1 PDout(2) // PD2#define LED2 PAout(2)#define LED3 PAout(3)//-------------------------------------------------------------------------------------------------// lcd12864//-------------------------------------------------------------------------------------------------#define SID_H GPIOC->BSRR=GPIO_Pin_7#define SID_L GPIOC->BRR=GPIO_Pin_7#define CS_H GPIOC->BSRR=GPIO_Pin_8#define CS_L GPIOC->BRR=GPIO_Pin_8#define SCLK_H GPIOC->BSRR=GPIO_Pin_6#define SCLK_L GPIOC->BRR=GPIO_Pin_6#define x1 0x80#define x2 0x88#define y 0x80#define comm 0#define dat1 1u8 const num_lcd[]={"0123456789"};void Clr_Scr(void);void LCD_Write_String(u8 X,u8 Y,uc8 *s);//12864u8 A,B,C,D;void display_temp_time(void);void display_main(void);void display_1(void);//-------------------------------------------------------------------------------------------------// DS1302//-------------------------------------------------------------------------------------------------#define ds1302clk GPIO_Pin_12#define ds1302dat GPIO_Pin_13#define ds1302rst GPIO_Pin_14uint8_ttime_ds1302[7]={0x00,0x54,0x10,0x08,0x12,0x01,0x08};uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址//按键中断按下显示时间,所以需要全局变量uint8_t i=0,g[7];void ds1302_data(uint8_t *read);uint8_t DSPH[]={"00"};uint8_t DSPM[]={"00"};uint8_t DSPS[]={"00"};uint8_t DSPN[]={"00"};uint8_t DSPY[]={"00"};uint8_t DSPR[]={"00"};//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------// DS18b20//-------------------------------------------------------------------------------------------------float DS18B20_Get_Temp(void);uint8_t DS18B20_Init(void);//-------------------------------------------------------------------------------------------------#define HIGH 1#define LOW 0//-------------------------------------------------------------------------------------------------#define DS18B20_CLK RCC_APB2Periph_GPIOC#define DS18B20_PIN GPIO_Pin_13#define DS18B20_PORT GPIOC//带参宏,可以像内联函数一样使用,输出高电平或低电平#define DS18B20_DATA_OUT(a) if (a) \GPIO_SetBits(GPIOC,GPIO_Pin_13);\else \GPIO_ResetBits(GPIOC,GPIO_Pin_13)//读取引脚的电平#define DS18B20_DATA_IN() GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)uint8_t DSPWD[]={"00"};uint8_t str[2]={0};uint8_t temp;//-------------------------------------------------------------------------------------------------typedef struct{uint8_t humi_int; //湿度的整数部分uint8_t humi_deci; //湿度的小数部分uint8_t temp_int; //温度的整数部分uint8_t temp_deci; //温度的小数部分uint8_t check_sum; //校验和}DS18B20_Data_TypeDef;//---------------------------------------------------------------------------------------------------------------------------------------------------------------------static u8 fac_us=0;//us延时倍乘数static u16 fac_ms=0;//ms延时倍乘数//-------------------------------------------------------------------------------------------------volatile u32 time = 0;//-------------------------------------------------------------------------------------------------unsigned char sz[5]={0x00,0x01,0x02,0x03,0x04};//-------------------------------------------------------------------------------------------------void delay_init(void);void delay_ms(u16 nms);void delay_us(u32 nus);void KEY_Init(void);//void Delay_us(__IO u32 nTime);void delay_init(void);//-------------------------------------------------------------------------------------------------// 系统定时器初始化//-------------------------------------------------------------------------------------------------void delay_init(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8fac_us=SystemCoreClock/8000000; //为系统时钟的1/8fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数}//-------------------------------------------------------------------------------------------------void delay_us(u32 nus){u32 temp;SysTick->LOAD=nus*fac_us; //时间加载SysTick->VAL=0x00; //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16))); //等待时间到达SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00; //清空计数器}//--------------------------------------------------------------------//延时nms//注意nms的范围//SysTick->LOAD为24位寄存器,所以,最大延时为://nms<=0xffffff*8*1000/SYSCLK//SYSCLK单位为Hz,nms单位为ms//对72M条件下,nms<=1864//--------------------------------------------------------------------void delay_ms(u16 nms){u32 temp;SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00; //清空计数器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick->VAL =0X00; //清空计数器}//-------------------------------------------------------------------------------------------------// 中断优先级配置//-------------------------------------------------------------------------------------------------void NVIC_Configuration1(void){NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级}//-------------------------------------------------------------------------------------------------// 外部中断初始化函数//-------------------------------------------------------------------------------------------------void EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //外部中断,需要使能AFIO时钟KEY_Init(); //初始化按键对应io模式GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSour ce5); //GPIOC.5 中断线以及中断初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line5;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSour ce15); //GPIOA.15 中断线以及中断初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line15;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSour ce0); //GPIOA.0 中断线以及中断初始化配置EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);}//-----------------------------------------------------------------// 按键中断函数//-----------------------------------------------------------------void EXTI0_IRQHandler(void){delay_ms(10);if(WK_UP==1){LED0=!LED0;LED1=!LED1;Clr_Scr();A=1;Clr_Scr();//===================================== ============================//printf("测试");//printf("\r\n 现在温度 %.1f 度\r\n",DS18B20_Get_Temp());}EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位}//-----------------------------------------------------------------void EXTI9_5_IRQHandler(void){delay_ms(10);if(KEY0==0){LED0=!LED0;A=0;//printf("稍等");//adcx=Get_Adc_Average(ADC_Channel_1,10);//temp =(float) adcx/4096*3.3;//printf("\r\n The current AD value = 0x%04X \r\n",adcx);//printf("\r\n The current AD value = %f V \r\n",temp);}EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位}//-----------------------------------------------------------------void EXTI15_10_IRQHandler(void){delay_ms(10);if(KEY1==0){LED1=!LED1;A=2;//printf("硕硕");// ds1302_data(read);//printf("20%d%d年%d%d月%d%d日%d%d:%d%d:%d%d 星期%d\r\n",time_ds1302[6],g[6],time_ds1302[4],g[4],time_ds1302[ 3],g[3],//time_ds1302[2],g[2],time_ds1302[1],g[1],time_ds1302[0],g[ 0],g[5]);}EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位}//===================================== ========================================= ===================//-------------------------------------------------------------------------------------------------// LED GPIO 初始化//-------------------------------------------------------------------------------------------------void LED_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOD, ENABLE); //使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_2|GPIO_Pin_3; //LED0-->PA.8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽输出GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出,IO口速度为50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高}//-------------------------------------------------------------------------------------------------// GPIO 按键初始化//-------------------------------------------------------------------------------------------------void KEY_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0}//-------------------------------------------------------------------------------------------------// 串口配置//-------------------------------------------------------------------------------------------------void USART1_Config(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_/doc/400b4fab7c1cfad6185fa 744.html ART_BaudRate = 9600;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_WordLength = USART_WordLength_8b;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_StopBits = USART_StopBits_1;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Parity = USART_Parity_No ;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_HardwareFlowControl =USART_HardwareFlowControl_None;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_Cmd(USART1, ENABLE);}//--------------------------------------------------------------------// 配置USART1接收中断//--------------------------------------------------------------------void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}//--------------------------------------------------------------------//--------------------------------------------------------------------// 重定向c库函数printf到USART1//--------------------------------------------------------------------int fputc(int ch, FILE *f){//发送一个字节数据到USART1USART_SendData(USART1, (uint8_t) ch);//等待发送完毕while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);return (ch);}// 重定向c库函数scanf到USART1int fgetc(FILE *f){while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(USART1);}//--------------------------------------------------------------------// 串口3配置//--------------------------------------------------------------------void USART3_Config(void){NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);USART_/doc/400b4fab7c1cfad6185fa 744.html ART_BaudRate = 9600;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_WordLength = USART_WordLength_8b;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_StopBits = USART_StopBits_1;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Parity = USART_Parity_No ;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_/doc/400b4fab7c1cfad6185fa 744.html ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART3, &USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_Cmd(USART3, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}//===================================== ========================================= ========================================= ========================================= =====// DS1302//===================================== ========================================= ========================================= ========================================= =====void DS1302_GPIO(void){GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = ds1302clk|ds1302rst; //clk、rst配置为输出GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = ds1302dat;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; //IO配置为双向GPIO_Init(GPIOB, &GPIO_InitStruct);}//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------void write_1302byte(uint8_t dat){uint8_t i = 0;GPIO_ResetBits(GPIOB,ds1302clk);delay_us(2);//延时大约2usfor(i = 0;i < 8;i ++){GPIO_ResetBits(GPIOB,ds1302clk); //ds1302clk=0;if(dat&0x01)GPIO_SetBits(GPIOB,ds1302dat);else GPIO_ResetBits(GPIOB,ds1302dat);delay_us(2);GPIO_SetBits(GPIOB,ds1302clk);dat >>= 1;delay_us(1);}}//-----------------------------------------------uint8_t read_1302(uint8_t add){uint8_t i=0;uint8_t Return_dat=0x00;GPIO_ResetBits(GPIOB,ds1302rst);GPIO_ResetBits(GPIOB,ds1302clk);delay_us(3);GPIO_SetBits(GPIOB,ds1302rst);delay_us(3);write_1302byte(add);for(i=0;i<8;i++){GPIO_SetBits(GPIOB,ds1302clk);Return_dat >>= 1;GPIO_ResetBits(GPIOB,ds1302clk);if(GPIO_ReadInputDataBit(GPIOB,ds1302dat)==1) //数据线此时为高电平{Return_dat = Return_dat|0x80;}}delay_us(1);GPIO_ResetBits(GPIOB,ds1302rst); //ds1302rst=0;释放总线return Return_dat;}//-----------------------------------------------void write_1302(uint8_t add,uint8_t dat) //向指定寄存器写入一个字节的数据{GPIO_ResetBits(GPIOB,ds1302rst);GPIO_ResetBits(GPIOB,ds1302clk); //ds1302rst=0;//ds1302clk=0;delay_us(1);GPIO_SetBits(GPIOB,ds1302rst); //ds1302rst=1;delay_us(2);write_1302byte(add);write_1302byte(dat);GPIO_ResetBits(GPIOB,ds1302rst);GPIO_ResetBits(GPIOB,ds1302clk); //ds1302clk=0;//ds1302rst=0;delay_us(1);}//-----------------------------------------------void ds1302_init(uint8_t*write,uint8_t*time) //初始化1302 {uint8_t i=0,j=0;write_1302(0x8e,0x00);for(i=0;i<7;i++){j=time_ds1302[i]%10;time_ds1302[i]=(time_ds1302[i]/10)*16+j;}for(i=0;i<7;i++){write_1302(write[i],time_ds1302[i]);}write_1302(0x8e,0x80);//-----------------------------------------------void ds1302_data(uint8_t *read){//中断按键按下显示时间,所以定义为全局变量//uint8_t i=0,g[7],time_ds1302[7];//static uint8_t s = 1;for(i=0;i<7;i++){time_ds1302[i]=read_1302(read[i]);}//===================================== ==========/*for(i=0;i<7;i++){g[i]=time_ds1302[i]%16; time_ds1302[i]=time_ds1302[i]/16;}*///此时已转换成10进制数,g[i]里面存放的是秒分时日月周年的各个位数据//而此时的time[i]存放的是十位数据//if(s != (time[0]+g[0]))//printf("20%d%d年%d%d月%d%d日%d%d:%d%d:%d%d 星期%d\r\n",time_ds1302[6],g[6],time_ds1302[4],g[4],time_ds1302[ 3],g[3],//time_ds1302[2],g[2],time_ds1302[1],g[1],time_ds1302[0],g[ 0],g[5]);//s = time[0]+g[0];//---------------------------------------------------------------------------------------------------------------------------------------------------------------------// DS18B20温度传感器//-------------------------------------------------------------------------------------------------void DS18B20_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); //开启DS18B20_PORT的外设时钟GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; //选择要控制的DS18B20_PORT引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为通用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHzGPIO_Init(DS18B20_PORT, &GPIO_InitStructure); //调用库函数,初始化DS18B20_PORTGPIO_SetBits(DS18B20_PORT, DS18B20_PIN);}//-------------------------------------------------------------------------------------------------void DS18B20_Mode_IPU(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; //选择要控制的DS18B20_PORT引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置引脚模式为浮空输入模式GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); //调用库函数,初始化DS18B20_PORT}//-------------------------------------------------------------------------------------------------void DS18B20_Mode_Out_PP(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; //选择要控制的DS18B20_PORT引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为通用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速率为50MHzGPIO_Init(DS18B20_PORT, &GPIO_InitStructure); //调用库函数,初始化DS18B20_PORT}//-------------------------------------------------------------------------------------------------void DS18B20_Rst(void){DS18B20_Mode_Out_PP(); //主机设置为推挽输出DS18B20_DATA_OUT(LOW);delay_us(750); // 主机至少产生480us的低电平复位信号DS18B20_DATA_OUT(HIGH); //主机在产生复位信号后,需将总线拉高delay_us(15); //从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲}//-------------------------------------------------------------------------------------------------//检测从机给主机返回的存在脉冲//0:成功//1:失败//-------------------------------------------------------------------------------------------------uint8_t DS18B20_Presence(void){uint8_t pulse_time = 0;DS18B20_Mode_IPU(); //主机设置为上拉输入//等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号//如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲while( DS18B20_DATA_IN() && pulse_time<100 ){pulse_time++;delay_us(1); //经过100us后,存在脉冲都还没有到来}if( pulse_time >=100 )return 1;elsepulse_time = 0;while( !DS18B20_DATA_IN() && pulse_time<240 ) //存在脉冲到来,且存在的时间不能超过240us{pulse_time++;delay_us(1);}if( pulse_time >=240 )return 1;elsereturn 0;}//从DS18B20读取一个bituint8_t DS18B20_Read_Bit(void){uint8_t dat; //读0和读1的时间至少要大于60usDS18B20_Mode_Out_PP();DS18B20_DATA_OUT(LOW); //读时间的起始:必须由主机产生 >1us <15us 的低电平信号delay_us(10);DS18B20_Mode_IPU(); //设置成输入,释放总线,由外部上拉电阻将总线拉高//Delay_us(2);if( DS18B20_DATA_IN() == SET )dat = 1;elsedat = 0;delay_us(45); //这个延时参数请参考时序图return dat;}//从DS18B20读一个字节,低位先行uint8_t DS18B20_Read_Byte(void){uint8_t i, j, dat = 0;for(i=0; i<8; i++){j = DS18B20_Read_Bit();dat = (dat) | (j<<i);}return dat;}//写一个字节到DS18B20,低位先行void DS18B20_Write_Byte(uint8_t dat) {uint8_t i, testb;DS18B20_Mode_Out_PP();for( i=0; i<8; i++ ){testb = dat&0x01;dat = dat>>1;//写0和写1的时间至少要大于60us if (testb){DS18B20_DATA_OUT(LOW);//1us < 这个延时 < 15usdelay_us(8);DS18B20_DATA_OUT(HIGH);delay_us(58);}else{DS18B20_DATA_OUT(LOW);//60us < Tx 0 < 120usdelay_us(70);DS18B20_DATA_OUT(HIGH);//1us < Trec(恢复时间) < 无穷大delay_us(2);}}}//-------------------------------------------------------------------------------------------------void DS18B20_Start(void){DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC); // 跳过 ROMDS18B20_Write_Byte(0X44); // 开始转换}//-------------------------------------------------------------------------------------------------uint8_t DS18B20_Init(void){DS18B20_GPIO_Config();DS18B20_Rst();return DS18B20_Presence();}//温度 = 符号位 + 整数 + 小数*0.0625float DS18B20_Get_Temp(void){uint8_t tpmsb, tplsb;short s_tem;float f_tem;DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC); // 跳过 ROMDS18B20_Write_Byte(0X44); // 开始转换DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC); // 跳过 ROMDS18B20_Write_Byte(0XBE); // 读温度值tplsb = DS18B20_Read_Byte();tpmsb = DS18B20_Read_Byte();s_tem = tpmsb<<8;s_tem = s_tem | tplsb;if( s_tem < 0 ) // 负温度f_tem = (~s_tem+1) * 0.0625;elsef_tem = s_tem * 0.0625;return f_tem;}//===================================== ========================================= ===void Show_Temperature(void){</i);temp=DS18B20_Get_Temp();str[0]=temp/10;str[1]=temp%10;DSPWD[0]=str[0]+0x30;DSPWD[1]=str[1]+0x30;}//-------------------------------------------------------------------------------------------------//---------------------------------------------------------------------------------------------------------------------------------------------------------------------// LCD12864//---------------------------------------------------------------------------------------------------------------------------------------------------------------------void Lcds_Config(void){// SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/*PC4-A0*/// GPIO_SetBits(GPIOC, GPIO_Pin_12);//预置为高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;。
LCD12864(串口)显示程序
LCD12864(串口)显示程序#ifndef jh_f330#define jh_f330#include#endiftypedef unsigned char uint8;typedef unsigned int uint16;/*************端口配置**************/sbit LCD_CS = P0^4; //片选信号,低电平有效sbit LCD_RST = P0^3; //复位信号,低电平有效sbit LCD_A0 = P0^2; //数据、指令选择,H:数据、L:指令sbit LCD_DAT = P1^0; //串行输入数据引脚sbit LCD_CLK = P1^1; //串行时钟输入引脚uint8 code word1[]={0x04,0x44,0x84,0x04,0xE4,0x1F,0x84,0x44,0xA4,0x3F,0xA4,0x A4,0x64,0x06,0x04,0x00,0x20,0x10,0x09,0x04,0xFF,0x04,0x04,0x14,0x26,0x05,0x84,0xFF,0x04,0x06,0x04,0x00 };/**********预定义数据*********/#define LCD_X 128-1 //屏幕的X轴的物理宽度#define LCD_Y 64-1 //屏幕的Y轴的物理宽度/***********LCD指令集***************///LCD开关命令#define LCD_ON() Wr_Com(0xaf)#define LCD_OFF() Wr_Com(0xae)//设置显示起始行#define LCD_START_LINE 0x40 //起始行地址为,0x40+(0-63)//页地址设置#define LCD_Page 0xb0 //页地址为:0xb0+(0-8)//列地址设置#define LCD_Ad_H 0x10 //列高四位地址:0x10+()#define LCD_Ad_L 0x00 //列低四位地址:0x00+()//行列地址方向设置#define ADC_Norm() Wr_Com(0xa0);#define ADC_Reve() Wr_Com(0xa1);#define Com_Norm() Wr_Com(0xc0);#define Com_Reve() Wr_Com(0xc8);void Init_f330(){/*****内部振荡器配置******/OSCICL=OSCICL+4; //设置系统时钟为24MHZ,ΔT=(0.005*ΔOSCICL)/fbase // OSCICL=OSCICL+22; //设置系统时钟为22.1184MHZ// OSCICL=OSCICL+45; //设置系统时钟为20MHZ //15MHZ--24.5MHZ/********设置分频*********/// OSCICN|=0x00; //设置时钟为八分频,OSCIN复位值为1100000//00:8分频,01:4分频,10:2分频,11:不分频// OSCICN|=0x01; //设置系统时钟4分频// OSCICN|=0x02; //设置系统时钟2分频OSCICN|=0x03; //设置系统时钟不分频// RSTSRC=0x04;// OSCLCN = 0x82; // 设置内部L-F振荡器为40kHZ// CLKSEL = 0x02; // 内部低频振荡器while(OSCLCN&0x40 == 0); // 等待振荡器频率稳定/*****设置看门狗*****/PCA0MD &=~0x40; // 禁止看门狗定时器EA=1;/*****端口初始化******/P0MDIN = 0xff; //复位值为11111111P1MDIN = 0xff; //1为数字输入,0为模拟输入P0MDOUT = 0xff; //复位值为11111111P1MDOUT = 0xff; //1为推挽输出,0为漏极输出XBR0 = 0x00; // 交叉开关使能XBR1 = 0x40; //交叉开关允许,T0接到引脚//XBR1 = 0x48; // ECI连到端口引脚//XBR1 |= 0x08; // PCA0 外部计数输入使能}/***************************************功能:LCD串行写入数据程序**输入:8位数据**输出:无************************************/ void Wr_Dat(uint8 dat) {uint8 Num;LCD_CS = 0; //选通芯片LCD_A0 = 1; //写数据for(Num=0;Num<8;Num++){if((dat&0x80) == 0) LCD_DAT = 0;else LCD_DAT = 1;dat = dat << 1;LCD_CLK = 0;LCD_CLK = 1;}LCD_CS = 1;}/***************************************函数名称:Wr_Com()**功能:LCD串行写入命令程序**输入:8位数据**输出:无************************************/ void Wr_Com(uint8 com) {uint8 Num;LCD_CS = 0; //选通芯片LCD_A0 = 0; //写入命令for(Num=0;Num<8;Num++){if((com&0x80) == 0) LCD_DAT = 0;else LCD_DAT = 1;com = com << 1;LCD_CLK = 0;LCD_CLK = 1;}LCD_CS = 1;}/***************************************功能:LCD全屏显示数据程序**输入:8位数据**输出:无************************************/void LCD_Fill(uint8 dat){uint8 page;uint8 colume;for(page=0;page<8;page++)Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H);Wr_Com(LCD_Ad_L);for(colume=0;colume<lcd_x;colume++)< p="">Wr_Dat(dat);}}/***************************************函数名称:LCD_Clear()**功能:LCD清屏程序(全屏填充0x00)**输入:8位数据**输出:无************************************/void LCD_Clear(){LCD_Fill(0x00);}/******************************************************* ** 函数名称: LCD12864_Init** 功能: LCD1286初始化程序** 输入: 无TimeDelay ** 输出: 无********************************************************/ void TimeDelay(int Time){int i;while(Time > 0){for(i = 0;i < 8000;i++){Time --;}}void LCD_Init(void){LCD_RST=0;TimeDelay(200);LCD_RST=1;TimeDelay(200);ADC_Norm();Com_Reve();Wr_Com(0xa2);Wr_Com(0x2c); //vc onTimeDelay(200);Wr_Com(0x2e); //vr onTimeDelay(200);Wr_Com(0x2f); //internal booster,follower,divided onWr_Com(0x24); //set rb/ra=5.29Wr_Com(0x81); //set reference voltage selectWr_Com(0x1d);LCD_ON();Wr_Com(LCD_START_LINE);}/************************************************************** *********函数名称:LCD_Word()**功能:输入单个汉字(16x16符号)**输入:页地址,列地址、字符数组**输出:无*************************************************************** ********/ void LCD_Word(unsigned char row,unsigned char colume,unsigned char *pword){unsigned char page= row;unsigned char col_high=colume>>4;unsigned char col_low =colume&0x0f;unsigned char i;Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+i));}Wr_Com(LCD_Page+page+1);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+16+i));}main(){Init_f330();LCD_Init();LCD_Clear();LCD_Word(1,1,word1);while(1);}</lcd_x;colume++)<>。
12864液晶屏显示温度日期时间程序
sbit key3=P3^6;
sbit beep=P0^5;
//------------------------------------------------------------------
// ds1302定义
//-----------------------------------------------------------------
unsigned char dat1 = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat1>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat1|=0x80;
delay(5);
}
return(dat1);
//set time--second,munite,hour,day,month,week,year
//-----------------------------------------------------------------
//*****************************************************************
//往DS31302中写入一字节
//*****************************************************************
void writebyte_ds1302(uchar ds1302_data)
{
uchar i;
uchar temp_data=ds1302_data;
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); //显示开,关光标,关光标反白允许。
DS1302 12864lcd单片机智能闹钟日期温度程序
/****************************************************************************/ //头文件#include <AT89X52.h>#include <string.h>/*****************************************************************************/ //灯与蜂鸣器定义sbit led_b = P2^7;sbit led_r = P1^4;sbit led_g1 = P1^3;sbit led_g2 = P1^2;sbit led_g3 = P1^0;sbit led_g4 = P1^1;sbit beep = P3^1;/*****************************************************************************/ //温度传感器定义sbit DQ = P3 ^ 0;//ds18B20/*****************************************************************************/ //键盘引脚定义sbit KEY_1 = P2^3; //左上sbit KEY_2 = P2^4; //左下sbit KEY_3 = P2^6; //右上sbit KEY_4 = P2^5; //右下sbit KEY_I = P3^2; //常0/****************************************************************************/ //引脚定义sbit SID = P2^1; //数据sbit SCLK = P2^2; //时钟/*****************************************************************************/ //定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)/*****************************************************************************/ //定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/****************************************************************************/ //定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)bit w = 0; //调时标志位static unsigned char menu = 0;//定义静态小时更新用数据变量static unsigned char keys = 0;//定义静态小时更新用数据变量static unsigned char timecount = 0;//定义静态软件计数器变量/****************************************************************************/ void DelayM(unsigned int a){//延时函数1MS/次unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
LCD12864显示程序(汇编语言)
;实验目的:熟悉12864LCD的使用;12864LCD带中文字库;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“5”,公司传真“6”;硬件设置:;关断所有拨码开关。
#include<p16f877a.inc>;__CONFIG_DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择#DEFINE RW PORTA,4 ;读/写选择#DEFINE E PORTA,3 ;使能信号#DEFINE PSB PORTA,2 ;并口/串口选择(H/L)#DEFINE RST PORTA,0 ;复位信号;-----------------------------------------------LCD_X EQU 30H ;页地址LCD_Y EQU 31H ;Y地址COUNT EQU 32H ;循环计数用COUNT1 EQU 33H ;循环计数用COUNT2 EQU 34H ;循环计数用POINT EQU 35H ;查表偏移地址POINT1 EQU 36H ;查表偏移地址POINT2 EQU 37H ;查表偏移地址TEMP EQU 38H ;临时寄存器TEMP1 EQU 39H ;临时寄存器;-----------------------------------------------ORG 0000H ;复位地址NOP ;ICD需要的空指令GOTO MAIN ;跳转到主程序;**********************主程序************************MAINBANKSEL TRISACLRF TRISA ;A口输出CLRF TRISD ;D口输出BANKSEL ADCON1MOVLW 06HMOVWF ADCON1 ;A口全为数字口CLRF STATUSBCF RST ;复位LCDCALL DELAY ;延时一段时间BSF RST ;清除复位信号NOPBSF PSB ;并口通讯;**************************初始化**********************MOVLW 30H ;基本指令操作CALL SEND_IMOVLW 01H ;清除显示CALL SEND_IMOVLW 06H ;指定在写入或读取时,光标的移动方向 CALL SEND_IMOVLW 0CH ;开显示,关光标,不闪烁CALL SEND_I;***********************显示汉字************************HAN_WR2CALL CLEAR_P ;清屏HAN_WR2A ;“深圳乾龙盛电子”MOVLW LOW(TAB1A)MOVWF POINTMOVLW HIGH(TAB1A)MOVWF POINT1 ;获取表格的首地址MOVLW 0eH ;数数据字节个数(7个汉字共14字节) MOVWF COUNTMOVLW 81H ;页地址CALL SEND_ICALL QUSHUHAN_WR2B ;“。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简介:第一行显示,距离系统爆炸时间第二行显示,还剩第三行显示,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;}}//*********************************************************。