急求msp430用C语言写的简单数字钟(数码管c语言显示,只需时,分,秒)

用AT89C51/AT89S52单片机制作的简易数字钟
用AT89C51/AT89S52单片机制作的简易数字钟
发布: | 作者:-- | 来源: -- | 查看:1292次 | 用户关注:
本文介绍的单片机控制数字钟硬件结构简单,所需元器件少,价格低廉,制作容易,适合初学者习作。单片机选用带flashROM的51系列,具体型号AT89C51或AT89S52等。PO口、Pl口、P2口、P3口各接一共阳数码管,直接驱动。PO和P1所接的数码管分别显示分、十分。P2口所接的数码管显示小时,为了和分钟数字区别开,该数码管的小数点常亮。P3口的P3.O和P3,1分别接第四个数码管的b、c段显示
  本文介绍的单片机控制数字钟硬件结构简单,所需元器件少,价格低廉,制作容易,适合初学者习作。单片机选用带flashROM的51系列,具体型号AT89C51或AT89S52等。PO口、Pl口、P2口、P3口各接一共阳数码管,直接驱动。PO和P1所接的数码管分别显示分、十分。P2口所接的数码管显示小时,为了和分钟数字区别开,该数码管的小数点常亮。P3口的P3.O和P3,1分别接第四个数码管的b、c段显示1,即十小时。如果不到十小时,则不显示。
  小时为12进制,分为60进制。时钟为12MHz。两按钮分别校时和校分。复位按钮清零。总体框图如上图。
  一、硬件电路(参见原理图下图)    1、电源:51系列单片机需要5V直流稳压电源。将220V交流电降压,变压器选择5W,次级电压为10V。桥式整流,二极管选择1N4002。选三端稳压器0UF25V电容在输入和输出滤波。在5V输出端再加一个0.01uF瓷片电容进行高频滤波。
  2、复位电路:复位电路采用上电复位和按钮复位。由一个10UF的电容和一个按钮以及51kQ、2.2kQ电阻各一个构成。
  3、外部晶振电路:外部晶振电路由2个30pF的电容和一个12MHz的晶体振荡器构成。
  4、校时和校分电路:由P3.3外接一个按钮开关到地作为校时键。由P3.2外接一按钮到地作为校分键。
  5、显示电路:因为P口的灌电流在15mA左右,可直接驱动数码管。由PO口和P1口各外接一个共阳极数码管,直接驱动,PO所接数码管显示分,P1所接数码管显示十分,小数点不点亮。P2口外接一个数码管显示小时,但小数点要点亮,用以分隔时分。P3口的P3.1和P3.0分别外接到一数码管的b段和c段,显示十小时,如果不到十小时,该两段灭。小时的显示为12进制。
  二、软件系统    软件系统分四个部分:主程序部分,计时显示中断子程序部分,校时中断子程序部分,校分中断子程序部分,分别介绍如下:
  1、主程序部分    主程序流程如右图.主要有设置堆栈,清R2(为50ms计数器)、R3(分计数器)、R4(十分计数器)、R5(小时计数器)、R6(十小时计数器);设置定时器,设置中断等,汇编语言源程序如下:
  三、电路安装和调试    电路安装参考图(万能板焊接面)如下图。为了安装方便,其中各数码管管脚和单片机P口各驱动电阻端直接用细软导线相连,下图中未画出。只要安装无误,硬件方面不需调试。如时间误差过大(每天误差大于10秒),在软件方面,可修改计时显示中断子程序中装入TLO中的初值BOH,加大或减小即可。
  四、元器件明细表
本页面信息由华强电子网用户提供,如果涉嫌侵权,请与我们客服联系,我们核实后将及时处理。
电路图分类
&&& 目前,处理器性能的主要衡量指标是时钟基于msp430温度数码管显示_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于msp430温度数码管显示
上传于||文档简介
&&基​于​m​s​p3温​度​数​码​管​显​示
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
你可能喜欢msp430单片机C语言的数字钟(只需要显示小时和分,秒)。各位大侠快快的啊。谢谢啦。。_百度知道
msp430单片机C语言的数字钟(只需要显示小时和分,秒)。各位大侠快快的啊。谢谢啦。。
提问者采纳
W_Data(0x8e;*****测试连续读写RAM*****/
Get_DS1302(rdata);
/关闭电平转换
disptemp[2]=0x3a:
秒:无********************************************&#47,1;写入地址
Write1Byte(wdata);*****测试连续读写时间寄存器*****/
DS_SCL0;void Set_DS1302(uchar *ptr) {
uchar i.h&禁止写入} /
DS_RST1;msp430x14x:无返回值
.7 #define DS_SCL
&#47:addr--寄存器地址返回值
disptemp[1] = shuzi[rdata[2]&0x0f];关闭电平转换
disptemp[2]=0x3a;*****测试连续读写时间寄存器*****&#47: Get_DS1302* 说明;/P2OUT = 0XFF。*********************************************************&#47,请设置好
正确的当前时间然后将这端程序屏蔽掉;}&#47:无********************************************/
uchar addr = 0x81:ptr--指向存放时间数据地址的指针返回值
:读出数据的格式;
DS_SCL0; 0
WDTCTL = WDTPW + WDTHOLD;*****测试更改和读出时间*****//*******************************************函数名称;
P4DIR = 0XFF;#include &
DS_RST0;*下面六行程序关闭所有的IO口*/
BurstWrite1302(bwdata);/
Reset_DS1302();允许写入
BurstWrite1302(bwdata):从DS1302中读出时间数据在1602液晶模块上显示---------------------------------------------------------拨码开关设置:delay功
能:对DS1302写入1个字节的数据参
/4];&#47,14;#include &= 1,日;
delay(10);
DS_SDA_IN;
_NOP():无说明*下面六行程序关闭所有的IO口*/void main(void){
&#47,0x00),而不会发生每次都重新改写
DS1302内部时间的问题;
W_Data(0x8e:以burst方式从DS1302的RAM中读出批量数据参
Write1Byte(0xfe);*******************************************函数名称;#include &
_NOP();P5OUT = 0XFF;P4OUT = 0XFF;初始化液晶
LcdReset(),这样才能保证每次上电时CPU都从DS1302中读出正确
的当前时间送到液晶中去显示;void main(void){
disptemp[4] = shuzi[rdata[1]&0x0f]:ptr--指向存放数据地址的指针返回值
,disptemp),设置断点观察数据:向某个寄存器写入一个字节数据参
数;#include &*******************************************函数名称;
DS_SCL0:用户在利用27~43行的程序完成测试以后;4],观察rdata是否与wdata一致
BurstReadRAM(rrdata).h&quot:wdata--写入的数据返回值
W_Data(0x8e;i++)
disptemp[3] = shuzi[(rdata[1]&0xf0)&
/cry1602:以burst方式向DS1302的RAM中写入批量数据参
DS_SCL1,重新make以后写入
CPU中; i &
Write1Byte(addr):RAM多字节写命令
for (i = 31,0;/&#47,0;&}/void BurstRead1302(uchar *ptr){
delay(10); 0; i--)
if(wdata&0x01)
DS_SCL1; i &i--)
&#47:&4];;/**************宏定义***************/*****测试更改和读出时间*****/*******************************************函数名称;
uchar addr = 0x80;msp430x14x;*************************************************
注释;//在此处设置断点:无********************************************/ i--)
*ptr++ = Read1Byte();#include &lt,8;
BurstReadRAM(rrdata);SCLK=0
DS_RST0;/&#47,而不会发生每次都重新改写
DS1302内部时间的问题;
DS_SDA_OUT/ i--)
/关闭看门狗
P6DIR |= BIT2; i &&#47,其余拨至OFF测试说明;#include &ds1302;
Write1Byte(addr);
P5DIR = 0XFF;
//在此处设置断点,0x80);
&#47:用户可以更改&
P1DIR = 0XFF;
for(i = 0;
return(rdata);
&#47,分;ds1302;
delay(10);
DispNchar(1;/void W_Data(P3OUT = 0XFF:时间数据的存放格式是:读出的数据说
DS_RST0,但是请注意数据格式:无说明
Write1Byte(0xbe);0;&
P4DIR = 0XFF;写入地址
rdata = Read1Byte();*******************************************函数名称;&#47:用户可以更改&
DS_RST0;SDA对应的IO设置为输出状态
DS_RST1,月;在此处设置断点; i&}&#47.h&
disptemp[6] = shuzi[(rdata[0]&0xf0)&i &lt:ptr--指向数据存放地址的指针返回值
/DS_SDA = P2,年。*********************************************************/
P5DIR = 0XFF;********************************************************程序功能;*******************************************函数名称,14.h&&#47.6 #define DS_RST_IN P2DIR &= ~DS_RST#define DS_RST_OUT P2DIR |= DS_RST#define DS_RST0 P2OUT &= ~DS_RST#define DS_RST1 P2OUT |= DS_RST#define DS_SCL_IN P2DIR &= ~DS_SCL#define DS_SCL_OUT P2DIR |= DS_SCL#define DS_SCL0 P2OUT &= ~DS_SCL#define DS_SCL1 P2OUT |= DS_SCL#define DS_SDA_IN P2DIR &= ~DS_SDA#define DS_SDA_OUT P2DIR |= DS_SDA#define DS_SDA0 P2OUT &= ~DS_SDA#define DS_SDA1 P2OUT |= DS_SDA#define DS_SDA_BIT P2IN & DS_SDA/DS_RST = P2:BurstRead1302功
能,重新make以后写入
Set_DS1302(wdata);
if(DS_SDA_BIT)
rdata |= 0x80:从DS1302中读出时间数据在1602液晶模块上显示---------------------------------------------------------拨码开关设置:用户在利用27~43行的程序完成测试以后;typedef#include &quot:将LCD位拨至ON; &quot。当前时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B* 返回值;/ds1302;在此处设置断点:Read1Byte功
能,请设置好
正确的当前时间然后将这端程序屏蔽掉;&
Set_DS1302(wdata).c&/
P2DIR = 0XFF;
&#47:读出的数据********************************************/void Write1Byte(uchar wdata) {
uchar i:共写入31个字节的数据********************************************/RST对应的IO设置为输出状态
DS_SCL_OUT; 0;P6OUT |= BIT2;
_NOP(),观察brdata是否与bwdata一致
Get_DS1302(rdata);禁止}&#47.h&
&#47:无返回值
:RAM的多字节读命令
for (i = 31;
W_Data(0x8e.c&RAM共有31个字节
Write1Byte(*ptr++);
uchar disptemp[8]; i &void Get_DS1302(uchar *ptr) {
uchar i:以burst方式向DS1302写入批量时间数据参
数;*******************************************函数名称;/读出数据
disptemp[7] = shuzi[rdata[0]&0x0f];&
BurstRead1302(brdata)。
*************************************************/
DispNchar(1;
Write1Byte(0xbf);
BurstRead1302(brdata);void delay(uint time){
uint i,tishi).5 #define DS_SDA
DS_SDA0;/ 0;
P2DIR = 0XFF:延时一段时间参
P3DIR = 0XFF:以burst方式从DS1302读出批量时间数据参
DS_RST0:ptr--指向时间数据存放地址的指针返回值
,观察rrdata是否与rwdata一致
uchar disptemp[8];*****测试连续读写RAM*****/
DS_RST0:写入数据的格式;
_NOP();REST=1;i &#include &quot,0x80);REST=1:Get_DS1302功
*************************************************/
_NOP();void BurstReadRAM(uchar *ptr){4],分;******************************************************************** ** 名称: R_Data(uchar addr) * 输入:BurstWriteRAM功
/P6OUT = 0XFF:Write1Byte功
P1DIR = 0XFF;
DispNchar(4,bwdata,disptemp); &quot: * 功能,时;
for(i = 8;/
disptemp[6] = shuzi[(rdata[0]&0xf0)&*******************************************函数名称:时钟多字节读命令
for (i = 8:时间数据的存放格式是;
DS_RST1;/&#47:
秒 分 时 日 月 星期 年
【共7个字节】********************************************&#47。
根据程序中提示:从某个寄存器读出一个字节数据参
数;ds1302: 无***********************************************************************/ i &gt:
秒 分 时 日 月 星期 年
【共7个字节】********************************************/P6OUT |= BIT2;
return(rdata):R_Data功
能:读取DS1302内部的时间参
uchar rdata = 0X00;/ 禁止写入} &#47,tishi),观察brdata是否与bwdata一致
DS_RST1;RST=0
delay(10);
disptemp[0] = shuzi[(rdata[2]&0xf0)&
delay(50000);
/P1OUT = 0XFF;;4];uchar R_Data(uchar addr){/
DS_SCL1:无说明*************************************************
注释;P2OUT = 0XFF:时钟多字节写入命令
for (i = 8,rwdata
三个数组中的数据;SCLK=1}/*******************************************函数名称,0x00);
/uchar Read1Byte(void) { //#include &P3OUT = 0XFF;
disptemp[4] = shuzi[rdata[1]&0x0f];
&#47,控制
【7个数据(BCD格式)+1个控制】********************************************/允许写入
for(i = 7:time--延时长度返回值
disptemp[1] = shuzi[rdata[2]&0x0f],年;&#47:Set_DS1302功
明:将LCD位拨至ON;
P3DIR = 0XFF;//P4OUT = 0XFF;/P1OUT = 0XFF;
delay(10);
/中#include &
DS_SCL1,但是请注意数据格式;
&#47:&初始化液晶
LcdReset():ptr--指向数据存放地址的指针返回值
:BurstWrite1302功
_NOP();i &lt,月;void BurstWrite1302(uchar *ptr){
&#47:从DS1302读出1个字节的数据参
数;写入数据
/= 1;SCLK对应的IO设置为输出状态
DS_SCL0;&#47,星期;P5OUT = 0XFF.c&
DS_SCL0,rwdata
三个数组中的数据;
_NOP();/&#47,星期:无********************************************&#47:ptr--指向存放数据地址的指针返回值
,bwdata.h&
_NOP();msp430x14x;
DS_SCL1;*******************************************函数名称,*ptr++);
disptemp[3] = shuzi[(rdata[1]&0xf0)&P6OUT = 0XFF:BurstReadRAM功
能,观察rdata是否与wdata一致
}}/ 0; i--)
Write1Byte(*ptr++).h&&#47,8,这样才能保证每次上电时CPU都从DS1302中读出正确
的当前时间送到液晶中去显示;&void Reset_DS1302(void){
DS_RST_OUT: 读取DS1302当前时间* 调用;读取时间转换数值显示
BurstRead1302(rdata);DS_SCL = P2;
disptemp[7] = shuzi[rdata[0]&0x0f];读取时间转换数值显示
BurstRead1302(rdata):设置DS1302内部的时间参
数:读出的一个字节数据********************************************/0xfe.h&typedef unsigned int
uint: 保存当前时间地址;
/#define DS_RST
Write1Byte(0xff);#include &&*******************************************函数名称;
Reset_DS1302();#include &quot,1;
addr += 2;} //}/在此处设置断点;cry1602.c&
P6DIR = 0XFF:W_Data功
能, uchar wdata){
DS_RST0;中
根据程序中提示.h&
P6DIR = 0XFF;
delay(50000):对DS1302进行复位操作参
数;void BurstWriteRAM(uchar *ptr){
DispNchar(4;
for(i = 8;允许写入
DS_RST0;关闭看门狗
P6DIR |= BIT2;********************************************************程序功能; 7,其余拨至OFF测试说明;/
W_Data(0x8e;
W_Data(0x8e:addr--寄存器地址
wdata--写入的数据返回值/&#47,观察rrdata是否与rwdata一致
/SDA对应的IO设置为输入状态
DS_RST1,设置断点观察数据:无说明
,0x00):共读出31个字节的数据********************************************/
addr += 2; 0;
/cry1602:
【7个数据(BCD格式)+1个控制】********************************************//
BurstWriteRAM(rwdata);
/对应的编码
disptemp[5]=0x3a;*******************************************函数名称:Reset_DS1302功
/对应的编码
disptemp[5]=0x3a;cry1602;
}}#include &lt,时;
BurstWriteRAM(rwdata); i--)
*ptr++ = Read1Byte();
disptemp[0] = shuzi[(rdata[2]&0xf0)&
DS_SCL0;在此处设置断点,日;
for(i = 0;
_NOP();i++)
ptr[i] = R_Data(addr);
WDTCTL = WDTPW + WDTHOLD
希望用数码管显示啊 ,大侠再改改谢谢。
提问者评价
其他类似问题
为您推荐:
您可能关注的推广
msp430单片机的相关知识
其他1条回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁想用msp430 g2553做一个时钟的程序该怎么写? - MSP430技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
想用msp430 g2553做一个时钟的程序该怎么写?
20:08:14  
想用msp430 g2553做一个时钟,要实现四位数码管显示小时和分钟,中间冒号每秒闪烁一次,三个按键控制调节时间,程序写了一部分,想请教下大家帮忙写下“时间”和“按键控制”部分的程序。谢谢!!!
#include &msp430g2553.h&
//宏定义======================================================================================//
#define DIO_high& & & & (P2OUT |= BIT2)& & & & & & & & //高电平& &DIO ==& P1.5 (IIC总线需要三根线DIO、CLK、STB)
#define DIO_low& & & & & & & & (P2OUT &= ~BIT2)& & & & //低电平
#define CLK_high& & & & (P2OUT |= BIT1)& & & & & & & & //高电平& &CLK ==& P1.4 (IIC总线需要三根线DIO、CLK、STB)
#define CLK_low& & & & & & & & (P2OUT &= ~BIT1)& & & & //低电平
#define STB_high& & & & (P2OUT |= BIT0)& & & & & & & & //高电平& &STB ==& P1.2 (IIC总线需要三根线DIO、CLK、STB)
#define STB_low& & & & & & & & (P2OUT &= ~BIT0)& & & & //低电平
#define DIO_IN&&& & & & (P2DIR &= ~BIT2) & & & & //输入状态(DIO设为输入)
#define DIO_OUT&&& & & & (P2DIR |= BIT2)&&& & & & //输出状态
#define DIO_READ & & & & (P2IN & BIT2) & & & &&&& & & & //读引脚电平
//变量声明=====================================================================================//
unsigned char sec_& & & & & & & & & & & & & & & & //20ms计数值(记50次即到达1s)
unsigned char disp_& & & & & & & & & & & & & & & & //显示刷新标志
unsigned char const num[20] = {& & & & 0x3f,
& & & & & & & & & & & & & & & & 0x06,
& & & & & & & & & & & & & & & & 0x5b,
& & & & & & & & & & & & & & & & 0x4f,
& & & & & & & & & & & & & & & & 0x66,
& & & & & & & & & & & & & & & & 0x6d,
& & & & & & & & & & & & & & & & 0x7d,
& & & & & & & & & & & & & & & & 0x07,
& & & & & & & & & & & & & & & & 0x7f,
& & & & & & & & & & & & & & & & 0x6f,
& & & & & & & & & & & & & & & & & & & & & & & && && & }; & & & & & & & & //0~9显示代码
//==========================================================================================//
void delayms(unsigned int temp)& & & &&&//延时
& & & & unsigned int i,j;
& & & & for(j=j&0;j--)
& &&&& & & & for(i=0;i&3210;i++);
//=========================================================================================//
void LED_ON3(void)
& & & && & & & & & & & & & & & & & & & & & & & & & & & //闪烁三次计数
& & & && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //
& & & & for(ledcc=0; ledcc&6; ledcc++)& & & & & & & & & & & & & & & & //LED灯闪烁三次
& & & & & & & & P1OUT ^= BIT0 + BIT6;& & & & & & & & & & & & & & & & & & & & //翻转
& & & & & & & & for(x=0; x&50000; x++);& & & & & & & & & & & & & & & & & & & & //延时
//==========================================================================================//
void init_port(void)
& & & & P2SEL = 0X00;& & & & & & & & & & & & & & & & & & & & //P2口全部设为普通I/O口
& & & & P2DIR |=&&BIT2;& & & & & & & & & & & & & & & & & & & & //DIO ==& P3.5 (IIC总线需要三根线DIO、CLK、STB)
& & & & P2DIR |=&&BIT1;& & & & & & & & & & & & & & & & & & & & //CLK ==& P3.4 (IIC总线需要三根线DIO、CLK、STB)
& & & & P2DIR |=&&BIT0;& & & & & & & & & & & & & & & & & & & & //STB ==& P3.2 (IIC总线需要三根线DIO、CLK、STB)
& & & & DIO_& & & & & & & & & & & & & & & & & & & & & & & & //
& & & & CLK_& & & & & & & & & & & & & & & & & & & & & & & & //
& & & & STB_& & & & & & & & & & & & & & & & & & & & & & & & //初始时DIO、CLK、STB初始化时全部置“1”
& & & & P1DIR |= BIT0 + BIT6;& & & & & & & & & & & & //P1.0红色LED,P1.6绿色LED
& & & & P1OUT &= ~(BIT0 + BIT6);& & & & & & & & //上电时全灭
//写数据====================================================================================//
void send_data(unsigned char dat)&&& & & & //写数据
& & STB_ & & & & & & & & & & & & & & & & & & & & & & & & //STB下降沿
& & for(j=0; j&8; j++)& && & & & & & & & & & //一个字节8位数据
& & & & & & CLK_& && && & & & & & & & & & & & & & & & //CLK低电平
& & & & & & if((dat&0x01) == 1)& & & & & & & & & & & & //最低位为&1&
& & & & & & & & & & DIO_& & & & & & & & & & & & & & & & //输出高电平
& & & & & & else
& & & & & & & & & & DIO_& & & & & & & & & & & & & & & & //最低位为&0&
& && &&&CLK_& &&&& & & & & & & & & & & & & & & & //CLK高电平
& && &&&dat = dat&&1; & & & & & & & & & & & & & & & & //右移一位
//*读数据*==================================================================================//
unsigned char read_data(void)& & & & & & //读数据
& & & & unsigned char i,k;&&& & & & & & & & & & & & //
& & & & STB_& && && & & & & & & & & & & & & & & & & & & & //STB下降沿
& & & & DIO_& & & & & & & & & & & & & & & & & & & & & & & & //&读数据&需要DIO下降沿
& & & & delayms(1); & & & & & & & & & & & & & & & & & & & & //延时配合时序
& & & & for(i=0;i&8;i++)&&& & & & & & & & & & & & & & & & //需要读出8位数据
& & & & & & & & CLK_ & & & & & & & & & & & & & & & & & & & & //CLK低电平
& & & & & & & & k = k && 1;& & & & & & & & & & & & & & & & & & //k右移一位
& & & & & & & & if(DIO_READ == 0)& && & & & & & //如果读到DIO为&0&
& & & & & & & & {
& & & & & & & & & & & & k = k & 0x7f;& & & & & & & & & & //最高位清0(右移8次后即为最低位)
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {& && && && && && && &&&& & & & //如果读到DIO为&1&
& & & & & & & & & & & & k = k | 0x80;&&& & & & & & & & & & & & //最高位置1(右移8次后即为最低位)
& & & & & & & & }
& & & & & & & & CLK_ & & & & & & & & & & & & & & & & & & & & //CLK高电平
& & & & return(k); & & & & & & & & & & & & & & & & & & & & & & & & //返回k的值
//==========================================================================================//
void TM1638_init(void)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //TM1638初始化
& & & & STB_& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //为了进入send_data()后产生&下降沿&
& & send_data(0x80);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //关显示
& & STB_& && && && && && && &&&& & & & & & & & & & & & & & & & //写完数据后STB需置1
& & send_data(0x03);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //显示模式
& & STB_& && && && && && && &&&& & & & & & & & & & & & & & & & //写完数据后STB需置1
& & send_data(0x40);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //自动地址加1模式
& & & & send_data(0xc0);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //上电后从起始地址00H-15H全部清零(全灭)
& & & & for(i=0; i&17; i++)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //共16个单元清零(00H-15H)
& & & & & & & & send_data(0x00);& & & & & & & & & & & & & & & & & & & & & & & & & & & & //全灭
//==========================================================================================//
void start_disp(void)
& & & & STB_& &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //为了进入send_data()后产生&下降沿&
& & & & send_data(0xc0);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //起始地址
& & & & send_data(num[9]);send_data(num[3]);& & & & & & & & & & & & //分_L
& & & & send_data(num[5]);send_data(num[2]);& & & & & & & & & & & & //分_H
& & & & send_data(num[3]);send_data(num[1]);& & & & & & & & & & & & //时_L
& & & & send_data(num[2]);send_data(num[0]);& & & & & & & & & & & & //时_H
& & & & STB_ & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //
& & & & send_data(0x8f);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //开显示
& & & & for(x=0; x&50000; x++);& & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时
//主函数==============================================================================================//
void main(void)
& & & & WDTCTL = WDTPW + WDTHOLD;& && && && && &&&& & & & & & & && && && &&&//停止看门狗定时器
& & & & init_port();& & & & & & & & & & & & & & & & & & & & & & & & & & & & //I/O口初始化
& & & & LED_ON3();& & & & & & & & & & & & & & & & & & & & & & & & & & & & //开机后红色LED、绿色LED一起闪烁三次
& & & & BCSCTL1 = CALBC1_1MHZ;& & & & & & & & & & & & & & & & & & & & & & & &&&//
& & & & DCOCTL = CALDCO_1MHZ;& & & & & & & & & & & & & & & & & & & & & & & & //上面两句将内部DCO校准至1MHz
& & & & TM1638_init();& & & & & & & & & & & & & & & & & & & & & & & & & & & & //TM1638初始化
& & & & start_disp();& & & & & & & & & & & & & & & & & & & & & & & & & & & & //开机显示&23:59&
& & & & CCTL0 = CCIE;& && && && && && && && && &&&& & & & & & & & //CCR0 interrupt enabled CCR0中断使能
& & & & CCR0 = 20971;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //CCR0计数值为20971----& 6 = 0.02000 s = 20ms
& & & & TACTL = TASSEL_2 + MC_1 + TACLR;& && && && && & & && && &&&//SMCLK, upmode 选SMCLK作为计数时钟,增计数模式
& & & & _BIS_SR(GIE);& && && && && &&&& & & & & & & & & & & & & & & & & & & & //Enter LPM0 w/ interrupt 进入低功耗模式0,并开总中断允许
& & & & P1OUT &= ~BIT6;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //绿LED灯灭(运行时只闪烁红色LED)
& & & & while(1)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //系统主循环
& & & & & & & & if(disp_flag == 25)& & & & & & & & & & & & & & & & & & & & & & & & & & & & //到0.5s吗?
& & & & & & & & {
& & & & & & & & & & & & STB_& &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & //为了进入send_data()后产生&下降沿&
& & & & & & & & & & & & send_data(0xc0+8);& & & & & & & & & & & & & & & & & & & & & & & & //起始地址
& & & & & & & & & & & & send_data(num[9]);send_data(num[9]);& & & & //显示冒号
& & & & & & & & & & & & STB_ & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //
& & & & & & & & }
& & & & & & & & if(disp_flag == 50)& & & & & & & & & & & & & & & & & & & & & & & & & & & & //到1s吗?
& & & & & & & & {
& & & & & & & & & & & & disp_flag = 0x00;& & & & & & & & & & & & & & & & & & & & & & & & //显示刷新标志清0
& & & & & & & & & & & & STB_& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //
& & & & & & & & & & & & send_data(0xc0+8);& & & & & & & & & & & & & & & & & & & & & & & & //起始地址
& & & & & & & & & & & & send_data(0x00);send_data(0x00);&&& & & & & & & && && && && && & //清冒号(冒号灭)
& & & & & & & & & & & & STB_& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //
& & & & & & & & }
//============================================================================================//
#pragma vector=TIMER0_A0_VECTOR& & & & & & & & & & & & & & & & // Timer A0 interrupt service routine (Timer_A0 中断服务程序)
__interrupt void Timer_A (void)& & & & & & & & & & & & & & & & //每20ms产生一次定时器中断
& & & & sec_count++;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //计数值每20ms加1
& & & & disp_flag++;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //
& & & & if(sec_count == 25)& & & & & & & & & & & & & & & & & & & & & & & & //加25次后,即到了0.5s (25 * 20ms = 500ms = 0.5s)
& & & & & & & & sec_count = 0x00;& & & & & & & & & & & & & & & & & & & & //计数值清0
& & & & & & & & P1OUT ^= 0x01;& && && && && && & & & & & //Toggle P1.0 每0.5s翻转一次(即0.5s亮、0.5s灭,也即1s亮一次)
//============================================================================================//
10:31:38  
请大家帮忙写的话比较难,除非你给报酬是吧,这个很现实的东西。所以你要自己动手写,具体遇到问题来问大家,那我相信大家都会帮你的。但是你这样让别人帮忙写一般不大可能,别人没有这个时间,也没有这个义务帮你写,你说是吗?
Powered by}

我要回帖

更多关于 数码管 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信