首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MSP430学习笔记6-动态数码管的显示

MSP430学习笔记6-动态数码管的显示

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

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

  • /********************主函数********************/
  • voidmain(void)
  • {
  • /*下面六行程序关闭所有的IO口*/
  • P1DIR=0XFF1OUT=0XFF;
  • P2DIR=0XFF2OUT=0XFF;
  • P3DIR=0XFF3OUT=0XFF;
  • P4DIR=0XFF4OUT=0XFF;
  • P5DIR=0XFF5OUT=0XFF;
  • P6DIR=0XFF6OUT=0XFF;

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

  • P6DIR|=BIT26OUT|=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
  • 功能:看门狗中断服务函数,在这里输出数码管的
  • 段选和位选信号
  • 参数:无
  • 返回值:无
  • ********************************************/
  • #pragmavector=WDT_VECTOR
  • __interruptvoidwatchdog_timer(void)
  • {
  • P4OUT=0xff;
  • uchartemp;
  • 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;


  • }
返回列表