标题:
16x64点阵屏时钟程序
[打印本页]
作者:
腾飞的龙
时间:
2016-6-21 12:14
标题:
16x64点阵屏时钟程序
点阵屏不一样所以驱动也不一样。点阵屏的接口是标准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);
}
}
}
复制代码
作者:
wc86110
时间:
2016-6-21 13:12
LZ,还缺原理图呢,你说的不同没看到哦。
作者:
腾飞的龙
时间:
2016-6-21 13:35
不同的地方就是LED扫描
作者:
slaoliu
时间:
2019-1-30 07:37
有没有 16点阵显示2行数字的,上行显示日期,下行显示时间,全部为数字。?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1