⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f873_595.c

📁 标准串口和模拟串口4位595动态数码管显示程序,用C语言
💻 C
字号:
 /*--------------------------------------------------------------------------------
  ★★ 标准串口和模拟串口4位595动态数码管显示程序 ★★
  1.CPU :16F873  晶振4MHz 
  2.在proteus上仿真通过
  3. 测试时将部分语句屏蔽
  4. 595与164的差别在于有数据存储器,控制端为1时数据才能被传出     
  5.日期:2007-11-11 
---------------------------------------------------------------------------------*/
#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;	 //传完后关闭当前显示位(不然显示不全),同时不影响没有用到的端口
	  }  
	}


   //主函数//
 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;
  
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -