2207|0

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

MSP430学习笔记6-动态数码管的显示 [复制链接]

这个程序主要部分是我改写的,程序把看门狗当做普通定时器使用,在看门狗中断中进行数码管扫描,另外我加入了显示的缓冲区,想在数码管上显示什么数字只需要对缓冲数组中的值进行操作即可。最后加入了小数点的操作,可以很方便的加入小数点,程序如下:
/**********************************************
程序功能:在八位数码管上显示任意数字
-----------------------------------------------
拨码开关设置:将SMG位拨至ON,其余拨至OFF
测试说明:观察数码管显示
***********************************************/
#include  
typedef unsigned char uchar;

//数码管7位段码:0--f
uchar scandata[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
                      0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//段码
uchar dispbitcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//将端口的片选信号编码
uchar disbuf[8] = {8,8,1,3,1,9,4,2};//存放要显示的数据
//记录显示位数的全局变量
uchar cnt = 0;//用来扫描计数
uchar dotn = 2;//用来选择第几位后面显示小数点

/********************主函数********************/
void main(void)
{
    /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;

    //这里面看门狗用作普通的定时器,要来对数码管进行动态扫描,如果看门狗有其他作用
    //可以用定时器代替
    WDTCTL = WDT_ADLY_1_9;        // 设置内部看门狗工作在定时器模式,1.9ms中断一次
    //可以去看头文件中具体的配置,这里使用的手表晶振64分频计算可得是1.9ms
    IE1 |= WDTIE;                 // 使能看门狗中断

    P6DIR |= BIT2;P6OUT |= BIT2;  //关闭电平转换

    P5DIR = 0xff;                 //设置P4,P5的IO方向为输出
    P4DIR = 0xff;                 

    P5OUT = 0x00;                 //设置P4,P5的输出初值
    P4OUT = 0xff;

    _BIS_SR(LPM3_bits + GIE);     //CPU进入LPM3低功耗模式,同时打开全局中断
    //这个地方要注意LPM3低功耗模式下其他时钟源是关闭的,只能使用ACLK时钟源
}

/*******************************************
函数名称:watchdog_timer
功    能:看门狗中断服务函数,在这里输出数码管的
          段选和位选信号
参    数:无
返回值  :无
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    P4OUT = 0xff;
    uchar temp;
     if(cnt == (dotn-1))//判断要不要显示小数点
    {
      temp = scandata[disbuf[cnt]]&0x7F;//如果要显示的就将要显示的段码先进行一步运算
      P5OUT = temp;
    }
    else
    P5OUT = scandata[disbuf[cnt]];        //输出段选信号
    P4OUT ^= dispbitcode[7-cnt];           //输出位选信号由于用了三极管驱动,实际是低电平选通因此翻一下。
    //发现显示的顺序是倒着的,减一下把顺序正过来
    cnt++;                        //位计数变量在0~8之间循环
    if(cnt == 8) cnt = 0;


}
 
点赞 关注
个人签名

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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