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

📄 main_new.c

📁 ADI公司ADuC841单片机源程序。 I2C.c: ADuC841单片机I2C接口函数。 kei841.h: ADuC841单片机内部寄存器定义。 delay.c:精确延时资函数。 main
💻 C
字号:
// 0 外部中断0  	 	IE0        		0003H
// 1 定时器/计数器		TF0   			000BH	
// 2 外部中断1	  	 	IE1				0013H
// 3 定时器/计数器1 	TF1     		001BH
// 4 串行口				RI+TI			0023H
// 5 定时器/计数器2     TF2+EXF2    	 002BH;
// 6 ADCI    							0033H;
// 7 ISPI/I2CI   						003BH;
// 8 PSMI   							 0043H;
// 9 TII								0053H;
// 10 WDS 								005BH;


#include<kei841.h>
#include<delay.h>
#include<I2C.h>

#define SAA1_WRITE_ADDR     0x70    //右边 
#define SAA2_WRITE_ADDR     0x76    //左边

#define SAA1_READ_ADDR      0x71	//u3
#define SAA2_READ_ADDR      0x77	//u4

#define SAA_WORK_MODE_ALLON       0x77    //动态
#define SAA_WORK_MODE_ALLOFF	  0x71    //全灭


char code LED_TABLE[]={
//0	  1    2    3    4    5	 	6	 7	 8	  9    
0x7E,0x12,0xBC,0xB6,0xD2,0xE6,0xEE,0x32,0xFE,0xF2,
//A   B    C    D    E    F    .	L
0xFA,0xCE,0x6C,0x9E,0xEC,0xE8,0x01,0x4C
};



char code values[64][2]={//正弦数据DAC
	{0x07, 0xFF},{0x08, 0xC8},{0x09, 0x8E},{0x0A, 0x51},{0x0B, 0x0F},
	{0x0B, 0xC4},{0x0C, 0x71},{0x0D, 0x12},{0x0D, 0xA7},{0x0E, 0x2E},
	{0x0E, 0xA5},{0x0F, 0x0D},{0x0F, 0x63},{0x0F, 0xA6},{0x0F, 0xD7},
	{0x0F, 0xF5},{0x0F, 0xFF},{0x0F, 0xF5},{0x0F, 0xD7},{0x0F, 0xA6},
	{0x0F, 0x63},{0x0F, 0x0D},{0x0E, 0xA5},{0x0E, 0x2E},{0x0D, 0xA7},
	{0x0D, 0x12},{0x0C, 0x71},{0x0B, 0xC4},{0x0B, 0x0F},{0x0A, 0x51},
	{0x09, 0x8E},{0x08, 0xC8},{0x07, 0xFF},{0x07, 0x36},{0x06, 0x70},
	{0x05, 0xAD},{0x04, 0xEF},{0x04, 0x3A},{0x03, 0x8D},{0x02, 0xEC},
	{0x02, 0x57},{0x01, 0xD0},{0x01, 0x59},{0x00, 0xF1},{0x00, 0x9B},
	{0x00, 0x58},{0x00, 0x27},{0x00, 0x09},{0x00, 0x00},{0x00, 0x09},
	{0x00, 0x27},{0x00, 0x58},{0x00, 0x9B},{0x00, 0xF1},{0x01, 0x59},
	{0x01, 0xD0},{0x02, 0x57},{0x02, 0xEC},{0x03, 0x8D},{0x04, 0x3A},
	{0x04, 0xEF},{0x05, 0xAD},{0x06, 0x70},{0x07, 0x36}};

unsigned int  SINE_DAC_COUNT=0;



char xdata KEY_GET=0;
char xdata KEY_GET_PRE4=0; 
char xdata KEY_GET_PRE3=0; 
char xdata KEY_GET_PRE2=0;
char xdata KEY_GET_PRE1=0;


void  LED_SHOW_ON_LEFT(DATA1,DATA2,DATA3,DATA4);
void  LED_SHOW_ON_RIGHT(DATA1,DATA2,DATA3,DATA4);
void  LED_SHOW_OFF_LEFT(void);
void  LED_SHOW_OFF_RIGHT(void);



void  external_int0(void) interrupt 0{ //键盘检测中断程序 IE0 cleared by hardware
//	  EA=0;                          
	  P03=1;   //LED提示有键按下。
	  P2=0xFF;
	  delay2(255,255);  
	  P20=0;
	  P21=1;	  
	  P22=1;
	  P23=1;		
	  if(P24==0) KEY_GET=0x01;
	  	else if(P25==0)  KEY_GET=0x02;
			 else if(P26==0)  KEY_GET=0x03;
	       		else if(P27==0)  KEY_GET=0x0f;

	  P20=1;
	  P21=0;	  
	  P22=1;
	  P23=1;		
	  if(P24==0) KEY_GET=0x04;
	  	else if(P25==0)  KEY_GET=0x05;
			 else if(P26==0)  KEY_GET=0x06;
	       		else if(P27==0)  KEY_GET=0x0E;

	  P20=1;
	  P21=1;	  
	  P22=0;
	  P23=1;		
	  if(P24==0) KEY_GET=7;
	  	else if(P25==0)  KEY_GET=8;
			 else if(P26==0)  KEY_GET=9;
	       		else if(P27==0)  KEY_GET=0x0D;

	  P20=1;
	  P21=1;	  
	  P22=1;
	  P23=0;		
	  if(P24==0) KEY_GET=0x0A;
	  	else if(P25==0)  KEY_GET=0;
			 else if(P26==0)  KEY_GET=0x0B;
	       		else if(P27==0)  KEY_GET=0x0C;

	  KEY_GET_PRE4=KEY_GET_PRE3;
	  KEY_GET_PRE3=KEY_GET_PRE2;
	  KEY_GET_PRE2=KEY_GET_PRE1;
	  KEY_GET_PRE1=KEY_GET;

	  LED_SHOW_ON_LEFT(LED_TABLE[KEY_GET_PRE4],LED_TABLE[KEY_GET_PRE3],LED_TABLE[KEY_GET_PRE2],(LED_TABLE[KEY_GET_PRE1])|0x01);
	  P2=0xF0;

	  delay3(255,255,23); 
	  while((P2&0xf0)!=0xf0){};  //等待键抬起		  	  
	  IE0=0;
	  P03=0;
//	  EA=1;
	}




void  timer0(void) interrupt 1{

	}



void UART_INT(void){
   		TI=0;
		RI=0;
    }



void  timer2(void) interrupt 5{ //1ms interrupt
      TF2=0;   //清标志位
	  DACCON = 0x7B; 	
		if(++SINE_DAC_COUNT>63) SINE_DAC_COUNT=0;
			DAC0H = values[SINE_DAC_COUNT][0];
			DAC0L = values[SINE_DAC_COUNT][1];
	  DACCON = 0x7F; //同步

	}



void ADC_INT() interrupt 6{
			//	EA=0;
			    LED_SHOW_ON_RIGHT(LED_TABLE[(ADCDATAH>>4)&0x0f],
							  LED_TABLE[ADCDATAH&0x0f],
							  LED_TABLE[(ADCDATAL>>4)&0x0f],  
							  LED_TABLE[ADCDATAL&0x0f]
                              );
				SBUF=ADCDATAH;
				delay2(255,128);
				SBUF=ADCDATAL;
				delay2(255,128);
				SBUF=0x00;
    		//	EA=1;
	}



void  LED_SHOW_ON_LEFT(DATA4,DATA3,DATA2,DATA1){
		I2C_STRAT();	 
		I2C_SendData(SAA2_WRITE_ADDR);    
		I2C_SendData(0x00);		
		I2C_SendData(SAA_WORK_MODE_ALLON);
		I2C_SendData(DATA2);      	//左2
		I2C_SendData(DATA1);      	//左1
		I2C_SendData(DATA4);	 	//左4
		I2C_SendData(DATA3);      	//左3    4高位1低位
		I2C_STOP();
 		delay2(255,12);	
	}

void  LED_SHOW_ON_RIGHT(DATA4,DATA3,DATA2,DATA1){
		I2C_STRAT();
		I2C_SendData(SAA1_WRITE_ADDR);
		I2C_SendData(0x00);	
		I2C_SendData(SAA_WORK_MODE_ALLON);
		I2C_SendData(DATA2);	 	//右2
		I2C_SendData(DATA1);	 	//右1
		I2C_SendData(DATA4);  		//右4
		I2C_SendData(DATA3);  		//右3    4高位1低位
		I2C_STOP();
        delay2(255,12);
	}

void  LED_SHOW_OFF_LEFT(){
		I2C_STRAT();	 
		I2C_SendData(SAA2_WRITE_ADDR);    
		I2C_SendData(0x00);		
		I2C_SendData(SAA_WORK_MODE_ALLOFF);
		I2C_SendData(0);      	//左3
		I2C_SendData(0);      	//左4
		I2C_SendData(0);	 	//左1
		I2C_SendData(0);      	//左2    左--右-->1--4
		I2C_STOP();
 		delay2(255,12);	
	}



void  LED_SHOW_OFF_RIGHT(){
		I2C_STRAT();
		I2C_SendData(SAA1_WRITE_ADDR);
		I2C_SendData(0x00);	
		I2C_SendData(SAA_WORK_MODE_ALLOFF);
		I2C_SendData(0);	 	//右3
		I2C_SendData(0);	 	//右4
		I2C_SendData(0);  		//右1
		I2C_SendData(0);  		//右2    左--右-->1--4
		I2C_STOP();
        delay2(255,12);
	}




void main(void){
	char i=0;
   
    CFG841= 0x41;       //xram enable  
 	P0    = 0;
	EA	  = 1;

	TMOD = 0x31;       //timer0 16bit timer ;timer1 is stopped;
	TR0  = 1;
//	ET0  = 1;
//	PT0  = 1;

	RCAP2L = 0xa8;     //timer2 16bit timer; 1ms interrupt;
	RCAP2H = 0xD4;
	TR2    = 1;	
	ET2    = 1;	
	
	P2  = 0xF0;       //键盘设置   低四位输出低高四位输出高 检测高四位电平 
	IT0 = 1;		  //沿中断
	EX0 = 1;          //开外部中断0
	PX0 = 0;		  //高级优先级
			  

	I2C_MasterMode();

	KEY_GET_PRE4=8;
	KEY_GET_PRE3=8;
	KEY_GET_PRE2=8;
	KEY_GET_PRE1=8;
	LED_SHOW_ON_LEFT(LED_TABLE[8],LED_TABLE[8],LED_TABLE[8],LED_TABLE[8]);





	ADCCON1 = 0xD8; //core clock devided by 8;
				    //3 acquisition adc clock
				    //timer overflow flag start ADC
    ADCCON2 = 0x00; //channel 0; single conversion
	ADCCON3 = 0x00; //
	EADC    = 1;   //开中断



		     
                     
	
   	T3CON = 0xC8;  //串口设置 启用定时器3    波特率9600  
	T3FD  = 0x08;
	SCON  = 0x70;   //8bit 串口
//	ES    = 1;      //开启 串口中断
	

	while(1){	
			DAC0H = values[SINE_DAC_COUNT][0];
			DAC0L = values[SINE_DAC_COUNT][1];
	 			  SCONV=1;	
			delay3(255,255,56);
			LED_SHOW_OFF_LEFT();
			delay3(255,255,56);	
			LED_SHOW_ON_LEFT((LED_TABLE[KEY_GET_PRE4])|0x01,
							 (LED_TABLE[KEY_GET_PRE3])|0x01,
                             (LED_TABLE[KEY_GET_PRE2])|0x01,
                             (LED_TABLE[KEY_GET_PRE1])|0x01
                            ); 
        
  	}
}

⌨️ 快捷键说明

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