MSP430单片机用DS1302在LCD1602上显示为什么会闪烁

#include <msp430g2553.h>
typedef unsigned char uchar;
typedef unsigned int uint;
/**************宏定义***************/
#define DataDir P1DIR
#define DataPort POUT
#define Busy 0x80
#define CtrlDir P2DIR
#define CLR_RS P2OUT&=~BIT0; //RS = P2.0
#define SET_RS P2OUT|=BIT0;
#define CLR_RW P2OUT&=~BIT1; //RW = P2.1
#define SET_RW P2OUT|=BIT1;
#define CLR_EN P2OUT&=~BIT2; //EN = P2.2
#define SET_EN P2OUT|=BIT2;
/**************宏定义***************/
#define DS_RST BIT3 //DS_RST = P2.3
#define DS_SCL BIT4 //DS_SCL = P2.4
#define DS_SDA BIT5 //DS_SDA = P2.5
#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
uchar flag;//定义一个读标志位
uchar second,minute,hour,week,day,month,year;//秒、分、时、星期、日、月、年
/*******************************************
函数名称:delay
功 能:延时一段时间
参 数:time--延时长度
********************************************/
void delay(uint time)
{
uint i;
for(i = 0;i < time;i++) _NOP();

/*******************************************
函数名称:Delay5ms 功 能:延时约5ms
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
/*******************************************
函数名称:WaitForEnable
功 能:等待1602液晶完成内部操作
********************************************/
void WaitForEnable(void)
{
P1DIR &= 0x00; //将P1口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P1IN & Busy)!=0); //检测忙标志
CLR_EN;
P4DIR |= 0xFF; //将P1口切换为输出状态

/*******************************************
函数名称:write_com
功 能:向液晶模块写入命令
********************************************/
void write_com(uchar cmd)
{
WaitForEnable(); // 检测忙信号?
CLR_RS; 
CLR_RW;
_NOP();
DataPort = cmd; //将命令字写入数据端口
_NOP(); 
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN; 
}
/*******************************************
函数名称:write_data
功 能:向液晶显示的当前地址写入显示数据
参 数:data--显示字符数据
返回值 :无
********************************************/
void write_data( uchar data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显示数据写入数据端口
_NOP();
SET_EN; //产生使能脉冲信号
_NOP();
_NOP();
CLR_EN; 
}
void Write1602(uchar add,uchar dat)
{
write_com(add);
write_data(dat);
}
void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_data(*ch++);
Delay5ms(); 
}

/*******************************************
函数名称:LcdReset
功 能:对1602液晶模块进行复位操作
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状态
DataDir = 0xFF; //数据端口设为输出状态
write_com(0x38);//规定的复位操作
Delay5ms();
write_com(0x38); 
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);//显示模式设置 
write_com(0x06);//写字符时整体不移动
write_com(0x0c);//显示开,不开游标,不闪烁
write_com(0x01);//显示清屏
Write1602(0x80,'2');
Write1602(0x81,'0');
Write1602(0x80+4,'-');
Write1602(0x80+7,'-');
Write1602(0x80+0x40+5,':');
Write1602(0x80+0x40+8,':');
}
/*******************************************
函数名称:Reset_DS1302
功 能:对DS1302进行复位操作
********************************************/
void Reset_DS1302(void)
{
DS_RST_OUT; //RST对应的IO设置为输出状态
DS_SCL_OUT; //SCLK对应的IO设置为输出状态
DS_SCL0; //SCLK=0
DS_RST0; //RST=0
delay(10);
DS_SCL1; //SCLK=1
}
/*******************************************
函数名称:Write1Byte
功 能:对DS1302写入1个字节的数据
********************************************/
void Write_Byte(uchar wdata)
{
uchar i;
DS_SDA_OUT; //SDA对应的IO设置为输出状态
DS_RST1; //REST=1;
for(i = 8; i > 0; i--)
{
if(wdata&0x01)
DS_SDA1;
else
DS_SDA0;
DS_SCL0;
delay(10);
DS_SCL1;
delay(10);
wdata >>= 1;
}
}
/*******************************************
函数名称:Read1Byte
功 能:从DS1302读出1个字节的数据
********************************************/
uchar Read_Byte()
{
uchar i;
uchar rdata = 0X00;
DS_SDA_IN; //SDA对应的IO设置为输入状态
DS_RST1; //REST=1;
for(i = 8; i > 0; i--)
{
DS_SCL1;
delay(10);
DS_SCL0;
delay(10);
rdata >>= 1;
if(DS_SDA_BIT)
rdata |= 0x80;
}
return(rdata);
}
/*******************************************
函数名称:Write_dat
功 能:向某个寄存器写入一个字节数据
参 数:add--寄存器地址
dat--写入的数据
********************************************/
void Write_dat(uchar add, uchar dat)
{
DS_RST0;
DS_SCL0; 
_NOP();
DS_RST1;
Write_Byte(add); //写入地址
Write_Byte(dat); //写入数据
DS_SCL1;
DS_RST0;
}
/*******************************************
函数名称:Read_dat
功 能:从某个寄存器读出一个字节数据
参 数:addr--寄存器地址
返回值 :读出的数据
********************************************/
uchar read_1302add(uchar add)
{
uchar rdata; 
DS_RST0;
DS_SCL0;
_NOP();
DS_RST1;
Write_Byte(add); //写入地址
rdata = Read_Byte(); //读出数据
DS_SCL1;
DS_RST0;
return(rdata);
}
/***********初始化1302*************/
void init_1302()
{
flag=read_1302add(0x81);//读秒寄存器最高位,读出时钟状态
if(flag&0x80);//判断时钟是否关闭,若内部关闭,则初始化,否则继续走
{
Write_dat(0x8e,0x00);
Write_dat(0x80,((55/10)<<4|(55%10)));//写秒寄存器,并写入初值55
Write_dat(0x82,((59/10)<<4|(59%10)));//写分寄存器,并写入初值59
Write_dat(0x84,((22/10)<<4|(22%10)));//写小时寄存器,并写入初值23
Write_dat(0x86,((24/10)<<4|(24%10)));//写日寄存器,并写入初值18
Write_dat(0x88,((2/10)<<4|(2%10)));//写月寄存器,并写入初值2
Write_dat(0x8a,((5/10)<<4|(5%10)));//写周寄存器,并写入初值5
Write_dat(0x8c,((12/10)<<4|(12%10)));//写年寄存器,并写入初值12,不能写2012年
Write_dat(0x90,0xa5);//写充电方式
Write_dat(0x8e,0x80);//加上写保护 
}
}
/*****************读出秒的十进制数***************************/

uchar readsecond()
{
uchar dat;
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
return second;
}

/*****************读出分的十进制数***************************/

uchar readminute()
{
uchar dat;
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
return minute;
}

/*****************读出小时的十进制数***************************/

uchar readhour()
{
uchar dat;
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
return hour;
}
/*****************读出天的十进制数***************************/

uchar readday()
{
uchar dat;
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
return day;
}

/*****************读出月的十进制数***************************/

uchar readmonth()
{
uchar dat;
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
return month;
}
/*****************读出周的十进制数***************************/

uchar readweek()
{
uchar dat;
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
return week;
}

/*****************读出年的十进制数***************************/

uchar readyear()
{
uchar dat;
dat=read_1302add(0x8d);
year=((dat&0xf0)>>4)*10+(dat&0x0f);
return year;
}
/************************读出所有时间**********************/
void readtime()
{
readsecond();
readminute();
readhour();
readday();
readmonth();
readweek();
readyear();
}
/*********************向1602写入时间****************************/
void write_second()
{
uchar shi,ge;
shi=second/10;
ge=second%10;
Write1602(0x80+0x40+9,0x30+shi);
Write1602(0x80+0x40+10,0x30+ge);
}
void write_minute()
{
uchar shi,ge;
shi=minute/10;
ge=minute%10;
Write1602(0x80+0x40+6,0x30+shi);
Write1602(0x80+0x40+7,0x30+ge);
}
void write_hour()
{
uchar shi,ge;
shi=hour/10;
ge=hour%10;
Write1602(0x80+0x40+3,0x30+shi);
Write1602(0x80+0x40+4,0x30+ge);
}

void write_day()
{
uchar shi,ge;
shi=day/10;
ge=day%10;
Write1602(0x80+8,0x30+shi);
Write1602(0x80+9,0x30+ge);
}
void write_month()
{
uchar shi,ge;
shi=month/10;
ge=month%10;
Write1602(0x80+5,0x30+shi);
Write1602(0x80+6,0x30+ge);
}
void write_year()
{
uchar shi,ge;
shi=year/10;
ge=year%10;
Write1602(0x80+2,0x30+shi);
Write1602(0x80+3,0x30+ge);
}
void write_week()
{
Write1602(0x80+12,0x30+week);
//uchar week;
switch(week)
{
case 1: Write1602(0x80+12,'M');
Write1602(0x80+13,'O');
Write1602(0x80+14,'N');
break;
case 2:Write1602(0x80+12,'T');
Write1602(0x80+13,'U');
Write1602(0x80+14,'E');
break;
case 3:Write1602(0x80+12,'W');
Write1602(0x80+13,'E');
Write1602(0x80+14,'N');
break;
case 4:Write1602(0x80+12,'T');
Write1602(0x80+13,'H');
Write1602(0x80+14,'U');
break;
case 5:Write1602(0x80+12,'F');
Write1602(0x80+13,'R');
Write1602(0x80+14,'I');
break;
case 6:Write1602(0x80+12,'S');
Write1602(0x80+13,'A');
Write1602(0x80+14,'T');
break;
case 7:Write1602(0x80+12,'S');
Write1602(0x80+13,'U');
Write1602(0x80+14,'N');
break;
}
}

/*************************主函数*************************/
void main( void )
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; //关狗 
LcdReset();
//zifuchuan("The time is:");
//循环读数显示
init_1302();
while(1)
{
readtime();
write_second();
write_minute();
write_hour();
write_day();
write_month();
write_year();
write_week();

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
msp430接1602无法显示

用430g2553与1602用4根数据线,程序调试的时候正常,全速运行就不行了,是怎么回事

msp430f149控制lcd12864显示汉字

msp430f149控制lcd12864显示汉字代码,msp430f149控制lcd12864显示汉字代码下载

单片机msp430实验求解

谁有单片机msp430汽车转向灯实验的程序和proteus仿真图啊,急求啊,谢谢

使用msp430单片机设计

单片机三相单三拍步进机: 要求:采用单片机来控制一个三相单三拍的步进电机工作。步进电机的旋转方向由正反转控制信号来控制。步进电机的步数由键盘输入,可输入的步数分别为3,6,9,12,15,18,21,24,27步。并且键盘具有键盘锁的功能,当键盘上锁的时候,步进电机是不接受输入步数的,也不会运转。只有当键盘锁打开并输入步数的时候,步进电机才开始工作 。电机运转的时候有正转和反转指示灯指示。当电机在运转的过程当中,如果过热,则电机停止运转,同时红色指示灯亮.,同时警报响。

msp430f5529关于灯闪烁间隔问题

请问下我想用timerA来使灯的闪烁间隔为20s,就是灯亮20s,灭20s,但他的极限就只有几秒,怎么改进来实现或者用其他方法

单片机MSP430怎么通过按键点灯啊

我想不按键的时候LED2灯(对应P1.6引脚)亮,LED1灯(对应P1.0引脚)灭。 按下按键后两灯互换状态并延迟30s左右,再复位。 程序已经写好了,但不知道哪里出了点问题,不能实现我这个功能,帮忙看一下,谢谢! ``` #include <msp430g2553.h> void main(void) { WDTCTL=WDTPW+WDTHOLD; P1OUT &= ~BIT0; //设置p1.0输出置地 P1OUT |= BIT6; //设置p1.6输出置高 P1OUT &= ~BIT0; //设置p1.0输出置地 P1DIR |= BIT6; //设置p1.6为输入 P1DIR &= ~BIT3; //设置p1.3为输入 P1REN |= BIT3; //使能内部电阻 P1OUT|=BIT3; //电阻上拉 int CLO(); RE_2: while(1) { switch(P1IN & BIT3) { case 0: { P1OUT |= BIT0; //p1.0开灯 P1OUT &= ~BIT6; //p1.6关灯 CLO(); P1OUT &= ~BIT0; //p1.0关灯 P1OUT |= BIT6; //p1.6开灯 break; } case 1:break; } goto RE_2; } } int CLO() //延迟30s { int i=1; while(1) { while(i<60) //12 *5s=60s { __delay_cycles(500000); //5s i++; } } } ```

关于MSP430F5529单片机的串口问题

一句话,我要疯了,,现在的问题是,使用的串口调试助手来调试的,开发环境从IAR低版本到高版本以及CCS,程序是官方程序和自己编写的,以及网友的。板子是标准板,还有个自己的板子。USB转串口线两条。但是结果都一样。 主要是使用串口调试助手发送字符串,然后接收相同的。结果是,如果我发较长的字符串,前四位会丢失。单个发送字符,根本没有任何返回信息。我简直要疯了,真的不知道原因了,期待大神拯救啊 代码如下: #include <msp430.h> int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL = BIT3+BIT4; // P3.4,5 = USCI_A0 TXD/RXD UCA0CTL1 |= UCSWRST; // **Put state machine in reset** UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 6; // 1MHz 9600 (see User's Guide) UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16; // Modln UCBRSx=0, UCBRFx=0, // over sampling UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt P4OUT=0; __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled __no_operation(); // For debugger } // Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCI_A0_VECTOR __interrupt void USCI_A0_ISR(void) { switch(__even_in_range(UCA0IV,4)) { case 0:break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX -> RXed character break; case 4:break; // Vector 4 - TXIFG default: break; } }

单片机MSP430f5529看门狗定时器

MSP430f5529,用看门狗定时器使p3.7引脚相连的LED每秒点亮一次,灯亮的时间为定时的四分之一

msp430f5529驱动安装后在我的电脑上无显示

最开始msp430f5592lp安装驱动成功后在我的电脑显示为fat,现在没有窗口了,请问该怎么样弄才能打开里面的文件呢?

msp430f149+ds3231 模拟iic 怎么没有sda信号?哪里不对了?

#define DS_SCL BIT4 //DS_SCL = P5.4 #define DS_SDA BIT6 //DS_SDA = P2.6 #define DS_SCL_IN P5DIR &= ~DS_SCL #define DS_SCL_OUT P5DIR |= DS_SCL #define DS_SCL0 P5OUT &= ~DS_SCL #define DS_SCL1 P5OUT |= 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 void Init_CLK(void) { unsigned int i; BCSCTL1 &= ~XTS; do{ IFG1 &= ~OFIFG; for(i=0xFF;i>0;i--); } while((IFG1 & OFIFG)!=0); BCSCTL2 |= SELS+SELM1; _EINT(); P5SEL|=0x30; DS_SCL_OUT; //SCLK对应的IO设置为输出状态 P2DIR&=0xbf; P2OUT|=BIT6; DS_SCL0; //SCLK=0 delay_us(5); } void DS3231_Write(u8 write_address,u8 write_data) { u8 Device_Address = 0xD0; //DS3231写设备地址 iic_Start(); //开始 iic_SendByte(Device_Address); //发送设备地址 iic_Ack(); iic_SendByte(write_address); //发送地址 iic_Ack(); //应答 iic_SendByte(write_data); //发送数据 iic_Ack(); //应答 iic_Stop(); //停止 } u8 DS3231_Read(u8 read_address) { u8 Receive_Data; //数据接收 u8 Device_Address = 0xD0; //DS3231写设备地址 iic_Start(); //开始 iic_SendByte(Device_Address); //发送设备地址 iic_Ack(); //应答 iic_SendByte(read_address); //发送地址 iic_Ack(); //应答 iic_Start(); //重复开始 Device_Address = 0xD1; //DS3231读设备地址 iic_SendByte(Device_Address); //发送地址 iic_Ack(); //应答 iic_in(); Receive_Data = iic_ReceiveByte(); //接收数据 iic_out(); iic_NAck(); //不应答 iic_Stop(); //停止 return Receive_Data; //返回数据 } void delay_us(u8 time) { for(int i=0;i<time;i++) _NOP(); } view plaincopy to clipboardprint? <br> //------------iic开始----------- void iic_Start(void) { DS_SDA_OUT; DS_SCL_OUT; DS_SCL1; delay_us(5); DS_SDA1; delay_us(10); DS_SDA0; delay_us(5); DS_SCL0; delay_us(5); DS_SDA_IN; } //------------iic结束----------- void iic_Stop(void) { DS_SDA_OUT; DS_SCL_OUT; DS_SCL1; delay_us(10); DS_SDA0; delay_us(5); DS_SDA1; delay_us(5); DS_SDA_IN; } //------------iic应答----------- void iic_Ack(void) { DS_SCL0; DS_SDA0; delay_us(5); DS_SCL1; delay_us(5); DS_SCL0; delay_us(5); } //------------iic不应答--------- void iic_NAck(void) { DS_SCL0; DS_SDA1; delay_us(5); DS_SCL1; delay_us(5); DS_SCL0; delay_us(5); } //------------iic发送----------- void iic_SendByte(u8 SendData) { DS_SDA_OUT; DS_SCL_OUT; DS_SCL0; u8 i; for(i=0;i<8;i++) { DS_SCL0; delay_us(5); if(SendData&0x80) //MSB在前 DS_SDA1; else DS_SDA0; DS_SCL1; delay_us(2); DS_SCL0; SendData<<=1; } //delay_us(5); //DS_SDA1; //delay_us(5); //DS_SDA_IN; } //------------iic接收----------- u8 iic_ReceiveByte(void) { u8 i,temp=0; delay_us(5); DS_SDA1; delay_us(5); for(i=0;i<8;i++) { temp<<=1; DS_SCL0; delay_us(5); DS_SCL1; delay_us(2); temp=DS_SDA_BIT; if(temp==0x80) temp=temp|0x01; else temp=temp&0xFE; } DS_SCL0; delay_us(2); return temp; } void iic_in() { DS_SCL_OUT; DS_SDA_IN; } void iic_out() { DS_SCL_OUT; DS_SDA_OUT; DS_SCL1; delay_us(5); DS_SDA1; delay_us(2); }

请问msp430处理串口数据为什么只能处理一个字节

我在处理msp430接收中断函数,发现实际串口助手发送一个字符串,单片机其实只会响应其中一个字符,是单片机本身特点就这样么?我都是用开发板例子写的,照理说应该没啥问题,也和芯片书上写的对过了感觉程序应该没问题,所以找论坛大牛确认一下

MSP430f5529,用看门狗定时器使p3.7引脚相连的LED每秒点亮一次

MSP430f5529,用看门狗定时器使p3.7引脚相连的LED每秒点亮一次

proteus 仿真 ds18b20 温度始终显示27.9 然后我的按钮也失灵,求能教我怎么做

![图片说明](https://img-ask.csdn.net/upload/201805/14/1526269677_709702.png)我尝试了并行三个温度传感器 但是温度一直显示不对,然后试了下只编程一个 也是27.9不知道为什么 然后我自己做的按钮,编程好像也有点问题,求会做的教我,追加悬赏80 /******************************************* 函数名称:DS18B20_Reset 功 能:对DS18B20进行复位初始化操作 参 数:无 返回值 :初始化状态标志:0--失败,1--成功 ********************************************/ uchar DS18B20_Reset(void) { uchar Error=0; P1DIR = 0xff; _DINT(); P1OUT = 0x00; DelayNus(500); P1OUT = 0xff; DelayNus(55); P1DIR = 0x00; _NOP(); if(P1IN == 0x00) { Error = 1; //初始化成功 } else { Error = 0; //初始化失败 } P1DIR = 0xff; //设置为输出,并MCU给出高电平 P1OUT = 0xff; _EINT(); DelayNus(400); return Error; } //总线读取一个数据位 uchar DS18B20_ReadDQ(void) { uchar DQ_S=0; P1OUT = 0x00; //8个DQ 线全部设置为低电平 DelayNus(6); P1OUT = 0xff; DelayNus(8); P1DIR = 0x00; //准备读取 _NOP(); //延时待总线准备好数据 DQ_S = P1IN; //一次性读取8条DQ线的数据状态 DelayNus(45); P1DIR = 0xff; P1OUT = 0xff; //恢复端口电平 DelayNus(10); //延时 return DQ_S; //返回读取的值 } //写数据 void DS18B20_WriteByte(uchar Com) { uchar i; _DINT(); for(i=0;i<8;i++) { P1DIR = 0xff; P1OUT = 0x00; DelayNus(6); if (Com&0x01) { P1OUT = 0xff; } else { P1OUT = 0x00; } Com = Com>>1; DelayNus(50); P1OUT = 0xff; DelayNus(10); } _EINT(); } // 录入两位数据 void DS18B20_Read2Byte(void) { uint i; for(i=0;i<16;i++) { Read_buf_8ch[i]=DS18B20_ReadDQ(); } } //启动温度转换 void DS18B20_Conver(void) { DS18B20_WriteByte(0xcc); DS18B20_WriteByte(0x44); } //读取温度值 void DS18B20_ReadTemp(void) { uchar i; char j,k; uchar Mask; do { i = DS18B20_Reset(); } while(i); DS18B20_Conver(); DelayNus(60000); do { i = DS18B20_Reset(); } while(i); DS18B20_WriteByte(0xcc); DS18B20_WriteByte(0xbe); DS18B20_Read2Byte(); for(j=16;j>0;j--) { Mask=0x01; for(k=0;k<3;k++) { uiData[k] = uiData[k]<<1; if(Read_buf_8ch[j-1]&Mask) uiData[k]++; Mask = Mask<<1; } } } //将十一位二进制数转换成六位整形数据 void Disp_Numb(uint temper) { uchar i; for(i = 0;i < 6;i++) dN[i] = 0; if(temper & BIT0) { dN[0] = 5; dN[1] = 2; dN[2] = 6; } if(temper&BIT1) { dN[1] += 5; dN[2] += 2; dN[3] += 1; } if(temper & BIT2) { dN[2] += 5; dN[3] += 2; if(dN[2] >= 10) { dN[2] -= 10; dN[3] += 1; } } if(temper&BIT3) { dN[3] += 5; } if(temper & BIT4) { dN[4] += 1; } if(temper & BIT5) { dN[4] += 2; } if(temper & BIT6) { dN[4] += 4; } if(temper & BIT7) { dN[4] += 8; if(dN[4] >= 10) { dN[4] -= 10; dN[5] += 1; } } if(temper & BIT8) { dN[4] += 6; dN[5] += 1; if(dN[4] >= 10) { dN[4] -= 10; dN[5] += 1; } } if(temper & BIT9) { dN[4] += 2; dN[5] += 3; if(dN[4] >= 10) { dN[4] -= 10; dN[5] += 1; } } if(temper & BITA) { dN[4] += 4; dN[5] += 6; if(dN[4] >= 10) { dN[4] -= 10; dN[5] += 1; } if(dN[5] >= 10) { dN[5] -= 10; } } } //显示当前温度 void Disp_TEM(void) { char Bai,Shi,Ge; //定义变量 Disp_Numb(Cur_TMP1); Bai=dN[5]; Shi=dN[4]; Ge =dN[3]; Disp_EN(1,6,table1[Bai]); Disp_EN(1,7,table1[Shi]); Disp_EN(1,8,table1[11]); Disp_EN(1,9,table1[Ge]); DelayNus(100); Disp_Numb(Cur_TMP2); Bai=dN[5]; Shi=dN[4]; Ge =dN[3]; Disp_EN(2,6,table1[Bai]); Disp_EN(2,7,table1[Shi]); Disp_EN(2,8,table1[11]); Disp_EN(2,9,table1[Ge]); DelayNus(100); Disp_Numb(Cur_TMP3); Bai=dN[5]; Shi=dN[4]; Ge =dN[3]; Disp_EN(3,8,table1[Bai]); Disp_EN(3,9,table1[Shi]); Disp_EN(3,10,table1[11]); Disp_EN(3,11,table1[Ge]); DelayNus(100); } //按键检测 uchar Keyscan() { uchar temp,key; P2DIR=0x00; temp=P2IN; if (temp==0x01) { DelayNus(10); if (temp==0x01) key=1; } if (temp==0x02) { DelayNus(10); if (temp==0x02) key=2; } if (temp==0x04) { DelayNus(10); if (temp==0x03) key=3; } else { DelayNus(10); } return key; } //主程序 int main(void) { WDTCTL=WDTPW+WDTHOLD; BCSCTL1 &= ~XT2OFF; _EINT();//打开全局中断 TACTL |= TASSEL_2 + ID_3; Ini_Lcd(); while(1) { GDWZ(); DS18B20_ReadTemp(); Cur_TMP1=uiData[0]; Cur_TMP2=uiData[1]; Cur_TMP3=uiData[2]; Disp_TEM(); key_number=Keyscan(); if (key_number==1) { if(Cur_TMP1<=10) { P3DIR = 0x05; P3OUT = BIT0+BIT2; Disp_HZ(4,4,table2[8]); Disp_HZ(4,5,table2[10]); } if(Cur_TMP1>10&&Cur_TMP1<20) { P3DIR = 0x01; P3OUT = BIT0; Disp_HZ(4,4,table2[11]); Disp_HZ(4,5,table2[12]); } else { P3DIR = 0x03; P3OUT = BIT0+BIT1; Disp_HZ(4,4,table2[8]); Disp_HZ(4,5,table2[9]); } } if(key_number==2) { if(Cur_TMP1<=20) { P3DIR = 0x05; P3OUT = BIT0+BIT2; Disp_HZ(4,4,table2[8]); Disp_HZ(4,5,table2[10]); } if(Cur_TMP1>20&&Cur_TMP1<30) { P3DIR = 0x01; P3OUT = BIT0; Disp_HZ(4,4,table2[11]); Disp_HZ(4,5,table2[12]); } else { P3DIR = 0x03; P3OUT = BIT0+BIT1; Disp_HZ(4,4,table2[8]); Disp_HZ(4,5,table2[9]); } } if (key_number==3) { if(Cur_TMP1<=30) { P3DIR = 0x05; P3OUT = BIT0+BIT2; Disp_HZ(4,4,table2[8]); Disp_HZ(4,5,table2[10]); } if(Cur_TMP1>30&&Cur_TMP1<40) { P3DIR = 0x01; P3OUT = BIT0; Disp_HZ(4,4,table2[11]); Disp_HZ(4,5,table2[12]); } else { P3DIR = 0x03; P3OUT = BIT0+BIT1; Disp_HZ(4,4,table2[8]); Disp_HZ(4,5,table2[9]); } } else { P3DIR = 0x01; P3OUT = BIT0; Disp_HZ(4,4,table2[11]); Disp_HZ(4,5,table2[12]); } Delay_Nms(1000); Clear_LCD(); } }

MSP430F169 定时器中断问题

新手求指教,小女子刚接触430,很多东西不懂,现在遇到难题了,望各位大神指点一下,不胜感激! 这段程序的中断能进去,但是貌似是跳不出来,执行到 while(1) 里面的 if(flagTrans==1) 就不执行了,程序哪部分写的不对啊 我的本意是想让while(1)死循环停下10秒的时间然后去干别的事情,然后再回到这个while循环 unsigned char flagTrans=0; unsigned char Second=0; void main(void) { WDTCTL=WDTPW+WDTHOLD; { P3OUT |= 0x20; P3DIR |= BIT4 + BIT5; P1OUT &= ~ 0x80; P1OUT |= 0x20; P1OUT |= 0x40; P1DIR |= BIT5 + BIT6+ BIT7; Init_duan(); setup(); Init_AD(); Init_TimerA(); main_12864(); } hanzi_danwei(); //初始化屏幕 hanzi_xianshi(); //屏幕显示函数 _EINT(); while(1) //完成显示和传输一个循环共用时间为5s左右 { if(flagTrans==1) { flagTrans=0; display_data(); transfer_data(); temp(); } } } #pragma vector = TIMERA0_VECTOR __interrupt void Timer_A(void) { Second++; if(Second>=10) { Second=0; flagTrans=1; } } 我的 Init_TimerA(); void Init_TimerA(void) { TACTL=TASSEL_1+ID_3+TACLR; //辅助时钟为计数源,8分频,增计数 CCTL0=CCIE; CCR0=4096; //1s TACTL |= MC0; }

用msp430完成一道题目

用msp430实现如下功能: 从p1口读入4个开关状态转换为16进制数,从p2口输出到数码管显示(共阴极) 要求: 1.求实现此功能的程序,并且逐行解释程序,越详细越好。 2.画出相应的硬件电路图。

MSP430F149定时器运用问题?

程序开始一直检测是否在充电,如果在充电,就让LED闪烁,否则循环检测。怎么实现? led闪烁就要循环了,那外层循环还有什么用啊? 求大神帮助

IAR写完程序烧进msp430为什么要用第三方软件?

直接用IAR烧写不行吗?和用第三方软件烧写区别在哪里呢?如果可以的话能详细说明一下程序烧写的原理吗?万分感谢!新人给不起悬赏。。。

编了一个MSP430f249捕获脉冲宽度的程序,没有捕获到数据,麻烦大神们帮忙看看

程序代码如下: main.c文件: /*定时器B测量某输入信号脉冲宽度*/ #include <msp430f249.h> #include"lcd.h" #define M1 10 unsigned int cap1,N1; long width[10]={0,0,0,0,0,0,0,0,0,0}; char m=0; char lcd_buf[]={0,0,0,0,0,0}; long data; const char table[]="0123456789"; const char table1[]="width(us)"; void data_to_buf(unsigned long data2)//值送显示缓冲区函数 { unsigned char i; for(i=0;i<6;i++) { lcd_buf[i]=table[data2%10];//此时低位在前 data2=data2/10; } for(i=5;i>0;i--) { if(lcd_buf[i]=='0') lcd_buf[i]=' ';//数字其那面的0不显示 else break; } } void main( void ) { char num,k1; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;//关闭看门狗 BCSCTL2=SELS+DIVS0+DIVS1;//SMCLK=XT2 P4SEL|=0x01;//P4.0作为捕获模块功能输入端输入方波 P5DIR=0xFF;//设置P5端为输出 P6DIR=0xFF;//设置P6端为输出 lcdinit(); //TBCCTL0=0;//捕获源为P4.0,即CCI0A(也是CCI0B) TBCCTL0|=CM_1+SCS+CAP+CCIE;//上升沿捕获,同步捕获,工作在捕获模式 //+终端允许 TBCTL|=TBSSEL_2+MC_2+TBIE;//选择SMCLK+连续计数模式 //+终端允许 write_com(0x80);//显示第一行字 for(num=0;num<10;num++) write_data(table1[num]); _EINT();//中断允许 while(1) { data=0; for(k1=0;k1<M1;k1++) data+=width[k1]; data=data/M1; //data=10000; if(m==0) { data_to_buf(data);//数据送显示缓冲区 write_com(0x80+0x40);//第二行显示频率 for(num=0;num<6;num++) write_data(lcd_buf[5-num]); } } } #pragma vector=TIMERB0_VECTOR __interrupt void TimerB0(void)//定时器TB的CCR0的中断,用于检测脉冲上升与下降 { if(TBCCTL0&CM1)//捕获到下降沿 { width[m++]=65536*N1+TBCCR0-cap1;//记录下结束时间 N1=0; TBCCTL0=CM_1+SCS+CAP+CCIE;//+TBCLR; //改为上升沿捕获,CM1置0,CM0置1 if(m==M1) m=0; } else if(TBCCTL0&CM0)//捕获到上升沿 { cap1=TBCCR0; N1=0; TBCCTL0=CM_2+SCS+CAP+CCIE;//+TBCLR; //改为下降沿捕获,CM0置0,CM1置1 } } //Timer_B7 Interrupt Vector(TBIV) handler #pragma vector=TIMERB1_VECTOR __interrupt void Timer_B(void) { switch(TBIV) { case 14:N1++;break;//溢出 } } lcd.c文件: #include<msp430f169.h> #define lcdrs_0 P6OUT&=~BIT0;//P6.0=0命令 #define lcdrs_1 P6OUT|=BIT0;//P6.0=1 #define lcden_0 P6OUT&=~BIT2;//P6.2=0 #define lcden_1 P6OUT|=BIT2;//P6.2=1 void delay(unsigned int z) { unsigned int i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void write_com(char com) //写入 { lcdrs_0;//LCD选择输入命令 P5OUT=com;//向P0端口输入命令 delay(5);//延时 lcden_1;//打开LCD使能 delay(5);//一个高脉冲 lcden_0;//关闭LCD使能 } void write_data(char dataout) { lcdrs_1;//设置为输入数据 P5OUT=dataout;//将数据赋给P0端口 delay(5);//延时 lcden_1;//置高 delay(5);//高脉冲 lcden_0;//置低,完成高脉冲 } void lcdinit() { lcden_0; write_com(0x38);//设置16X2显示5X7点阵,8位数据接口 write_com(0x0c);//设置开始显示,不显示光标 write_com(0x06);//写一个字符后地址指针加1 write_com(0x01);//显示清零,数据指针清零 } lcd.h文件: extern void delay(unsigned int z); extern void write_com(char com); extern void write_data(char dataout); extern void lcdinit(); 仿真结果如下: ![图片说明](https://img-ask.csdn.net/upload/201504/06/1428309208_679265.png) 在单片机上试结果一样没有。

大神们求助关于msp430f5529

求一个基于msp430f5529的贪吃蛇和走迷宫的小游戏代码(>﹏<)(>﹏<)(>﹏<)(>﹏<)

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

阿里面试官让我用Zk(Zookeeper)实现分布式锁

他可能没想到,我当场手写出来了

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

立即提问
相关内容推荐