4739|8

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

msp430的 1602液晶的电子钟 [复制链接]

#include "msp430x24x.h"
typedef unsigned char uchar;
typedef unsigned int uint;
/***************宏定义*********************************/
#define DataDir P1DIR //数据选择
#define DataPORT P1OUT //输出。
#define Busy 0x80
#define CtrLDDir P2DIR
#define CLR_RS P2OUT&=~BIT2; //RS=P2.2 0
#define SET_RS P2OUT|=BIT2; // 1
#define CLR_RW P2OUT&=~BIT1; //RW=P2.1 0
#define SET_RW P2OUT|=BIT1; // 1
#define CLR_EN P2OUT&=~BIT0; //EN=P2.0 0
#define SET_EN P2OUT|=BIT0; // 1
/*******************************************************/
uchar ta××e[]=" 2010-06-05 ";
uchar ta××e1[]=" ^-^23:59:58 ^-^";
uchar i=0,tt=0;
uint miao,shi,fen;
uchar NUM_LED[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90};
void delay_lcd(void)
{

for(i=0;i<200;i++);
}
/***************检测忙信号*********************/
void WaitForEna××e(void)
{
DataDir &=0X00; //将P4口切换到输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();

while((P1IN & Busy) != 0); //检测忙标志
CLR_EN;
P1DIR|=0XFF; //将P1口切换到输出状态
}

/***************写指令*********************/
void LcdWriteCommand(uchar cmd)
{

CLR_RS;
CLR_RW;
_NOP();
DataPORT=cmd; //将命令写入数据端口。
_NOP();
SET_EN //产生使能脉冲信号。
_NOP();
_NOP();
CLR_EN;

}

/***************写数据*********************/
void LcdWriteData(uchar Data)
{

SET_RS ;
CLR_RW;
DataPORT=Data; //数据写入数据端口。
_NOP();
SET_EN //产生使能脉冲信号。
_NOP();
_NOP();
CLR_EN;
}
/***************LCD初始化*********************/
void Lcdinit(void)
{
CtrLDDir|=0xff; // 控制I0口为输出模式 P2DIR
DataDir=0xff; //数据端口为输出. P1DIR

LcdWriteCommand(0x38); //显示模式设置
LcdWriteCommand(0x06); //读写字符时,地址指针加1 ,整体不移动。
LcdWriteCommand(0x0c); //显示开,不开光标,不闪烁
LcdWriteCommand(0x08); //关闭显示
LcdWriteCommand(0x01); //清显示,光标复位到地址00H

}
void sfm(uchar add,uchar data)
{
uchar shi,ge;
shi=data/10;
ge=data%10;
LcdWriteCommand(0x80+0x40+add);
LcdWriteData(0x30+shi);
LcdWriteData(0x30+ge);

}



void main(void)
{
uchar m,n;
WDTCTL = WDTPW+WDTHOLD;
TACTL=TASSEL_2+ID_3+MC_1; //DCO(8KHZ). 8分频。 UP to CCR0 1Us
CCTL0=CCIE; /* Capture/compare interrupt ena××e */
CCR0=10000;
Lcdinit();
_BIS_SR(LPM3_bits+GIE);

//LcdWriteCommand(0x80);
for(m=0;m<13;m++)
{

delay_lcd();
LcdWriteData(ta××e[m]);
delay_lcd();
delay_lcd();
}


LcdWriteCommand(0x80+0x40);
for(n=0;n<16;n++)
{
delay_lcd();
LcdWriteData(ta××e1[n]);
delay_lcd();
//delay_lcd();


}
while(1)
{

if(tt==10)
{
tt=0;
miao++;

if(miao==60)
{
miao=0;
fen++;

if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
sfm(4,shi);
}

sfm(7,fen);


}
sfm(10,miao);
}





}
}

// 看门狗中断服务子程序
#pragma vector= TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
tt++;

LPM3_EXIT;
}
为什么只是个位变化 但是十位不变化呢?谢谢大家

最新回复

谢谢你, 我刚试了试: 是延时的问题,因为我是用的仿真。 void sfm(uchar add,uchar data) {     uchar shi,ge;     shi=data/10;     ge=data%10;     LcdWriteCommand(0x80+0x40+add);     delay_lcd();     LcdWriteData(0x30+shi)     delay_lcd();            //延时程序,不可缺少。就在这加个延时就好了。     LcdWriteData(0x30+ge);     } 估计在找板子上不用延时就行, 重心 的 感谢你。 我去接 结 贴子去了   详情 回复 发表于 2010-6-6 19:54
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没人 回答呀   55555555
 
 

回复

74

帖子

0

TA的资源

禁止访问

板凳
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
十位不变化,是指分不变化吗?初步看来,是你的程序有很大的问题。你的mian函数中,先做显示,然后就一个死循环来做时分秒的变化。
如下:
while(1)
{

if(tt==10)
{
tt=0;
miao++;

if(miao==60)
{
miao=0;
fen++;

if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
sfm(4,shi);
}

sfm(7,fen);


}
sfm(10,miao);
}

}

你这个死循环,是没有break的。所以,程序一直没有跳出去,根本不可能再回到显示部分。所以,你应该这样,while(1)死循环下,分别有分秒累加部分和显示部分。一旦时分秒有任一的变化都重新显示一次。反正,就保证你的显示部分要执行到。。。。。

 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 peasant_lee 的回复:
十位不变化,是指分不变化吗?初步看来,是你的程序有很大的问题。你的mian函数中,先做显示,然后就一个死循环来做时分秒的变化。
如下:
while(1)
{

if(tt==10)
{
tt=0;
miao++;

if(miao==60)
{
miao=0;
fen++;

if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{……
没明白你的意思,我是从51闪转换过来的,在51上可以实现。
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

6
 
那么请问,十位不变化,是什么意思??十位指哪一个位?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 peasant_lee 的回复:
那么请问,十位不变化,是什么意思??十位指哪一个位?


哦,不好意思,表达不好,
我的意思是说:我这个只是更新个位:比如开始是: 23:59:58(时,分,秒)

2秒后是:20:50:50:
然后就是  秒的个位从0到9变化。  十位(5)不变化。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
貌似不是你定时器出问题,而且时分秒更新也正常,问题好像出在显示部分。你试试,开始就初始化一个时间,一直不变,就显示这个时间,看看正常不?假如不正常,先将1602显示调通
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 peasant_lee 的回复:
貌似不是你定时器出问题,而且时分秒更新也正常,问题好像出在显示部分。你试试,开始就初始化一个时间,一直不变,就显示这个时间,看看正常不?假如不正常,先将1602显示调通



谢谢你,
我刚试了试:
是延时的问题,因为我是用的仿真。
void sfm(uchar add,uchar data)
{
    uchar shi,ge;
    shi=data/10;
    ge=data%10;
    LcdWriteCommand(0x80+0x40+add);
    delay_lcd();
    LcdWriteData(0x30+shi)
    delay_lcd();            //延时程序,不可缺少。就在这加个延时就好了。
    LcdWriteData(0x30+ge);
   
}

估计在找板子上不用延时就行,
重心 的 感谢你。
我去接 结 贴子去了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表