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

📄 d51_new.c

📁 基于ARM编的9850,可以实现多种波形的输出与变换
💻 C
字号:
/*------------------------------------------------------------------------------
D51_new.C  

Copyright 1995-1999 Keil Software, Inc.
------------------------------------------------------------------------------*/
//#include <AT89S8252.H>            /* define AT89C51 registers */
//#include <AT89X51.H>            /* define AT89C51 registers */
#include <w77e58.H>            /* define w77e58 registers */
#include "ABSACC.H"
#include "D51_new.h"




void keyboard_int() interrupt IE0_VECTOR{		/* Keyboard Interrup*/
	uchar	s,key;
	s=STATUS8279;
	if(s & 0x0f){
		CTRL8279=0x40;
		key=DATA8279;
		s=((key & 0x18)>>1) | (key & 0x03);
		keyChar=KeyTab[s]; 
		keyNum=1;
	}
}

void timer0_int() interrupt TF0_VECTOR {
	EA=0;
	THG0++;
	LED_status=1;
	EA=1;
}

/*  Delay x ms	MAX 255ms for 11.0592MHz 8051CPU */
void delay(uchar ms){
	uchar i,j,k;
	for(i=0;i<ms;i++){
		for(j=0;j<4;j++){
			for(k=0;k<115;k++){}
		}
	}
}
void timer1_int() interrupt TF1_VECTOR {
	EA=0;
	THG=THG0;
	THGL=TH0*256+TL0;
	THG0=0;
	TH0=0;
	TL0=0;
	TH1=-NumberC/256;
	TL1=-NumberC%256;
	TSET=1;
	EA=1;
}
void clearDispBuf(void) {
	int i;
	for(i=0;i<DISP_BUF_SIZE;i++){
		DispBuf[i]=LedTab[22];
	}
}
void Display(void)
{
	int	i;
	for(i=0;i<8;i++){
		CTRL8279=0x90+i;	
		DATA8279=DispBuf[i];
		}
}
void DispHELLO(void) {
	int i;
	for(i=0;i<DISP_BUF_SIZE;i++){
		DispBuf[i]=LedTab[HELLO[i]];
	}
	Display();
}
void loadDispBuf(uchar *p) {
	int i;
	for(i=0;i<DISP_BUF_SIZE;i++){
		DispBuf[i]=LedTab[*(p+i)];
	}
}
void DisplayChar(char c)
{
		DATA8279=c;
}
void DisplayLED(void)
{
	unsigned i;
	i=LED_DATA;
	i<<=8;
	i|=LED_DATA;
	i>>=7;
	LED_DATA=(unsigned char)(i&0xff);
}
void encode(unsigned int adr) {
	int i;
	unsigned int adr1;
	uchar c;
	adr1=adr;
	for(i=0;i<8;i++){
		if(adr==0x8000){
			DispBuf[i]=LedTab[OKLedChar[i]];
		}
		else{
			c=adr1&0x0f;
			adr1>>=4;
			if(i>3)c=ERRT[7-i];
			DispBuf[7-i]=LedTab[c];
		}
	}
	
}
void encode1(void) {//12345678
	unsigned char i;
	for(i=0;i<8;i++){
		DispBuf[i]=LedTab[i+1];
	}
	
}
void encode2(void) {//87654321
	unsigned char i;
	for(i=0;i<8;i++){
		DispBuf[i]=LedTab[8-i];
	}
	
}
void encode3(void) {//F3
	clearDispBuf();
	DispBuf[0]=LedTab[15];
	DispBuf[1]=LedTab[3];
}
void encode4(void) {//F4
	clearDispBuf();
	DispBuf[0]=LedTab[15];
	DispBuf[1]=LedTab[4];
	
}
void encode5(unsigned char c) {
	unsigned char i;
	for(i=0;i<7;i++){
		DispBuf[i]=DispBuf[i+1];
	}
	DispBuf[7]=LedTab[c-0x30];
	
}
void encode6(unsigned long freq) {
	unsigned char i,c[8],j;
	unsigned long f;
	f=freq>>10;//f=freq/1024
	
	for(i=0;i<8;i++){
		c[i]=0;
	}
	while(f>=1000000){
		f-=1000000;
		c[1]++;
	}
	while(f>=100000){
		f-=100000;
		c[2]++;
	}
	while(f>=10000){
		f-=10000;
		c[3]++;
	}
	while(f>=1000){
		f-=1000;
		c[4]++;
	}
	while(f>=100){
		f-=100;
		c[5]++;
	}
	while(f>=10){
		f-=10;
		c[6]++;
	}
	c[7]+=f;
	j=0;
	for(i=0;i<8;i++){
		if((c[i]==0)&&(j==0))
			DispBuf[i]=LedTab[22];
		else{
			j=1;
			DispBuf[i]=LedTab[c[i]];
		}
	}	
	
}
void clearDisplay(void) {
	CTRL8279=0xd1;					/* clear RAM  */
	while (STATUS8279 & 0x80)			/* wait till RAM is clear */
	{
	}
}
void init8279(void) {
	clearDisplay();
	CTRL8279=0x20 | 20;				/* 11.0592MHz/6/20=92.16kHz  8279 clock */
	CTRL8279=(0x10<<3) | 0 ;		/* 8x8字符显示, 右入; 编码扫描键盘,双键锁定  */
//	InitDisplay();
	keyNum=0;

}
//;******** RAM自检子程序*************
unsigned int chkram(void) {  /* RAM Chack */
	unsigned int adr;
	uchar c,r;
	for(adr=0;adr<0x8000;adr++){
		c=0xaa;
		XBYTE[adr]=c;
		r=XBYTE[adr];
		if(r!=c)return adr;
		c=0x55;
		XBYTE[adr]=c;
		r=XBYTE[adr];
		if(r!=c)return adr;
	}
	return adr;
}
void delay_dds(void)
{
	uchar i,j;
	for(i=0;i<1;i++){
		j=i;
	}
}
void init_dds(void)
{
	uchar i;
		WCLK_pin=0;
		FQ_UD_pin=0;
	delay_dds();
	delay_dds();
		WCLK_pin=1;
	delay_dds();
		WCLK_pin=0;
	delay_dds();
		FQ_UD_pin=1;
	delay_dds();
		FQ_UD_pin=0;
	delay_dds();

	for(i=0;i<8;i++){

		DATA_pin=0;
			
		delay_dds();
			WCLK_pin=1;
		delay_dds();
			WCLK_pin=0;
	}
	delay_dds();
		FQ_UD_pin=1;
	delay_dds();
		FQ_UD_pin=0;

}
void update_freq(unsigned long f,uchar c)
{
	uchar i,cs;
	unsigned long freq_temp;
	freq_temp=f;
	cs=c;
	for(i=0;i<32;i++){
		if(freq_temp & 1)
			DATA_pin=1;
		else
			DATA_pin=0;
			
	delay_dds();
		WCLK_pin=1;
	delay_dds();
		WCLK_pin=0;
		freq_temp>>=1;
		
	}
	for(i=0;i<8;i++){
		if(cs & 1)
			DATA_pin=1;
		else
			DATA_pin=0;
			
	delay_dds();
		WCLK_pin=1;
	delay_dds();
		WCLK_pin=0;
		cs>>=1;
	}
	delay_dds();
		FQ_UD_pin=1;
	delay_dds();
		FQ_UD_pin=0;

}
void main (void){  /* main program */
	unsigned int adr;
	unsigned long freq,dfreq,temp_f;
	uchar ctrl1;
//	int temp,i;
	uchar	status;
//	char	out_char[5];
	EA=0;			 /* 0=Disable all interrupts */
	P1=0xff;
 	LED_DATA=0xff;	//off all LEDs
 	freq=1000<<10;
 	dfreq=1000<<10;
 	temp_f=0;
 	ctrl1=0x00;
 	DATA_pin=0;
 	WCLK_pin=0;
 	FQ_UD_pin=0;
 	
	delay(10);
  	init8279();
//	clearDispBuf();
	DispHELLO();
	adr=chkram();
	encode(adr);
	Display();
//	adr=chkram();
	status=0;
//	NumberC=defaultN;
	EA=1;
	EX0=1;
	EX1=0;
	ES=0;
	ET0=0;
	ET1=0;
	TMOD=C_T1 |	M0_1 | 	M0_0; 		//0x51;			/* timer1 16位计数器   timer0 16位定时器    */
	TH1=-NumberC/256;
	TL1=-NumberC%256;				/* timer1 计数  NumberC 中断    timer0定时   */
	TH0=0;
	TL0=0;
	THG0=0;
	TSET=0;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
	init_dds();		
	delay(10);
	LED_DATA=0xfc;		//on 2 LEDs
 /*	for(;;){		//test delay();
		delay(10);
		P1_0=0;
		delay(10);
		P1_0=1;
	}*/
	update_freq(freq,ctrl1);
 	status=0;
 //	while (1)  {                                 /* repeat forever */
 //		}
 	while (1)  {                                 /* repeat forever */
  		if(LED_status==1){
  			LED_status=0;
			DisplayLED();
  			}
			
		
		if(keyNum==1){
			
			switch(keyChar)
			{
				case	'A'	:     /*  F1  置入频率 单位Hz*/
					freq=temp_f<<10;	//乘1024
					update_freq(freq,ctrl1);
					temp_f=0;
					clearDispBuf();
					encode6(freq);
					Display();
					status=0;
					break; 
				case	'B'	:      /*  F2 置入频率增量  单位Hz */
					dfreq=temp_f<<10;
					temp_f=0;
					clearDispBuf();
					encode6(dfreq);
					Display();
					status=0;
					break;
				case	'C'	:      /*  F3 频率增加一个频率增量 */
 					freq+=dfreq;
					update_freq(freq,ctrl1);
					clearDispBuf();
					encode6(freq);
					Display();				/* */
					status=0;
					break;
				case	'D'	:      /*  F4 频率减少一个频率增量  */
 					freq-=dfreq;
					update_freq(freq,ctrl1);
					clearDispBuf();
					encode6(freq);
					Display();				/* */
					status=1;
					break;
				case	'1'	: 
				case	'2'	: 
				case	'3'	: 
				case	'4'	: 
				case	'5'	: 
				case	'6'	: 
				case	'7'	: 
				case	'8'	: 
				case	'9'	: 
				case	'0'	: 
/*					if((key_num==0) && ((status & 0x80)!=0)){
						clearDispBuf();
						Display();
						key_num=0;
					}
					if((status & 0x80)!=0){
						if(key_num<5){
							DisplayChar(LedTab[keyChar-0x30]);
							out_char[key_num]=keyChar;
							key_num++;
						}
					}*/
					temp_f=10*temp_f;
					temp_f+=keyChar&0x0f;
					encode5(keyChar);
					Display();				/*显示数值 */
					status=0;
					break;



				case	'*'	: 
					temp_f=0;				/*开始键盘输入数值*/
					clearDispBuf();
					Display();
					break;
				case	'#'	: 
					encode6(freq);
					Display();				/* */
					status=0;
/*					if(status==1){
						adr=chkram();
						encode(adr);
						Display();
						status=0;
					}
					else{
						encode5(keyChar);
						DispBuf[7]=LedTab[keyChar-'#'+16];	//#(0x23) --> 16 P  *(0x2a) --> 23 -
						Display();				
					} */
					break;
				default	:
					;
			}
			keyNum=0;
		}
	}            /* loop forever */
}

⌨️ 快捷键说明

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