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

📄 text1.c

📁 基于C8051F020单片机的计算器实现。有键盘
💻 C
字号:

#include "c8051f020.h"


sbit key_key = P3^6;
sbit Clock_7281 = P3^5;
sbit Data_7281 = P3^4;

unsigned char Timer3Counter1;
unsigned char key_value[8]={0};
unsigned char key_value1[8];
unsigned char add[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char  add1[8]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
bit key_flag;


//外部中断6(键盘用)
void ExtentInt6 (void) interrupt 18 {
	P3IF &= 0XBF;
	key_flag = 1;
}
//定时器3中断
void Timer3Int(void) interrupt 14 {
	TMR3CN &= 0X7F;	//清中断标志
	Timer3Counter1++;
}
/******************** 系统函数 ********************/
// 端口初始化
void PortInitialization ( void ) {
//*******************************//
//PXDIN : 0=模拟输入;1=数字输入.//
//*******************************//
//*******************************//
//PXDOUT : 0=漏极开路;1=推挽输出.//
//*******************************//
	
	XBR0 = 0X00;
	XBR1 = 0X00;		//
	XBR2 = 0X00;		//关闭弱上拉

	EMI0CN = 0;	  		//
	EMI0CF = 0X2c;	 	//外部存储器高端复用方式
	EMI0TC = 0Xcf;		//时序选择,地址建立时间很重要哦

	P3MDOUT = 0X20;		// 
	P3 = 0X70;			//
	XBR2 = 0X40;		//交叉开关使能

	P74OUT = 0XFF; 		//推挽输出,总线上都接上拉电阻;
					//如果漏开则不行因为1将其置为高阻
}
// 将系统时钟设置为外部时钟 24 MHZ 
void ExternalClock ( void ) {
	unsigned int i;
	OSCXCN    = 0x67;				// 定义外部时钟,并使能
    for (i = 3000;i > 0;i--);		// 等待 1 ms,使外部时钟稳定
    while ((OSCXCN & 0x80) == 0);	// 检测时钟准备好标志
    OSCICN  = 0x08;				// 禁止内部时钟,选择外部时钟
}

 void ExternIntInit(void){  //外部中断初始化
	 
	 P3IF = 0X00;	//下降沿触发,中断向量为18
	 EIE2 = 0X10;	//允许EX6中断
}

void Timer3Init(){			//定时器3初始化
	TMR3CN = 0X00;
	TMR3RLL = 0X30;			//1ms定时
	TMR3RLH = 0XF8;
	TMR3L = 0X30;
	TMR3H = 0XF8;
	EIE2 |= 0X01;			//ET3 = 1;
}

void Delay ( unsigned int n ) {
	for ( ; n > 0; n --);
}
//R=3K3,C=20PF,OSC=4.5MHz
//#pragma disable    					//关中断
void Write_7281 ( unsigned char ddata ) {
	unsigned char i;
	Data_7281 = 1;	//漏开置1
	Clock_7281 = 0;		//9us
	Clock_7281 = 1;
	do {							// 建立握手信号,发送一系列脉冲
		Clock_7281 = 0;
		Delay(6);
		Clock_7281 = 1;
		Delay(6);
	} while ( Data_7281 );			// 等待bc7281a 发送低电平,表示准备好

	Clock_7281 = 0;					// 15us内再发送一时钟信号
	Delay(6);
	Clock_7281 = 1;
	Delay(6);

	while ( !Data_7281 );			// Data_7281 回高电平
	for( i = 0; i < 8; i ++ ) {
		if ( ddata & 0x80 )			// 发送第7..0位
			Data_7281 = 1;
		else
			Data_7281 = 0;
			Delay(10);
		ddata = ddata << 1;			// 发送一时钟信号
		Clock_7281 = 0;	
		Delay(6);
		Clock_7281 = 1;
		Delay ( 6 );				// 延时
	}
	Data_7281 = 1;					// 回高电平
	Clock_7281 = 1;
	Delay ( 1 );
	}
	
	
	// bc7281a 字节读
	//#pragma disable    					//关中断
	unsigned char Read_7281 ( void ) {
	unsigned char i;
	unsigned char ddata =0 ;
	
	Data_7281 = 1;	//漏开置1

	Clock_7281 = 0;					// 发送一单一握手脉冲 25us
	Delay(6);
	Clock_7281 = 1;
	Delay(6);

	while ( Data_7281 );			// 等待bc7281a 发送低电平,表示准备好

	Data_7281 = 1;	//漏开置1
	Clock_7281 = 0;					// 15us内再发送一时钟信号 9us
	Delay(6);
 	Clock_7281 = 1;
 	Delay(6);

	for ( i = 0; i < 8; i ++ ) {
	Delay ( 20 );
		Data_7281 = 1;	//漏开置1
		ddata = ddata << 1;
		if ( Data_7281 )			// 接收第7..0位
			ddata = ddata | 0x01;
		Clock_7281 = 0;				// 15 us内发送一时钟信号
		Delay ( 10 );
		Clock_7281 = 1;
		Delay(10);
	}
	Clock_7281 = 0;					// 发送一时钟信号,表示接收完毕
	Delay ( 12 );
	Clock_7281 = 1;
	Delay ( 20 );
	return ddata;
}

void BC7281Init(){
	Write_7281 ( 0x12 );				// 写BC7281B工作模式寄存器
	Write_7281 ( 0x8e );				// 扫描使能,扩展开关,164模式,扩展闪烁模式,输出反向,键盘工作模式为' 1 '
	Write_7281 ( 0x11 );				// 写闪烁速度控制寄存器
	Write_7281 ( 0x80 );				// 闪烁频率 2 HZ
	Write_7281 ( 0x10 );				// 初始化时,不闪烁显示
	Write_7281 ( 0xFF );				// 1不闪烁
	Write_7281 ( 0x19 );
	Write_7281 ( 0xFF );
}
 min(unsigned char a,b,c,d){
	       unsigned char m;
		   m=a;
		   if(a>=b) m=b;
		   if(m>c) m=c;
		   if(m>d) m=d;
		   return( m);
	       }
zs(unsigned char j)
		{unsigned char i;
		 unsigned int m;
			m=1;
			for(i=0;i<j;i++)
			m*=10;
			return m;}
///////////////////////////////////////////////////
//主函数
void main(){
    unsigned char a,b,c,d, i,j,k,m,n,count1,count0,count2,count3,count4,read,k1[8],k2,m1;
	unsigned int x,y,z;
	
    n=0;a=0x10;b=0x10;c=0x10;d=0x10;count1=0;count2=0;count3=0;count4=0;count0=0;
    
	WDTCN = 0XDE;  	//禁止看门狗
	WDTCN = 0XAD;

	PortInitialization ();				// 初始化端口
	ExternalClock ();					// 起振外部时钟,使它成为系统时钟
	Timer3Init();
	ExternIntInit();
	BC7281Init();
	EA = 1;		//开总中断
	TMR3CN |= 0X04;	//启动定时器
	Write_7281(0x15);Write_7281(0x00);
	Write_7281(0x15);Write_7281(0x10);
	Write_7281(0x15);Write_7281(0x20);
	Write_7281(0x15);Write_7281(0x30);
	Write_7281(0x15);Write_7281(0x40);
	Write_7281(0x15);Write_7281(0x50);
	Write_7281(0x15);Write_7281(0x60);	  //hex译码,显示0
	Write_7281(0x15);Write_7281(0x70);		//hex译码,显示0*/
   	Delay(6);	
	while(1){
		if(key_flag == 1){
			key_flag = 0;
			Write_7281(0x13 | 0x80);
			Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);
    		Delay(6);Delay(6);
            
	   		read=Read_7281 ();                                  
        Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);Delay(6);
        n++; 
		m=min(a,b,c,d);
        switch(read)
		 {case 0x0f:{                               //F时所有有值复位
		             for(k=0;k<8;k++) {key_value[k]=0x00;
					                   key_value1[k]=0x00;
					                   k1[k]=0x00;}
                        n=0; read=0;
                        a=0x10;b=0x10;c=0x10;d=0x10;
                        k2=0;m1=0;
					    count1=0;count2=0;count3=0;count4=0;count0=0;
						x=0;y=0;z=0;
                        Write_7281(0x15);Write_7281(0x00);
						Write_7281(0x15);Write_7281(0x10);
						Write_7281(0x15);Write_7281(0x20);
						Write_7281(0x15);Write_7281(0x30);
						Write_7281(0x15);Write_7281(0x40);
						Write_7281(0x15);Write_7281(0x50);
						Write_7281(0x15);Write_7281(0x60);	
						Write_7281(0x15);Write_7281(0x70);	
						Write_7281 ( 0x10 );			
    	                Write_7281 ( 0xFF );			
                    }break;
          case 0x0a:{
		             if(count1!=1){a=n;count1++;k2=0x0a;}
					 else n--;
					 }break;
          case 0x0b:{
		             if(count2!=1){b=n;count1++;k2=0x0b;}
					 else n--;
					 }break;
          case 0x0c:{
		             if(count3!=1){c=n;count1++;k2=0x0c;}
					 else n--;
					 }break;
		  case 0x0d:{
		             if(count4!=1){d=n;count1++;k2=0x0d;}
					 else n--;
					 }break;

          case 0x0e:{
		             if(count0!=1){count0++;m1=n;
					             
                                  for(i=0;i<m-1;i++)x+=key_value[8-m1+m-i]*zs(i);
                                  for(i=0;i<=(m1-m-2);i++)y+=key_value[7-i]*zs(i);
								  if  (k2==0x0a) z=x+y;
								  if (k2==0x0b) z=x-y;
								  if (k2==0x0c) z=x*y;
								  if (k2==0x0d) z=x/y;
								  for(i=0;i<8;i++)
								  k1[7-i]=z/zs(i)%10;
				for(i=0;i<8;i++)
				 {Write_7281(add1[i]);Write_7281(add[k1[i]]);  }
				
				 
				 }else n--;
				 }break;										  				  
			
          default :{for(i=0;i<7;i++)
				           key_value[i]=key_value[i+1];
			               key_value[7] =read;
						   
						   if(m==0x10)for(j=0;j<8;j++)
			                {Write_7281(add1[j]);Write_7281(add[key_value[j]]);}
                           if(m!=0x10) {
						   
                         
                              for(i=0;i<7;i++)
				              key_value1[i]=key_value1[i+1];
			                  key_value1[7] =read;
                            
						     for(j=0;j<8;j++)
			                 {Write_7281(add1[j]);Write_7281(add[key_value1[j]]);}}

                    };
		 }

Delay(6);	Delay(6);Delay(6);Delay(6);Delay(6);	}}}

⌨️ 快捷键说明

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