当前位置:首页 > 单片机 > 单片机
[导读]//******************************************************************************// 测试MSP430单片机向FLASH中写入操作//// 描述; 每次掉电或复位后都能看到数码管上显示的数值增1,说明对flash的写入与读取成功

//******************************************************************************
// 测试MSP430单片机向FLASH中写入操作
//
// 描述; 每次掉电或复位后都能看到数码管上显示的数值增1,说明对flash的写入与读取成功
//
// 注意:修改flash中的内容必须首先执行擦除操作,
// 因为对FLASH的操作只能将1写成0,而不能将0写成1只有擦除才能将0写回1
// 擦除操作至少将擦除1个段
//
// 如果使用其它型号的单片机,只需将头文件改为相应的;
// 并在Option的Target中的device改为相应的cpu即可。
//
// 硬件连接:如下图
// MSP430F13x
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P5.0|-->LED_DOUT
// | P5.2|-->LED_CLK
// | P5.4|-->LED_LATCH
//
//
// 硬件电路:MSP430F135核心实验板-I型 + TY-DIS1(8位数码管显示模块)
// 硬件连接:
//
// 调试器:MSP430FET全系列JTAG仿真器
// 调试软件: IAR Embedded Workbench Version: 3.41A 编译
//******************************************************************************

#include

////预定义函数//////////////////////////////////////////////////////////////////
void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//4位LED数码管显示子程序
void Led_out(unsigned char X);//74HC595串行输出子程序
void A16(unsigned int dd);// 16进制到4位10进制转换
const unsigned char LED_0_F[];//LED数码管段码转换表

void Flash_clr( int *Data_ptr );
void Flash_ww( int *Data_ptr, int word );
void Flash_wb( char *Data_ptr, char byte );

////变量定义////////////////////////////////////////////////////////////////////
unsigned char Buffer[4];

void main(void)
{
char *point,*readaa;// 定义2个指针,分别指向flash和变量aa
char aa;

//初始化IO口用于显示
P5DIR =0; //P5口全部设为输入口
P5SEL =0; //将P5口所有的管脚设置为一般I/O口
P5DIR |= BIT0; //将P5.0 P5.2 P5.4设置为输出方向
P5DIR |= BIT2;
P5DIR |= BIT4;

WDTCTL = WDTPW + WDTHOLD;//停止watchdog
_DINT();//对FLASH操作之前必须关闭中断

readaa=&aa;//读取变量aa的地址;
//在watch观察窗中可以通过readaa看到aa所在的地址及内容
point=(char*)0xcb10;//设置要读取的flash地址为“0xcb10”
//在watch观察窗中可以通过point看到0xcb10所在地址的内容
*readaa=*point;//将flash数据读入aa
aa=*point;//另一种将flash数据读入aa的方法

aa++;

Flash_clr((int*)0xcb00);//擦除0xcb00所在段,只有擦除才能将0写回1
Flash_wb((char*)0xcb10,aa);//向0xcb10写入新的aa(字节)


while(1)
{
A16(aa);
LED_595(Buffer[0],Buffer[1],Buffer[2],Buffer[3]);
}
}

//***FLASH操作类函数集**********************************************************
//-----------------------------------------------------------------
// Flash_wb
//-----------------------------------------------------------------
// 将1个字节(8 bit)写入到flash memory中
void Flash_wb( char *Data_ptr, char byte )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* WRT = 1 */
*Data_ptr=byte; /* program Flash word */
FCTL1 = 0x0A500; /* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//-----------------------------------------------------------------
// Flash_ww
//-----------------------------------------------------------------
// 将1个字节(16 bits)写入到flash memory中

void Flash_ww( int *Data_ptr, int word )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* WRT = 1 */
*Data_ptr=word; /* program Flash word */
FCTL1 = 0x0A500; /* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//-----------------------------------------------------------------
// Flash_clr
//-----------------------------------------------------------------
// 擦除1个段的flash memory
void Flash_clr( int *Data_ptr )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A502; /* ERASE = 1 */
*Data_ptr=0; /* erase Flash segment */
FCTL1 = 0x0A500; /* ERASE = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}

//***显示类函数集***************************************************************
//------------------------------------------------------
// 4位LED数码管显示子程序
//
// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据
//
void LED_595(char SMG1,char SMG2,char SMG3,char SMG4)
{
char z;
//最高位(最左侧)LED数码管显示---------------------
z = LED_0_F[SMG1];
Led_out(z); //段码输出
z = 0xFE; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;

//次高位(左数第2个)LED数码管显示---------------------
z = LED_0_F[SMG2];
Led_out(z); //段码输出
z = 0xFD; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;

//次低位(左数第3位)LED数码管显示---------------------
z = LED_0_F[SMG3];
Led_out(z); //段码输出
z = 0xFB; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;

//最低位(左数第4位)LED数码管显示---------------------
z = LED_0_F[SMG4];
Led_out(z); //段码输出
z = 0xF7; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;
}

//------------------------------------------------------
// 用于74HC595的LED串行移位子程序
//
// 人口参数:X——待输出的数据
//
void Led_out(unsigned char X)
{
unsigned char i;
for(i=8;i>0;i--)
{
if (X&0x80) P5OUT |=BIT0; else P5OUT &=~(BIT0);
X<<=1;
P5OUT &= ~(BIT2);//P5.2管脚输出低电平
P5OUT |= BIT2;//P5.2管脚输出高电平
}
}

//------------------------------------------------------ // LED段码转换表0——F //------------------------------------------------------const unsigned char LED_0_F[] = {// 0 1 2 3 4 5 6 7 8 9 A b c d E F 不显示 - o(18)H(19)h(20)C(21)0(22)n(23) 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab };


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭