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

📄 ad.c

📁 TMS3205416芯片上的AD转换代码
💻 C
字号:
#define	TIM		*(int *)0x24
#define	PRD     	*(int *)0x25
#define	TCR		*(int *)0x26
#define	IMR		*(int *)0x0
#define	IFR		*(int *)0x1		
#define	PMST		*(int *)0x1d	

ioport unsigned int port3,port4,port2;

#define AD_DATA	port2
#define AD_SEL  port3
#define AD_HOLD port4

void interrupt time(void);
int *ptr,k0,k1,value;
signed int uWork0,uWork,uWork1;
#define LCDDELAY 1
#define LCDCMDTURNON 0x3f
#define LCDCMDTURNOFF 0x3e
#define LCDCMDSTARTLINE 0xc0
#define LCDCMDPAGE 0xb8
#define LCDCMDVERADDRESS 0x40
#define REGISTERCLKMD (*(unsigned int *)0x58)
#define WAITSTATUS (*(unsigned int *)0x28)

ioport unsigned int port8000;
ioport unsigned int port8001;
ioport unsigned int port8002;
ioport unsigned int port8003;
ioport unsigned int port8004;
ioport unsigned int port8007;

void Delay(unsigned int nTime);		// 延时子程序
void TurnOnLCD();			// 打开显示
void LCDCLS();				// 清除屏幕显示内容
void zyxdisplay(int value);             //显示子程序

unsigned char ledkey[10][8]=
{
	{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},	//0
	{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},	//1
	{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},	//2
	{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},
	{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
	{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
	{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
	{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
	{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
	{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}
};




main()
{
	int i,j;
	
	asm("	ssbx	INTM");	// 关闭可屏蔽中断
	k0=k1=0;
	ptr=(int *)0x3000;	// 转换数据的保存区,从数据区3000H开始
				// 3000H-3200H保存第1通道(AIN1)的转换结果
				// 3200H-3400H保存第2通道(AIN2)的转换结果
	for(i=0;i<0x400;i++)	// 将转换数据的保存区清0
      		*(ptr+i)=0;
	j= PMST; 		      
	PMST = j&0xff;
	IMR = 0x8;
	TCR = 0x411;		// 计数器分频系数=2
	TIM = 0;
	PRD = 0x100;		// 定时器周期=256,采样周期=周期*分频系数*时钟周期
	TCR = 0x421;		//                         =512时钟=64us
	IFR = 0x100;		//   其中,时钟周期为8MHz

	AD_SEL=6;		// 通道选择 A0,A1

	asm("	rsbx	INTM");	// 开中断进行转换
      
	while ( 1 );
		
	
	
}

// 定时器中断服务程序,完成:保存转换结果、启动下次转换
void interrupt time(void)	
{
	uWork0=AD_DATA;		// 从FIFO中读取转换结果
	uWork1=AD_DATA;		// 从FIFO中读取转换结果
	uWork=uWork0&0x0f000;
	if ( uWork==0x8000 )
	{
		uWork0<<=4;		// 去掉高4位
		uWork0>>=4;	        // 取低4位有效值
		*(ptr+k0)=uWork0;	// 保存结果
//////////////////////////////////////////////////////////////////////////
              if (*(ptr+k0)>0x0f)
               value=1;
               else    value=0;
              zyxdisplay(value);
//////////////////////////////////////////////////////////////////////





              	k0++;

		if ( k0>=0x200 )
		{
			k0=0;	// 软中断位置
		}
	}
	else if ( uWork==0x9000 )
	{
		uWork0<<=4;	// 去掉高4位
		uWork0>>=4;	// 取低4位有效值
		*(ptr+k1+0x200)=uWork0;	// 保存结果
		k1++; k1%=0x200;
	}
	uWork=uWork1&0x0f000;
	if ( uWork==0x8000 )
	{
		uWork1<<=4;		// 去掉高4位
		uWork1>>=4;	// 取低4位有效值
		*(ptr+k0)=uWork1;	// 保存结果
		k0++;
		if ( k0>=0x200 )
		{
			k0=0;	// 软中断位置
		}
	}
	else if ( uWork==0x9000 )
	{
		uWork1<<=4;	// 去掉高4位
		uWork1>>=4;	// 取低4位有效值
		*(ptr+k1+0x200)=uWork1;	// 保存结果
		k1++; k1%=0x200;
	}
	AD_HOLD =0;		// 送转换信号
	for ( uWork=0;uWork<10;uWork++ );
	AD_HOLD=1;
}





void zyxdisplay(int value)
{       int i,nCount=value,nBW=0;
        asm("	ssbx	INTM");	// 关闭可屏蔽中断

	REGISTERCLKMD=0;
	port8000=0;		// 初始化ICETEK-CTR
	Delay(LCDDELAY);
	port8000=0x80;
	Delay(LCDDELAY);
	port8000=0;
	Delay(LCDDELAY);
	port8007=0;			// 关闭东西方向的交通灯
	Delay(LCDDELAY);
	port8007=0x40;	// 关闭南北方向的交通灯
	Delay(LCDDELAY);
	TurnOnLCD();				// 打开显示
	LCDCLS();				// 清除显示内存
	port8001=LCDCMDSTARTLINE;		// 设置显示起始行
	Delay(LCDDELAY);
	port8002=0;
	Delay(LCDDELAY);

	{
		port8001=LCDCMDPAGE;		// 设置操作页=0
		Delay(LCDDELAY);
		port8002=0;
		Delay(LCDDELAY);
		port8001=LCDCMDVERADDRESS;	// 起始列=0
		Delay(LCDDELAY);
		port8002=0;
		Delay(LCDDELAY);
		for ( i=0;i<8;i++ )
		{
			port8003=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]);	// 屏幕左侧第1至8行第i列赋值		
					port8002=0;			// (赋值后当前操作列自动加1,所以不需设置)
			Delay(LCDDELAY);
			port8002=0;
			Delay(LCDDELAY);
		}
		


                asm("	rsbx	INTM");	// 开中断进行转换

		//nCount++;
		//if ( nCount==10 )
		//{
		//	nCount=0;
		//	nBW=1-nBW;
		//}
	}
}  
 





void Delay(unsigned int nDelay)
{
	int ii,jj,kk=0;
	for ( ii=0;ii<nDelay;ii++ )
	{
		for ( jj=0;jj<1024;jj++ )
		{
			kk++;
		}
	}
}

void TurnOnLCD()
{
	port8001=LCDCMDTURNON;
	Delay(LCDDELAY);
	port8002=0;
	Delay(1024);  
	port8001=LCDCMDSTARTLINE;
	Delay(LCDDELAY);
	port8002=0;
	Delay(LCDDELAY);
}

void LCDCLS()
{
	int i,j;
	port8001=LCDCMDSTARTLINE;
	Delay(LCDDELAY);
	port8002=0;
	Delay(LCDDELAY);
	for ( i=0;i<8;i++ )
	{
		port8001=LCDCMDPAGE+i;
		Delay(LCDDELAY);
		port8002=0;
		Delay(LCDDELAY);
		port8001=LCDCMDVERADDRESS;
		Delay(LCDDELAY);
		port8002=0;
		Delay(LCDDELAY);
		for ( j=0;j<64;j++ )
		{
			port8003=0;
			Delay(LCDDELAY);
			port8002=0;
			Delay(LCDDELAY);
		}
		port8001=LCDCMDPAGE+i;
		Delay(LCDDELAY);
		port8002=0;
		Delay(LCDDELAY);
		port8001=LCDCMDVERADDRESS;
		Delay(LCDDELAY);
		port8002=0;
		Delay(LCDDELAY);
		for ( j=0;j<64;j++ )
		{
			port8004=0;
			Delay(LCDDELAY);
			port8002=0;
			Delay(LCDDELAY);
		}
	}
}


⌨️ 快捷键说明

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