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

📄 c8051f0236weishumaguan.c

📁 六位数码管扫描显示程序
💻 C
字号:
#include<stdio.h>
#include "C8051F020.h"
/*
sbit  D0=P3^0;
sbit  D1=P3^1;
sbit  D2=P3^2;
sbit  D3=P3^3;//D0——D3是要显示的数字
sbit  DP=P3^4;
sbit  A0=P3^5;
sbit  A1=P3^6; 
sbit  A2=P3^7;//A0——A2 用做3 8译码器输入,用来扫描六位共阴极数码管的位选择信号

  
*/
bit flagq=0;
bit flagb=0;
unsigned int temp ,key ; 
unsigned char code DIS_DAT[10]={0x0,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; 
unsigned char code DIS_BIT[6]={0x00,0x20,0x40,0x60,0x80,0xa0};
static  char  M=0,N=0;

void DataDish(unsigned int dataTmp)	;	
void DataDisHH(unsigned int dataTmp) ;
void keyscan();
void delay(int m) ;
void Port_IO_Init() ;
void Oscillator_Init()  ;
void Init_Device();	 
void Timer_Init();

main()
{ 	
  Init_Device();
  Timer_Init();
  TH0=252;
  TL0=250;  
  TR0=1	;
  EA=1; 


   while(1)
  {	      		
    DataDis(895);
  }
}

  
 void DataDish(unsigned int dataTmp)
  {
    switch(M)
	{
	 case 0:  
			  
	          P3=P3&0xf0|0x0A;DP=0;	 //显示字符h
	          P3 = P3&0x1f|DIS_BIT[0]; break;//选通最高位数码管  
	 case 1:  
			  P3 = P3|0x0f;DP=0;		  //不显示,常熄灭
	          P3 = P3&0x1f|DIS_BIT[1];break;  //选通次高位数码管
			   
	 case 2:  if(dataTmp/1000==0)
	            {flagq=1;P3=P3|0x0f;DP=0;}	//千位是零则熄灭不点亮
	 		   else
	            {P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;flagq=0;}	//要显示的千位数字
	           P3 = P3&0x1f|DIS_BIT[2];break;//选通千位数码管
			   
	 case 3:  if(flagq==1&&dataTmp/100==0) 
	            {flagb=1;P3=P3|0x0f;DP=0;}	//百位是零且千位也是零则熄灭不点亮
			  else 
	            {P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;flagb=0;} // 要显示的百位数字
		   	  P3 = P3&0x1f|DIS_BIT[3];break; //选通百位数码管
	 case 4: if(flagb==1&&dataTmp/10==0) 
	            {P3=P3|0x0f;DP=0;} // 十位是零、百位是零且千位也是零则熄灭不点亮
			  else
	            P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;   // 要显示的十位数字
	          P3 = P3&0x1f|DIS_BIT[4];break;//选通十位数码管
			   
	 case 5:  P3 =  P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;  // 要显示的个位数字
	           P3 = P3&0x1f|DIS_BIT[5];break;//选通个位数码管
	
	 default:  break; 
	}
 }
 


  
void Port_IO_Init()
{
    XBR0    = 0x05;
    XBR2    = 0x40;
	P1MDOUT = 0xff;
	P3MDOUT = 0xff;
	P1 = 0xff;
	P3 = 0xff;
}

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x08;
}


void Init_Device(void)

{
    Port_IO_Init();
    Oscillator_Init();
}


void Timer_Init()
{
    EA=0; 
    TF0=0;
	TR0=0;
    TMOD    = 0x01;
	TH0=252;
	TL0=250;
	ET0=1 ;
	EA=1;

}

void int0_ISR() interrupt  1	 //定时器用做数码管的位选择扫描定时
{
	TH0=252;
	TL0=250;  
	if(M>=5)
	  M=0;
	else
	  M++;
}

⌨️ 快捷键说明

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