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

📄 xians164old.c

📁 本程序针对74x164的LED显示驱动程序 2.I/O脚使用 io_74x164clk // 串行通信时钟
💻 C
字号:
 /*********************************************
1.功能:  本程序针对74x164的LED显示驱动程序
2.I/O脚使用
			io_74x164clk;  // 串行通信时钟,上升沿有效
			io_74x164data; // 串行数据,单向通信
			
3.调试环境:12M晶振(51系列12时钟模式)
			若为其他时钟则作如下修改:
					(1)
					(2)

3.程序大小(ROM估计):
				
4.数据大小(RAM估计):

5.运行时间(与调用函数有关):


***********************************************/
				

#ifdef   __XIANS164_DEBUG__

	#include<wywcomm.h>

	#include<reg51.h>

	sbit io_74x164clk =P0^7;  // 串行通信时钟,上升沿有效
	sbit io_74x164data=P0^6; // 串行数据,单向通信


	//此模块调用其它模块的外部变量和函数的声明(此程序无)


#else
 
	 #include  "system.h"	  //所有的项目用相同的系统头文件,但存放的路径不同,各自存放在对应的项目文件夹。


#endif


//此模块的宏定义(常数等)



//此模块必要的库函数包含(include)

#include<intrins.h>

#include<math.h>

//全局变量(静态或一般)的定义


	
//以下为函数定义



//***********写164************************
static void write(uint8 data *shu)
{
 int8 x,d;
  for(x=7;x >= 0;x--)
   { 
     uint8 i;
     i=shu[x];
     
     for(d=8;d>0;d--)
       {
		
		io_74x164clk=0;
	    
			if(i & 0x80) 	io_74x164data=1;
            else			io_74x164data=0;

        	i <<= 1 ;

		io_74x164clk=1;
		
        }	      
    } 
}
//****************清屏***************//


void v_74x164Ini_f(void) 
 {
   uint8 i;
   for(i=64;i>0;i--)
     { 
	
		io_74x164clk=0;
	
	   	io_74x164data=0;
       
       	io_74x164clk=1;   
       
     }             
  }



void v_74x164WriteNumber_f(uint8 xd,int16 shuju) 
//**************************************************************************************
//功能:	显示六位以下的带小数点的数字
//说明:    输入xd(16进制)x表示:指出个位显示位置,         取值范围:0~2。
//                          d表示:小数点相对数字的显示位置 ,取值范围:0~4。(超出范围不显示)
//	    输入shuju 表示:显示任意有符号16位整数,          取值范围:-32768~32767。
//***************************************************************************************
 {
  uint8 data u8_HuanCun8_a[8];
  uint8 x,d,k=0;
  uint16 i,j;
  bit  zf=1;
  uint8 code yima[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};/*0,1,2,3,4,5,6,7,8,9,-,*/

   x=xd>>4;   d=xd&0x0f;
  
   if(shuju >= 0)   zf=0;	
  
   j=abs(shuju);	 //取绝对值
   
   i = j/10000;
   j = j%10000;
   
   if(i|(d==4)) {u8_HuanCun8_a[x+4] = yima[i]; k++;}
   else          u8_HuanCun8_a[x+4] = 0;
   
   i = j/1000;
   j = j%1000;
   
   if(i|k|(d==3)) {u8_HuanCun8_a[x+3] = yima[i];k++;} 
   else            u8_HuanCun8_a[x+3] = 0;
   
   i = j/100;
   j = j%100;
   
   if(i|k|(d==2)) {u8_HuanCun8_a[x+2] = yima[i];k++;} 
   else            u8_HuanCun8_a[x+2] = 0;
   
   i = j/10;
   j = j%10;
   
   if(i|k|(d==1)) {u8_HuanCun8_a[x+1] = yima[i];k++;} 
   else            u8_HuanCun8_a[x+1] = 0;
   
   u8_HuanCun8_a[x] = yima[j]; k++;
   
   //????if(k != 5) 
   u8_HuanCun8_a[x+5] = 0;       //判断写入负号
   if(zf)         u8_HuanCun8_a[x+k] = 0x02;
   
  if(d < 5 )  u8_HuanCun8_a[x+d] |= 1;      //写入小数点  
   write(u8_HuanCun8_a);     //写入
 } 



void v_74x164WriteOneSegment_f(uint8 x,bit xians_bz)
//x表示:指出段显示的地址(取值范围:0~63)										  
//xians_bz表示:该段是亮还是灭,“0”表示亮,“1”表示灭,取值范围:0~1
{ 
  uint8 data u8_HuanCun8_a[8];
  switch(x%8)
  {
   case 0:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0x7e;//灭
           else         u8_HuanCun8_a[x/8] |= 0x80;//亮
           break;}
   case 1:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xbe;
           else         u8_HuanCun8_a[x/8] |= 0x40;
           break;}        
   case 2:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xde;
           else         u8_HuanCun8_a[x/8] |= 0x20;
           break;}
   case 3:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xee;
           else         u8_HuanCun8_a[x/8] |= 0x10;
           break;}        
   case 4:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xf6;
           else         u8_HuanCun8_a[x/8] |= 0x08;
           break;}        
   case 5:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfa;
           else         u8_HuanCun8_a[x/8] |= 0x04;
           break;}        
   case 6:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfc;
           else         u8_HuanCun8_a[x/8] |= 0x02;
           break;}        
   case 7:{if(xians_bz) u8_HuanCun8_a[x/8] &= 0xfe;
           else         u8_HuanCun8_a[x/8] |= 0x01;
           break;}        
   }
   write(u8_HuanCun8_a);
}        
           
           
           
           
           
void v_BC7281AWriteOneDig_f(uint8 reg_add,uint8 write_data)
//reg_add 表示:指出位显示的地址(取值范围:0~15)
//write_data	表示:写入的数据(不译码)
{ 
  uint8 data u8_HuanCun8_a[8];
  u8_HuanCun8_a[reg_add] = write_data;
  write(u8_HuanCun8_a);
}





#ifdef   __XIANS164_DEBUG__

void main()
{ 
  v_74x164Ini_f();
  
  v_BC7281AWriteOneDig_f(7,0xff);
   
  v_74x164WriteNumber_f(0x14,-4560) ;
  v_74x164WriteNumber_f(0x21,-40) ;
  v_74x164WriteNumber_f(0x00,-450) ;
  v_74x164WriteNumber_f(0x04,-4560) ;
  v_74x164WriteNumber_f(0x35,-40) ;
  v_74x164WriteNumber_f(0x41,-450) ;
  
  v_BC7281AWriteOneDig_f(7,0x00);
  
  v_BC7281AWriteOneDig_f(6,0x0f);
  
  v_BC7281AWriteOneDig_f(4,0xfe);
  
  v_74x164WriteOneSegment_f(24,0);
  
  v_74x164WriteOneSegment_f(0,1);
  v_74x164WriteOneSegment_f(0,0);
  
    v_74x164WriteOneSegment_f(63,0);
  
while(1) ;
}

#endif

⌨️ 快捷键说明

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