专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

pic标准串口和模拟串口4位74hc595动态数码管显示程序

作者:佚名   来源:本站原创   点击数:  更新时间:2008年10月03日   【字体:

 /*--------------------------------------------------------------------------------
  ★★ 标准串口和模拟串口4位74hc595动态数码管显示程序 ★★
  1.CPU :16F873单片机  晶振4MHz
  2.在proteus上仿真通过,4位数码管动态扫描计数,非常的实用。
  3. 测试时将部分语句屏蔽
  4. 74hc595与164的差别在于有数据存储器,控制端为1时数据才能被传出    
  5.日期:2007-11-11
  6.所有代码以及仿真文件请点此出下载http://www.51hei.com/ziliao/file/16f87_595.rar
---------------------------------------------------------------------------------*/
#include <pic.h>
#include <pic1687x.h>
__CONFIG(WDTDIS & HS & UNPROTECT);
unsigned char  dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //共阴极字型码
unsigned char distab[4]={ 0xf7, 0xfb, 0xfd, 0xfe}; //要显示的位
unsigned char disbuf[4];

bit DAT @ (unsigned)&PORTC*8+5;   //绝对寻址位操作指令:对应bit0~7共8位
bit CLK @ (unsigned)&PORTC*8+3;
bit ST_CP @ (unsigned)&PORTC*8+2; //bit2

//#define  DAT  RC5;
//#define  CLK  RC3;
//#define  ST_CP  RC2;

unsigned char data;
//1ms延时子程序//
void delay(unsigned char ms_delay)
 {
  unsigned int count=100*ms_delay;
  while(--count)
    {;}
   }

//模拟串口//
/*
 void send(unsigned char da)
  {
  unsigned char k;
   for(k=0;k<8;k++)
       {
         DAT=da&0x01;//从低位开始逐一移出(与线路有关,这是段A对应QG),595的时序是从D0逐步到D7.移完8次后整体再向下(bit)
         da>>=1;
         CLK=0;
         CLK=1;
          }
     } */
   
  //显示函数,先分离再显示//
 void display(unsigned int tmp)
 { 
 unsigned char i; 
 disbuf[0]=tmp%10;  
    tmp/=10;
    disbuf[1]=tmp%10;
    tmp/=10;
    disbuf[2]=tmp%10;
    disbuf[3]=tmp/10;
    for(i=0;i<4;i++)
 {
        if(SSPIF)SSPIF=0;  //等待发送完毕
  ST_CP=0;
    // send(dispcode[disbuf[i]]);  //模拟串口
   SSPBUF=dispcode[disbuf[i]];  //标准串口
      delay(1);  //不加延时标准串口千位变个位 
  ST_CP=1;  //最后给锁存信号,代表显示任务完成
    PORTB=distab[i];
    delay(1);  //决定刷新频率
       PORTB=PORTB|0xff;  //传完后关闭当前显示位(不然显示不全),同时不影响没有用到的端口
   } 
 }


   //主函数51hei.com提供//
 void main()
 { 
   unsigned int k;
   
   TRISC=0;    //两种定义方式
  // TRISC3=0;     //SCK时钟输出引脚。
   //TRISC5=0;     //串行数据输出引脚。

   TRISB=0;

  //SSPIE=1;  //这些是中断有关的
  //GIE=1;
 //PEIE=1;

 PIR1=0;   //清SPI标志
 //INTCON=0x00;   //*关闭所有中断*/
 SSPSTAT=0xc0;  //SCK上跳沿数据传送。
 SSPCON=0x20;  //主控方式,空闲时时钟为低电平,时钟为:Fosc/4,模拟、标准分开
 
   for(k=0;k<9999;k++)
   {
      delay(40);
    display(k);
  }
 }

//串口中断//
/*
void interrupt recceive_sth (void)
{
 SSPIF=0;
 
}*/
 

关闭窗口