LED流水灯设计-微型计算机及控制技术实训

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

LED流水灯设计-微型计算机及控制技术实训
微型计算机及控制技术
实训
班级:
姓名:
学号:
实验一:LED流水灯设计
一、设计目的
1.通过此次涉及、熟悉并掌握实验系统原理和方法
2.掌握流水灯原理和使用方法
二、设计过程
(1)设计内容
1.了解LED发光二极管的顺序灭
2.了解LED的使用原理和引脚接法
3.掌握实用Keil环境编程
4.掌握下载Keil编译好的称序列AT89C51单片机中
(2)实验步骤
1.掌握AT89C51单片机与外设LED的引脚接法和使用原理
2.使用Keil编译环境,编写LED发光二极管顺序灭的程序
3.在Keil编译好的程序下载到AT89c51单片机中,实现LED发光二极管顺序灭
(3)电路及程序设计
1.电路设计
2.编程如下
org 0
sjmp start
org 30h
start: mov P1,#1 ;P1.0为1,不亮mov P1,#2 ;P1.1为1,不亮
mov P1,#4 ;以下原理同上
mov P1,#8
mov P1,#10h
mov P1,#20h
mov P1,#40h
mov P1,#80h
sjmp start
delay: nop
nop
nop
nop
ret
end
(4)设计结果
如上图:D7亮了。

如上图:D3亮了。

实验二8*8点阵的设计
一、实验目的:
1.了解点阵式LED显示原理。

2.掌握单片机与8×8点阵块之间接口电路设计及编程。

3.掌握8155工作原理及与单片机的接口电路设计。

二、实验要求:
利用8×8点阵显示屏,自己设计并调试电路板,实现在单片机的控制下,点阵显示屏显示数字。

三、实验步骤:
1、实验电路图
2、编码程序:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar i=0,n,k;
uchar code Table[][8]={
{~0x00,~0x00,~0x3C,~0x42,~0x42,~0x3C,~0x0 0,~0x00},
{~0x00,~0x00,~0x00,~0x22,~0x7E,~0x02,~0x00 ,~0x00},
{~0x00,~0x00,~0x22,~0x46,~0x4A,~0x32,~0x0 0,~0x00},
{~0x00,~0x00,~0x22,~0x49,~0x49,~0x36,~0x00 ,~0x00},
{~0x00,~0x00,~0x18,~0x28,~0x7E,~0x08,~0x00 ,~0x00},
{~0x00,~0x00,~0x7A,~0x29,~0x29,~0x2E,~0x0 0,~0x00},
{~0x00,~0x00,~0x3E,~0x49,~0x49,~0x26,~0x00 ,~0x00},
{~0x00,~0x00,~0x40,~0x4F,~0x50,~0x60,~0x00 ,~0x00},
{~0x00,~0x00,~0x36,~0x49,~0x49,~0x36,~0x00 ,~0x00},
{~0x00,~0x00,~0x32,~0x49,~0x49,~0x3E,~0x00 ,~0x00},
{~0x91,~0x52,~0x00,~0xA4,~0xF5,~0xBF,~0xF 4,~0xA4},
{~0x11,~0x13,~0x55,~0x51,~0x55,~0x12,~0x11, ~0x00},
};
uchar code Tab[]={~0xfe,~0xfd,~0xfb,~0xf7,~0xef,~0xdf,~0x bf,~0x7f};
void delay(uint i);
void main()
{
TMOD=0x00;
TH0=(8192-3000)/32;
TL0=(8192-3000)%32;
TR0=1;
EA=1;
ET0=1;
while(1)
{
n=4;
}
}
void T0_ISP(void) interrupt 1 {
TH0=(8192-3000)/32;
TL0=(8192-3000)%32;
P3 =Tab[k++];
if(k==8)k=0;
P0 = Table[n][i];
if(++i == 8) i = 0;
}
void delay(uint i)
{
while(i--);
}
3、实验结果:
实验三:矩阵键盘的设计
一、实验目的:
1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。

2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。

3、复习利用Keil51软件对程序进行编译。

4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。

二、实验要求
通过实训,学生应达到以下几方面的要求:
(1)素质要求
1.以积极认真的态度对待本次实训,遵章守纪、团结协作。

2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。

(2)能力要求
1.模拟电路的理论知识
2.脉冲与数字电路的理念知识
3.通过模拟、数字电路实验有一定的动手能力
4.能熟练的编写8951单片机汇编程序
5.能够熟练的运用仿真软件进行仿真
三、实训基本步骤
1、用Proteus绘制“矩阵键盘扫描”电路原理图。

2、编写程序使数码管显示当前闭合按键的键值。

(代码)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83, 0XC6,0XA1,0X86,0X8E};
uchar code tab[]={
0x77,0xb7,0xd7,0xe7,0x7b,0xbb,0xdb,0xeb,0x7d,0xbd,0xdd,0x ed,0x7e,0xbe,0xde,0xee
};
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++); }
uchar scan()
{
uchar a,b,c,i;
P2=0XF0;
delay(10);
P2=0X0F;
for(i=0;i<16;i++)
if(c==tab[i])
return i;
}
void main()
{
uchar key;
while(1)
{
key=scan();
if(key!=-1)
{
P0=dis[key];
delay(100);
}
}
}
3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状态和按键开关的对应关系。

(实验结束)
如上图:当K7被按下时,数码管上显示出数字7了。

实验四:电子时钟设计
一、设计目的
通过此次设计,熟悉并掌握实验系统的原理和方法。

掌握电子时钟的原理和使用方法。

二、设计要求
1、设计一个电子时钟,并且能够实现分秒实现的和调节。

2、设计出硬件电路、
3、设计出软件编程方法,并写出程序。

4、用汇编语言实现程序设计
5、利用查表,中断等方式实现目的
三、电路程序设计
1、电路设计
2、编码程序
#include <REG51.H>
#include <intrins.h>
//#include "LCD1602.h"
//#include "DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚
sbit DS1302_IO = P1^6; //实时时钟数据线引脚
sbit DS1302_RST = P1^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
char
hide_sec,hide_min,hide_hour,hide_day,hide _week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
sbit Set = P2^0; //模式切换键
sbit Up = P2^1; //加法按钮
sbit Down = P2^2; //减法按钮
sbit out = P2^3; //立刻跳出调整模式
按钮
char
done,count,temp,flag,up_flag,down_flag; uchar TempBuffer[5],week_value[2];
void show_time(); //液晶显示程序
/***********1602液晶显示部分子程序****************/
//Port
Definitions****************************** ****************************
sbit LcdRs = P2^5;
sbit LcdRw = P2^6;
sbit LcdEn = P2^7;
sfr DBPort = 0x80;
//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数***************************************** ********************************* unsigned char LCD_Wait(void)
{LcdRs=0;LcdRw=1; _nop_();LcdEn=1;
_nop_(); LcdEn=0;return DBPort; }
//向LCD写入命令或数据***************************************** *******************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{LcdEn=0;LcdRs=style;LcdRw=0;
_nop_();DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();LCD_Wait();
}
//设置显示模式***************************************** *******************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式***************************************** *******************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00
//default
void LCD_SetInput(unsigned char InputMode) {LCD_Write(LCD_COMMAND, 0x04|InputMode);}
//初始化LCD**************************************
**********************
void LCD_Initial()
{LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);
//8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}
//液晶字符输入的位置
************************
void GotoXY(unsigned char x, unsigned char y)
{if(y==0)LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0
x40));}
//将字符输出到液晶显示
void Print(unsigned char *str)
{while(*str!='\0')
{LCD_Write(LCD_DATA,*str);str++;}}
/***********DS1302时钟部分子程序******************/
typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[11];
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;
#define AM(X) X
#define PM(X) (X+12) // 转
成24小时制
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{ unsigned char i;ACC = d; for(i=8; i>0; i--) {DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }
unsigned char DS1302OutputByte(void) //
实时时钟读取一字节(内部函数)
{ unsigned char i; for(i=8; i>0; i--)
{ ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO; DS1302_CLK =
1;DS1302_CLK = 0; }
return(ACC); }
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{ DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
} unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{ unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);}
void DS1302_GetTime(SYSTEMTIME *Time) //
获取时钟芯片的时钟数据到自定义的结构型数

{unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10
+ (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10
+ (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }
void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
{ Time->DateString[0] = '2';
Time->DateString[1] = '0';
Time->DateString[2] = Time->Year/10 + '0';
Time->DateString[3] = Time->Year%10 + '0';}
else{ Time->DateString[0] = ' '; Time->DateString[1] = ' ';
Time->DateString[2] = ' '; Time->DateString[3] = ' ';}
Time->DateString[4] = '/';
if(hide_month<2)
{Time->DateString[5] = Time->Month/10 + '0';
Time->DateString[6] = Time->Month%10 + '0';}
else{ Time->DateString[5] = ' '; Time->DateString[6] = ' ';}
Time->DateString[7] = '/';
if(hide_day<2)
{Time->DateString[8] = Time->Day/10 + '0';
Time->DateString[9] = Time->Day%10 + '0';}
else{Time->DateString[8] = ' ';Time->DateString[9] = ' '; } if(hide_week<2){
week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显
示}
else { week_value[0] = ' ';}
week_value[1] = '\0';
Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符}
void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组TimeString[];
{ if(hide_hour<2)
{ Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';}
else{ Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}
Time->TimeString[2] = ':';
if(hide_min<2){ Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';}
else {Time->TimeString[3] = ' ';Time->TimeString[4] = ' '; }
Time->TimeString[5] = ':';
if(hide_sec<2)
{Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';}
else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' '; }
Time->DateString[8] = '\0';}
void Initial_DS1302(void) //时钟芯片初始化
{ unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80) //判断时钟芯片是否关闭
{Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x07);Write1302(0x86,0x2 5);
Write1302(0x8a,0x07);Write1302(0x84,0x2 3);Write1302(0x82,0x59);
Write1302(0x80,0x55);Write1302(0x8e,0x8
0); //禁止写入}}
void Delay1ms(unsigned int count)
{unsigned int
i,j;for(i=0;i<count;i++)for(j=0;j<120;j++
);}
/*延时子程序*/
void mdelay(uint delay)
{ uint
i;for(;delay>0;delay--){for(i=0;i<62;i++)
//1ms延时.
{;}}}
void outkey() //跳出调
整模式,返回默认显示
{ uchar Second;if(out==0) { mdelay(8); count=0;
hide_sec=0,hide_min=0,hide_hour=0,hide_
day=0,hide_week=0,hide_month=0,hide_year=
0;
Second=Read1302(DS1302_SECOND);
Write1302(0x8e,0x00); //写入允许
Write1302(0x80,Second&0x7f);
Write1302(0x8E,0x80); //禁止写入
done=0; while(out==0); }}
///////////////////////////////////////// ///////////////////////////////////////// //////////////////////////
void Upkey()//升序按键
{ Up=1;if(Up==0)
{
mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_SECOND); //读取秒数
temp=temp+1; //秒数加1
up_flag=1; //数据调整后更新标志
if((temp&0x7f)>0x59) //超过59秒,清零 temp=0; break;
case 2:
temp=Read1302(DS1302_MINUTE); //读取分数 temp=temp+1; //分数加1
up_flag=1;
if(temp>0x59) //超过59分,清零temp=0;break;
case 3:
temp=Read1302(DS1302_HOUR); //读取小时数
temp=temp+1; //小时数加1
up_flag=1;
if(temp>0x23) //超过23小时,清零
temp=0; break;
case 4:
temp=Read1302(DS1302_WEEK); //读取星期数
temp=temp+1; //星期数加1
up_flag=1;
if(temp>0x7)
temp=1;
break;
case 5:
temp=Read1302(DS1302_DAY); //读取日数
temp=temp+1; //日数加1
up_flag=1;
if(temp>0x31)
temp=1;
break;
case 6:
temp=Read1302(DS1302_MONTH); //读取月数
temp=temp+1; //月数加1
up_flag=1;
if(temp>0x12)
temp=1;
break;
case 7:
temp=Read1302(DS1302_YEAR); //读取年数
temp=temp+1; //年数加1
up_flag=1;
if(temp>0x85)
temp=0;
break;
default:break;}
while(Up==0); }}
///////////////////////////////////////// ///////////////////////////////////////// //////////////////////////
void Downkey()//降序按键
{ Down=1;if(Down==0)
{ mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_SECOND); //读取秒数
temp=temp-1; //秒数减1
down_flag=1; //数据调整后更新标志
if(temp==0x7f) //
小于0秒,返回59秒
temp=0x59;
break;
case 2:
temp=Read1302(DS1302_MINUTE); //读取分数
temp=temp-1; //分数减1
down_flag=1;
if(temp==-1)
temp=0x59; //小于0秒,返回59秒
break;
case 3:
temp=Read1302(DS1302_HOUR); //读取小时数
temp=temp-1; //小时数减1
down_flag=1;
if(temp==-1)
temp=0x23;
break;
case 4:
temp=Read1302(DS1302_WEEK); //读取星期数
temp=temp-1; //星期数减1
down_flag=1;
if(temp==0)
temp=0x7;;
break;
case 5:
temp=Read1302(DS1302_DAY); //读取日数
temp=temp-1; //日数减1
down_flag=1;
if(temp==0)
temp=31;
break;
case 6:
temp=Read1302(DS1302_MONTH); //读取月数
temp=temp-1; //月数减1
down_flag=1;
if(temp==0)
temp=12;
break;
case 7:
temp=Read1302(DS1302_YEAR); //读取年数
temp=temp-1; //年数减1
down_flag=1;
if(temp==-1)
temp=0x85;
break;
default:break;}while(Down==0); }}
void Setkey()//模式选择按键
{Set=1;if(Set==0)
{ mdelay(8); count=count+1;
//Setkey按一次,count就加1
done=1; //进入调整模式
while(Set==0); }}
void keydone()//按键功能执行
{ uchar Second;
if(flag==0) //关闭时钟,停止计时 { Write1302(0x8e,0x00); //写入允许
temp=Read1302(0x80);
Write1302(0x80,temp|0x80);
Write1302(0x8e,0x80); //禁止写入 flag=1; }
Setkey(); //扫描模式切换按键
switch(count)
{case 1:do
//count=1,调整秒
{ outkey(); //扫描跳出按钮
Upkey(); //扫描加按钮
Downkey(); //扫描减按钮
if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据
{
Write1302(0x8e,0x00); //写入允许
Write1302(0x80,temp|0x80); //写入新的秒数
Write1302(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0; }
hide_sec++; //位闪计数
if(hide_sec>3)
hide_sec=0;
show_time(); //液晶显示数据
}while(count==2);break;
case 2:do
//count=2,调整分
{ hide_sec=0;
outkey();
Upkey();
Downkey();
if(temp>0x60)
temp=0;
if(up_flag==1||down_flag==1)
{ Write1302(0x8e,0x00); //写入允许
Write1302(0x82,temp); //写入新的分数
Write1302(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0; }
hide_min++;
if(hide_min>3)
hide_min=0;
show_time();
}while(count==3);break;
case 3:do
//count=3,调整小时
{ hide_min=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{ Write1302(0x8e,0x00); //写入允许
Write1302(0x84,temp); //写入新的小时数
Write1302(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0; }
hide_hour++;
if(hide_hour>3)
hide_hour=0;
show_time();
}while(count==4);break;
case 4:do
//count=4,调整星期
{ hide_hour=0;
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{ Write1302(0x8e,0x00); //写入允许
Write1302(0x8a,temp); //写入新的星期数
Write1302(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0;}
hide_week++;
if(hide_week>3)
hide_week=0;
show_time();
}while(count==5);break;
case 5:do
//count=5,调整日
{hide_week=0;
outkey();
Upkey();
if(up_flag==1||down_flag==1)
{Write1302(0x8e,0x00); //写入允许
Write1302(0x86,temp); //写入新的日数
Write1302(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0; }
hide_day++;
if(hide_day>3)
hide_day=0;
show_time();
}while(count==6);break;
case 6:do
//count=6,调整月
{ hide_day=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
允许
Write1302(0x88,temp); //写入新的月数
Write1302(0x8e,0x80); //禁止写入
up_flag=0;
down_flag=0; }
hide_month++;
if(hide_month>3)
hide_month=0;
show_time();
}while(count==7);break;
case 7:do
//count=7,调整年
{ hide_month=0;
outkey();
Upkey();
Downkey();
if(up_flag==1||down_flag==1)
{ Write1302(0x8e,0x00); //写入允许
的年数
Write1302(0x8e,0x80); //禁止写

up_flag=0;
down_flag=0; }
hide_year++;
if(hide_year>3)
hide_year=0;
show_time();
}while(count==8);break;
case 8: count=0;hide_year=0;
//count8, 跳出调整模式,返回默认显示状态
Second=Read1302(DS1302_SECOND);
Write1302(0x8e,0x00);
//写入允许
Write1302(0x80,Second&0x7f);
Write1302(0x8E,0x80); //禁止写入
done=0;
break; //count=7,开启中断,标志位置0并退出
default:break; }}
void show_time() //液晶显示程序
{ DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据
TimeToStr(&CurrentTime); //时间数据转换液晶字符
DateToStr(&CurrentTime); //日期数据转换液晶字符
GotoXY(0,1);
Print(CurrentTime.TimeString); //显示时间
GotoXY(0,0);
Print(CurrentTime.DateString); //显示日期
GotoXY(15,0);
Print(week_value); //显示星期
GotoXY(11,0);
Print("Week"); //在液晶上显示字母 week Delay1ms(400); //扫描延
时}
main()
{ flag=1; //时钟停止标志LCD_Initial(); //液晶初始化
Initial_DS1302(); //时钟芯片初始化
up_flag=0;
down_flag=0;
done=0; //进入默认液晶显示
while(1)
{ while(done==1) keydone(); //进入调整模式
while(done==0)
{ show_time(); //液晶显示数据
flag=0; Setkey(); //扫描各功能键
}}}
四、设计结果
通过按键还可以对时间调节。

如上图,此时选中了秒位,通过按键K2可以对其进行加,按键K3可以对其减,K4可以立刻跳出模式选择。

相关文档
最新文档