点阵屏不一样所以驱动也不一样。点阵屏的接口是标准8x2接口,用8/1扫描、- #include "STC12C5A60S2.h"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar l_tmpDate[]={0,0,0,1,1,1,13};//秒分时日月周年08-05-15 12:00:00
- uchar l_tmpdisplay[15];
- code uchar Write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位
- code uchar Read_RTC_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
- sbit SCK = P1^3; //DS1302时钟;
- sbit SDA = P1^4; //DS1302数据;
- sbit RST = P1^5;// DS1302复位;
- uchar set=0; //按键选择标志位;
- char key_flag=0;//按键加减标志位;
- uchar menue=0; //菜单选择标志位;
- uchar ok=0; //确认标志位;
- char miao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;*/
- /////////////DS1302写一个字节/////
- void Write_Ds1302_Byte(uchar temp)
- {
- uchar i;
- for (i=0;i<8;i++) //循环8次 写入数据
- {
- SCK=0;
- SDA=temp&0x01; //每次传输低字节
- temp>>=1; //右移一位
- SCK=1;
- }
- }
- /*****************/ /*
- 写入DS1302
- */ /************************/
- void Write_Ds1302(uchar address,uchar dat )
- {
- RST=0; _nop_();
- SCK=0; _nop_();
- RST=1; _nop_(); //启动
- Write_Ds1302_Byte(address); //发送地址
- Write_Ds1302_Byte(dat); //发送数据
- RST=0; //恢复
- }
- /***************/ /*
- 读出DS1302数据
- */ /*********************/
- uchar Read_Ds1302 ( uchar address )
- {
- uchar i,temp=0x00;
- RST=0; _nop_(); _nop_();
- SCK=0; _nop_(); _nop_();
- RST=1; _nop_();
- _nop_();
- Write_Ds1302_Byte(address);
- for (i=0;i<8;i++) //循环8次 读取数据
- {
- if(SDA)
- {
- temp|=0x80;
- } //每次传输低字节
- temp>>=1; //右移一位
- SCK=1; _nop_(); _nop_();
- SCK=0;
- }
- RST=0; _nop_();
- //以下为DS1302复位的稳定时间
- _nop_();
- RST=0;
- SCK=0; _nop_(); _nop_(); _nop_(); _nop_();
- SCK=1; _nop_(); _nop_();
- SDA=0; _nop_(); _nop_();
- SDA=1; _nop_(); _nop_();
- return (temp); //返回
- }
- /**************************/ /*
- 读时钟数据
- */ /***********************/
- void Read_RTC(void) //读取 日历
- {
- uchar i,*p;
- p=Read_RTC_address; //地址传递
- for(i=0;i<7;i++) //分7次读取 秒分时日月周年
- {
- l_tmpDate[i]=Read_Ds1302(*p);
- p++;
- }
- }
- /***************************/ /*
- 设定时钟数据
- */ /************************/
- void Set_RTC(void) //设定 日历
- {
- uchar i,*p,tmp;
- for(i=0;i<7;i++)
- { //BCD处理
- 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(0x8E,0x80); //打开写保护;
- }
- /*********8x16字模 ****************************/
- //取模方式:逐行式 逆向 阴码 宽x高=8x16
- uchar code table[]={
- /*-- 文字: 0 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
- 0x24,0x18,0x00,0x00,
- /*-- 文字: 1 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
- 0x08,0x3E,0x00,0x00,
- /*-- 文字: 2 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,
- 0x42,0x7E,0x00,0x00,
- /*-- 文字: 3 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,
- 0x22,0x1C,0x00,0x00,
- /*-- 文字: 4 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,
- 0x20,0x78,0x00,0x00,
- /*-- 文字: 5 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,
- 0x22,0x1C,0x00,0x00,
- /*-- 文字: 6 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,
- 0x24,0x18,0x00,0x00,
- /*-- 文字: 7 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x00,0x00,
- /*-- 文字: 8 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,
- 0x42,0x3C,0x00,0x00,
- /*-- 文字: 9 --*/ /*-- 宋体12;
- 此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,
- 0x24,0x1C,0x00,0x00,
- /*-- 文字: - --*///10; /*-- 宋体12;
- //此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,
- /*-- 文字: : --*///11; /*-- 宋体12;
- //此字体下对应的点阵为:宽x高=8x16 --*/
- ////0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- //0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x18,0x18,0x00,0x00,
- /*-- 文字: _ --*///12 /*-- 宋体12;
- //此字体下对应的点阵为:宽x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFF,
- /****************空格****13*****************/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,/*" ",0*/
- //////////////C//14//////////////
- //取模方式:逐行式 逆向 阴码 宽x高=8x16
- 0x00,0x00,0x3C,0x3E,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
- 0x02,0x3E,0x3C,0x00,
- //14 'a'-83;
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C, 0x42,0x78,0x44,
- 0x42,0x42,0xFC,0x00,0x00,/*"a",0*/
- 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,
- 0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00,/*"b",1*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,
- 0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00,/*"c",2*/
- 0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,
- 0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00,/*"d",3*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,
- 0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00,/*"e",4*/
- 0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,
- 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"f",5*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
- 0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C,/*"g",6*/
- 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,
- 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"h",7*/
- 0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,
- 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"i",8*/
- 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,
- 0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E,/*"j",9*/
- 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,
- 0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00,/*"k",10*/
- 0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"l",11*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
- 0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00,/*"m",12*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,
- 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"n",13*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,
- 0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"o",14*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,
- 0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07,/*"p",15*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
- 0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0,/*"q",16*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,
- 0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00,/*"r",17*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
- 0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00,/*"s",18*/
- 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,
- 0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00,/*"t",19*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,
- 0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00,/*"u",20*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,
- 0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00,/*"v",21*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,
- 0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00,/*"w",22*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,
- 0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00,/*"x",23*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,
- 0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07,/*"y",24*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,
- 0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00,/*"z",25*/
- };
- /************16x16 字模 ***************/
- //取模方式:逐行式 逆向 阴码 宽x高=16x16
- uchar code table1[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",0*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"二",1*/
-
- 0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"三",2*/
-
- 0x00,0x00,0x00,0x00,0xFE,0x3F,0x22,0x22,
- 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
- 0x12,0x22,0x12,0x3C,0x0A,0x20,0x06,0x20,
- 0x02,0x20,0xFE,0x3F,0x02,0x20,0x00,0x00,/*"四",3*/
- 0x00,0x00,0xFE,0x3F,0x40,0x00,0x40,0x00,
- 0x40,0x00,0x40,0x00,0xFC,0x0F,0x20,0x08,
- 0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x08,
- 0x10,0x08,0x10,0x08,0xFF,0x7F,0x00,0x00,/*"五",4*/
- 0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x01,
- 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,
- 0x20,0x02,0x20,0x04,0x10,0x08,0x10,0x10,
- 0x08,0x10,0x04,0x20,0x02,0x20,0x00,0x00,/*"六",5*/
- 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,
- 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,/*"日",6*/
- 0x00,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F,
- 0x08,0x08,0xF8,0x0F,0x80,0x00,0x88,0x00,
- 0xF8,0x1F,0x84,0x00,0x82,0x00,0xF8,0x0F,
- 0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00,/*"星",7*/
- 0x44,0x00,0x44,0x3E,0xFE,0x22,0x44,0x22,
- 0x44,0x22,0x7C,0x3E,0x44,0x22,0x44,0x22,
- 0x7C,0x22,0x44,0x3E,0x44,0x22,0xFF,0x22,
- 0x20,0x21,0x44,0x21,0x82,0x28,0x41,0x10,/*"期",8*/
-
- 0x00,0x00,0xE0,0x0F,0x62,0x0C,0xE6,0x0F,0x6C,0x0C,
- 0xEA,0x0F,0x06,0x00,0xF4,0x1F,0x3C,0x18,0xB0,0x1A,
- 0xBC,0x1A,0xB4,0x1A,0xB2,0x1A,0xFB,0x3F,0xF9,0x3F,
- 0x00,0x00, /////////////////////温////9//
- 0x00,0x00,0xC0,0x00,0x80,0x00,0xFC,0x0F,0x0C,0x00,
- 0x6C,0x03,0xFC,0x0F,0x6C,0x03,0xEC,0x03,0x0C,0x00,
- 0xEC,0x07,0x6C,0x06,0xCC,0x03,0x66,0x06,0x33,0x0C,
- 0x00,0x00,/////////////////度、、、、、、10//
- 0x00,0x00,0x0C,0x00,0xFC,0x1F,0x0C,0x00,0xF6,0x07,
- 0xB0,0x01,0xB0,0x01,0xB0,0x01,0xFC,0x0F,0x80,0x01,
- 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,
- 0x00,0x00,///////////年、、、、、、、、、11//
- 0x00,0x00,0xF8,0x0F,0x18,0x0C,0x18,0x0C,0x18,0x0C,
- 0xF8,0x0D,0x18,0x0C,0x18,0x0C,0xF8,0x0D,0x18,0x0C,
- 0x18,0x0C,0x1C,0x0C,0x1C,0x0C,0x0E,0x0F,0x06,0x06,
- 0x00,0x00,///////////月////////////12///
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- //9; //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
复制代码- /***********************************************************
- 功 能:16x64点阵屏加DS1302显示时间
- 单片机:STC12C5A60S2
- 晶 振:22.1184M
- 作 者:苏义江改编自网络
- 时 间:2016-6-18日
- ***********************************************************/
- #include <STC12C5A60S2.h>
- #include "macroandconst.h"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit R =P2^6; //上半屏数据
- sbit R1=P2^7; //下半屏数据
- sbit CLK=P2^4; //74HC595的移位时钟 SHCP
- sbit STB=P2^3; //输出锁存 STCP 595锁存信号
- //行扫描
- sbit A1 =P2^0;
- sbit B1 =P2^1;
- sbit C1 =P2^2;
- sbit OE =P2^5; //74HC138的使能
- sbit fmq =P1^7;//蜂鸣器
- //按键
- sbit keymenue =P0^2; //功能
- sbit keyup =P0^3; //加
- sbit keydown =P0^4; //减
- sbit keyswitch=P0^5; //调整移位
- sbit keyok =P0^6; //确认
- sbit DQ =P1^6; //DS18B20的数据输入/输出脚DQ,根据情况设定
- //sbit wei =P2^7;//数码管位选573使能
- //sbit duan=P2^6;//数码管段选573使能
- uchar code smg[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
- 0x82,0xF8,0x80,0x90,0xBF}; //显示段码
- extern uchar code table[];
- extern uchar code table1[];
- extern uchar set; //按键选择标志位;
- extern char key_flag;//按键加减标志位;
- extern uchar menue; //菜单选择标志位;
- extern uchar ok; //确认标志位;
- uint sdata;//测量到的温度的整数部分
- uchar xiaoshu1;//小数第一位
- uchar xiaoshu2;//小数第二位
- uchar xiaoshu;//两位小数
- bit fg=1; //温度正负标志
-
- uint temp; //温度值
- extern char miao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;*/
- extern uchar l_tmpDate[];//秒分时日月周年08-05-15 12:00:00
- extern uchar l_tmpdisplay[];
- extern void Write_Ds1302(uchar address,uchar dat );
- extern void Read_RTC(void);
- void data_change();
- uint num;
- void Delay10ms() //@11.0592MHz
- {
- uchar i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- }
- while (--i);
- }
- //STC12C5A单片机定时1us DS18B20延时
- void delay_b20(uchar n)
- {
- while(n--)
- {
- _nop_();
- }
- }
-
- bit Init_DS18B20(void) //发送复位
- {
- bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
- DQ = 1; //先将数据线拉高
- delay_b20(1); //略微延时约6微秒 ;
- DQ = 0; //再将数据线从高拉低,要求保持480~960us
- delay_b20(500); //略微延时约600微秒 ;
- //以向DS18B20发出一持续480~960us的低电平复位脉冲
- DQ = 1; //释放数据线(将数据线拉高)
- delay_b20(60); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
- flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)
- delay_b20(500); //延时足够长时间,等待存在脉冲输出完毕 ;
- return flag; //返回检测成功标志
- }
- uchar ReadOneChar(void)
- {
- uchar i=0;
- uchar dat; //储存读出的一个字节数据
- for (i=0;i<8;i++)
- {
- DQ =1; // 先将数据线拉高
- delay_b20(1); //等待一个机器周期
- DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
- delay_b20(1); //等待一个机器周期
- DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
- delay_b20(1); ; //延时约6us,使主机在15us内采样
- dat>>=1;
- if(DQ==1)
- dat|=0x80; //如果读到的数据是1,则将1存入dat
- else
- dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i]
- delay_b20(60); ; //延时3us,两个读时序之间必须有大于1us的恢复期
- }
- return(dat); //返回读出的十六进制数据
- }
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=0; i<8; i++)
- {
- DQ =1; // 先将数据线拉高
- delay_b20(1); //等待一个机器周期
- DQ=0; //将数据线从高拉低时即启动写时序
- DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
- //并将其送到数据线上等待DS18B20采样
- delay_b20(60); ;
- //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
- DQ=1; //释放数据线
- delay_b20(60);
- dat>>=1; //将dat中的各二进制位数据右移1位
- }
- delay_b20(1);
- }
- void ReadyReadTemp(void)
- {
- Init_DS18B20(); //将DS18B20初始化
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- delay_b20(200); //转换一次需要延时一段时间
- Init_DS18B20(); //将DS18B20初始化
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
- }
- uchar doe[4];
- uint wendu_duzhuanhuan()
- {
- uint a,b,t;
- Init_DS18B20(); //将DS18B20初始化
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- delay_b20(200); //转换一次需要延时一段时间
- Init_DS18B20(); //将DS18B20初始化
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器,前两个?
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- t=t*0.6250+0.5;
- return t;
- }
- void wenduzhuan()
- {
- uint tp;
- tp=wendu_duzhuanhuan();
- doe[0]=tp/1000;
- doe[1]=tp%1000/100;
- doe[2]=tp%100/10;
- doe[3]=tp%10;
- }
- void key()
- {
- /*判断选择按键是否按下;如果按下了当松开的时候让背光打开;set++;*/
- if(keyswitch==0)
- {
- Delay10ms();
- if(keyswitch==0)
- {
- Delay10ms();
- while(keyswitch==0);
- set++; //功能变量
- if(set>9)
- {set=0;menue=0;}
- }
- }
- /*up和down按键的检测;加减标志位*/
- if(keyup==0)
- {
- Delay10ms();
- if(keyup==0)
- {
- Delay10ms();
- while(keyup==0);
- key_flag++; //加减标志位
- }
- }
- if(keydown==0)
- {
- Delay10ms();
- if(keydown==0)
- {
- Delay10ms();
- while(keydown==0);
- key_flag--; //加减标志位
- }
- }
- if(keymenue==0)
- {
- Delay10ms();
- if(keymenue==0) //菜单选择标志位;
- {
- Delay10ms();
- while(keymenue==0);
- menue++; //菜单变量
- if(menue>4)menue=0;
- }
- }
- if(keyok==0)
- {
- Delay10ms();
- if(keyok==0) //确认标志位;
- {
- Delay10ms();
- while(keyok==0);
- ok++;
- if(ok>1)
- {
- ok=0;
- menue=0;
- set=0;
- }
- }
- }
- }
- //行扫描
- void hangsao(uchar num)
- {
- switch(num)
- {
- case 0:C1=0;B1=0;A1=0;break;
- case 1:C1=0;B1=0;A1=1;break;
- case 2:C1=0;B1=1;A1=0;break;
- case 3:C1=0;B1=1;A1=1;break;
- case 4:C1=1;B1=0;A1=0;break;
- case 5:C1=1;B1=0;A1=1;break;
- case 6:C1=1;B1=1;A1=0;break;
- case 7:C1=1;B1=1;A1=1;break;
- default:break;
- }
- }
- /*****595写数据部分****************/
- void WriteByte(uchar DataR1,uchar DataR2)
- {
- uchar i;
- for(i = 0; i < 8; i++)//循环8次,把编码传给锁存器
- {
- R=DataR1& 0x01; //上屏数据 先送低位
- R1=DataR2 & 0x01;//下屏数据 先送低位
- CLK = 0;
- _nop_();
- CLK = 1;
- DataR1>>= 1;
- DataR2>>= 1;
- }
- }
- /*void WriteByte(uchar dat)
- {
- uchar i;
- for (i=0;i<8;i++) //循环8次,把编码传给锁存器
- {
- dat=dat>>1; //右移一位,取出该字节的最低位
- R=CY; //将该字节的最低位传给R
- CLK=0; //上升沿将数据移入595
- CLK=1;
- }
- }
- */
- void writebyteshuzi(uchar n)//显示数字函数
- {
- WriteByte(~table[num+n*16],~table[num+n*16+8]);
- }
- void writebytehanzi(uchar n) //显示汉字函数
- {
- WriteByte(~table1[2*num+n*32+0],~table1[2*num+n*32+16]);
- WriteByte(~table1[2*num+n*32+1],~table1[2*num+n*32+16+1]);
- }
- /******调时部分*************************/
- void set_date_time()
- {
- if(set==2)
- {
- menue=0; //秒调整
- miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];
- miao=miao+key_flag;
- if((key_flag<0)&(miao==0))miao=59;
- if(miao>59)miao=0;
- miao=miao%10+(miao/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x80,miao);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==3)
- {
- menue=0; //分调整
- fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];
- fen=fen+key_flag;
- if(fen>59)
- { fen=0; }
- if((key_flag<0)&&(fen<0))
- { fen=59; }
- fen=fen%10+(fen/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x82,fen);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==4)
- {
- menue=0; //时调整
- shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];
- shi=shi+key_flag;
- if(shi>23)shi=0;
- if((key_flag<0)&&(shi<0))shi=23;
- shi=shi%10+(shi/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x84,shi);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==5)
- {
- menue=1; //日调整
- ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];
- ri=ri+key_flag;
- if(ri>31)ri=1;
- if((key_flag<0)&&(ri<1))ri=31;
- ri=ri%10+(ri/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x86,ri);
- Write_Ds1302(0x8E,0x80);
- zhou=l_tmpdisplay[12]; //周调整
- zhou=zhou+key_flag;
- if(zhou>7)zhou=1;
- if((key_flag<0)&&(zhou<1))zhou=7;
- zhou=zhou%10+(zhou/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x8A,zhou);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==6)
- {
- menue=1; //月调整
- yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];
- yue=yue+key_flag;
- if(yue>12)yue=1;
- if((key_flag<0)&&(yue<1))yue=12;
- yue=yue%10+(yue/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x88,yue);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==7)
- {
- menue=1; //年调整
- nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;;
- if(nian>79)nian=0;
- if((key_flag<0)&&(nian<0))nian=79;
- nian=nian%10+(nian/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x8C,nian);
- Write_Ds1302(0x8E,0x80);
-
- }
-
- if(set==8)
- {
- menue=2; //周调整
- zhou=l_tmpdisplay[12];
- zhou=zhou+key_flag;
- if(zhou>7)zhou=1;
- if((key_flag<0)&&(zhou<1))zhou=7;
- zhou=zhou%10+(zhou/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x8A,zhou);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==9)
- {
- menue=3; //温度调整
-
- sdata=l_tmpdisplay[13]/10;
- sdata=l_tmpdisplay[14]%10;
- sdata=sdata+key_flag;
- sdata=sdata%10+(sdata/10)*16;
- }
- key_flag=0;
- }
- /******日期、时间、星期数据的转化****************/
- void data_change()
- {
- l_tmpdisplay[0]=l_tmpDate[6]/16;
- l_tmpdisplay[1]=l_tmpDate[6]%16;//年;
- l_tmpdisplay[2]=l_tmpDate[4]/16;
- l_tmpdisplay[3]=l_tmpDate[4]%16;//月;
- l_tmpdisplay[4]=l_tmpDate[3]/16;
- l_tmpdisplay[5]=l_tmpDate[3]%16;//日;
- l_tmpdisplay[6]=l_tmpDate[2]/16;
- l_tmpdisplay[7]=l_tmpDate[2]%16;//小时;
- l_tmpdisplay[8]=l_tmpDate[1]/16;
- l_tmpdisplay[9]=l_tmpDate[1]%16;//分钟;
- l_tmpdisplay[10]=l_tmpDate[0]/16;
- l_tmpdisplay[11]=l_tmpDate[0]%16;//秒钟;
- l_tmpdisplay[12]=l_tmpDate[5]%16;//显示当前星期;
-
- l_tmpdisplay[13]=doe[1]/16;//温度十位;
- l_tmpdisplay[14]=doe[2]%16;//温度个位;
- }
- /*******星期显示处理*******************/
- void week()
- {
- if(l_tmpdisplay[12]==1)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(0);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==2)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(1);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==3)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(2);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==4)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(3);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==5)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(4);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==6)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(5);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==7)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(6);
- writebyteshuzi(13);
- }
- }
- void shijian()
- {
- writebyteshuzi(l_tmpdisplay[6]); //时;
- writebyteshuzi(l_tmpdisplay[7]);
- writebyteshuzi(11); //显示分号
- writebyteshuzi(l_tmpdisplay[8]);
- writebyteshuzi(l_tmpdisplay[9]); //分;
- writebyteshuzi(11); //显示分号
- writebyteshuzi(l_tmpdisplay[10]);
- writebyteshuzi(l_tmpdisplay[11]);//秒;
- }
- void riqi()
- {
- writebyteshuzi(l_tmpdisplay[0]);
- writebyteshuzi(l_tmpdisplay[1]); //年;
- writebyteshuzi(10); //显示横杠
-
- writebyteshuzi(l_tmpdisplay[2]);
- writebyteshuzi(l_tmpdisplay[3]); //月;
- writebyteshuzi(10);//显示横杠
- writebyteshuzi(l_tmpdisplay[4]);
- writebyteshuzi(l_tmpdisplay[5]); //日;
- }
- void wendu()
- {
- writebyteshuzi(13);
- writebytehanzi(9);
- writebytehanzi(10);
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[13]); //温度
- writebyteshuzi(l_tmpdisplay[14]);
- }
- void main()
- {
- // Set_RTC();//对时(有备用电源对时一次就行)
- ReadyReadTemp();//温度转换
- wenduzhuan();
- menue=0;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x90,0x80);
- Write_Ds1302(0x8E,0x80);
- while(1)
- {
- ReadyReadTemp();//温度转换
- wenduzhuan();
- key();
- // for(num=0;num<16;num++)
- for(num=0;num<8;num++)
- {
-
- Read_RTC();//读取时钟
- data_change();//时钟数据处理
- set_date_time(); /////调时部分
-
-
- if(menue==0)
- {
- if(set==2)//调整标志位;
- {
- writebyteshuzi(l_tmpdisplay[6]); //时;
- writebyteshuzi(l_tmpdisplay[7]);
- writebyteshuzi(11); //数字数组的第11位置,是":"
- writebyteshuzi(l_tmpdisplay[8]);
- writebyteshuzi(l_tmpdisplay[9]); //分;
- writebyteshuzi(11);
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16+8]));
- }
- else
- if(set==3)
- {
- // writebyteshuzi(l_tmpdisplay[6]); //时;
- // writebyteshuzi(l_tmpdisplay[7]);
- // writebyteshuzi(11);
- // WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16+8]));
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[10]);
- writebyteshuzi(l_tmpdisplay[11]);//秒;
- }
- /* else
- if(set==4)
- {
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16+8]));
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[8]);
- writebyteshuzi(l_tmpdisplay[9]);//分;
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[10]);
- writebyteshuzi(l_tmpdisplay[11]);//秒;
- } */
- else shijian();
- }
- else
- if(menue==1)
- {
- if(set==5) //日期调整标志位;
- {
- writebyteshuzi(l_tmpdisplay[0]); //年;
- writebyteshuzi(l_tmpdisplay[1]);
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[2]);
- writebyteshuzi(l_tmpdisplay[3]); //月;
- writebyteshuzi(10);
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16+8])); //日;
- }
- else
- if(set==6)
- {
- // writebyteshuzi(l_tmpdisplay[0]); //年;
- // writebyteshuzi(l_tmpdisplay[1]);
- // writebyteshuzi(10);
- // WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16+8]));//月;
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[4]);
- writebyteshuzi(l_tmpdisplay[5]);//日;
- }
- /* else
- if(set==7)
- {
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16+8]));//年;
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[2]);
- writebyteshuzi(l_tmpdisplay[3]);//月;
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[4]);
- writebyteshuzi(l_tmpdisplay[5]);//日;
- } */
- else riqi();
- }
- else
- if(menue==2)
- {
- week();
- }
- else
- if(menue==3)
- {
- writebyteshuzi(13);
- writebytehanzi(9);//温;
- writebytehanzi(10);//度?
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[13]);
- writebyteshuzi(l_tmpdisplay[14]);
-
- }
-
-
- else menue=0;
- if ((set<2)&&(menue==0))
- {
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>11)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<14))riqi();
- else
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>26)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<29))week();
- else
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>41)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<44))riqi();
- else
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>55)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<59))wendu();
- else shijian();
- }
-
- // P0=num;
- OE=0;
- STB=0; //输出锁存
- _nop_();
- STB=1;
- OE=1;
- hangsao(num);
- }
- }
- }
复制代码
|