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

📄 main.c

📁 C0851F020单品机DA转换源码
💻 C
字号:

/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: Main.C
* 文件标识: none
* 适用器件: C8051F020
* 
* 摘 要: 本文件是DAC演示程序,按键有效后DAC0、1输出键值对应波形,并在Lcd做简单示意
* 
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年3月7日
*************************************************************************************/
/*******************************引用外部头文件***************************************/
#include "main.h"

/************************************************************************************/
/*************************************************************************************
* 常量及全局变量定义
*************************************************************************************/
unsigned char data sf0,sf1; 		//分别是DAC0、DAC1的输出数据在数组中的位号
unsigned int xdata TABLE[256];		//DAC输出数据
unsigned char ppp[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

/*************************************************************************************
* 主循环程序
*************************************************************************************/
void main (void) 
{ 
	unsigned char key,i,Hf_Flag,L_Count/*用于人工绘制上升下降沿的高低极值计数变量*/;
	unsigned int line;
	bit Cir_Flag/*进入显示的显示标志位*/,H_Flag,L_Flag/*用于人工绘制上升下降沿的高、低标志位*/;

    WDTCN = 0xde;
    WDTCN = 0xad;

	SYSCLK_Init();
    PORT_Init();
	Key_Init();

#if 	LCDA
	LCDA_Init(128,240,FS8x8);
#elif	LCDB
	LCDB_Init(240,320);
#elif	LCDC
	LCDC_Init();            // LCD初始化	
	LCDC_DisFull(Full);		// 满屏		
	LCDC_DisFull(Clr);		// 清屏
#endif

	dis_start0();

	Uart0_Init(BaudRate_115200);
	Uart1_Init(BaudRate_115200);
	Uart0_Enable(1);
	Uart1_Enable(1);
	Uart0_SendString("www.mlarm.com\r\n");
	Uart1_SendString("www.mlarm.com\r\n");
	Uart0_SendString("TeL:029-88223597-802\r\n");
	Uart1_SendString("TeL:029-88223597-802\r\n");
	
	EA = 0;
 	DAC0_Init();
	DAC1_Init();
	none();
	Timer2_Init(0x4754);// 初始化T2调整DAC0更新速率
	Timer3_Init(0x4754);// 初始化T3调整DAC0更新速率
	EA = 1;

	Cir_Flag=0;
	Hf_Flag=0;
	line=0;

	while(1)
	{
		key=GetKey();				 //调用键盘扫描函数,返回的键值送变量key
		if(key!=0xFF)
		{
			Alarm(1);		//响铃
			Delay_ms(50);
			Alarm(0);		//关闭铃声
			switch (key)
			{
				case 0x0a://a
					Cir_Flag=1;			//显示状态有效
					line=0;
					//显示波形显示界面
#if		LCDA
					LCDA_ClearScreen();
					LCDA_DrawLine(110, 15, 0, 15, 1);
					LCDA_DrawLine(110, 15, 110, 239, 1);
					for(i=0;i<28;i++)
					{
						LCDA_DrawPixel(111, 15+8*i, 1);
						if(i%2==0)
						LCDA_DrawPixel(112, 15+8*i, 1);
					}
					for(i=0;i<14;i++)
					{
						LCDA_DrawPixel(6+8*i, 14, 1);
						if(i%2==1)							
						LCDA_DrawPixel(6+8*i, 13, 1);
					}
#elif	LCDB
					LCDB_ClearScreen();
					LCDB_DrawLine(180, 15, 1, 15, 1);
					LCDB_DrawLine(180, 15, 180, 319, 1);
					for(i=0;i<38;i++)
					{
						LCDB_DrawPixel(181, 15+8*i, 1);
						if(i%2==0)
						LCDB_DrawPixel(182, 15+8*i, 1);
					}
					for(i=0;i<23;i++)
					{
						LCDB_DrawPixel(4+8*i, 14, 1);
						if(i%2==1)							
						LCDB_DrawPixel(4+8*i, 13, 1);
					}
#elif	LCDC
					LCDC_DisFull(Clr);		//清屏	 
					for(i=0;i<6;i++)
					{
						LCDC_DrawByte(15,8*i,0xff);
						LCDC_DrawByte(14,8*i,0x01);
						if(i%2==1)
						LCDC_DrawByte(13,8*i,0x01);
					}
					LCDC_DispWord(5,22,WLib_0_5x8,1,5,1);
					for(i=16;i<128;i++)
					{
						LCDC_DrawByte(i,48,0x01);
						if(i%8==7)							
							LCDC_DrawByte(i,48,0x03);
						if(i%16==15)							
							LCDC_DrawByte(i,48,0x07);
					}
					LCDC_DispWord(8,4,WLib_W_10x8,1,10,1);
					LCDC_DispWord(19,4,WLib_W_10x8,1,10,1);
					LCDC_DispWord(30,4,WLib_W_10x8,1,10,1);
					LCDC_DispWord(41,4,WLib_dot_4x8,1,4,1);
					LCDC_DispWord(46,4,WLib_M_9x8,1,9,1);
					LCDC_DispWord(57,4,WLib_L_6x8,1,6,1);
					LCDC_DispWord(63,4,WLib_A_7x8,1,7,1);
					LCDC_DispWord(71,4,WLib_R_7x8,1,7,1);
					LCDC_DispWord(79,4,WLib_M_9x8,1,9,1);
					LCDC_DispWord(90,4,WLib_dot_4x8,1,4,1);
					LCDC_DispWord(94,4,WLib_C_7x8,1,7,1);
					LCDC_DispWord(102,4,WLib_O_7x8,1,7,1);
				    LCDC_DispWord(110,4,WLib_M_9x8,1,9,1);
#endif
					while(Cir_Flag)			
					{
						if(Dis_Flag==1)
						{
							Dis_Flag=0;	
#if		LCDA
							if(line>223)
							{
								line=0;
								if(Hf_Flag>0)
#elif	LCDB
							if(line>303)
							{
								line=0;
								if(Hf_Flag>0)
#elif	LCDC
							if(line>112)
							{
								line=0;
								if(Hf_Flag>6)
#endif
									Hf_Flag=0;
								else
									Hf_Flag++;
							}
							else
								line++;	
#if		LCDA
							if(line%2==0)
#elif	LCDB
							if(line%1==0)				//没有意义,防止编译警告
#elif	LCDC	
							if(line%8==0)
#endif
							{
								if(L_Count>0x05)		//正常显示
								{
									L_Count=0x05;
									H_Flag=0;
									L_Flag=0;
									if(Dis_dt/100>37)
									{
										H_Flag=1;
										L_Count=0x00;
									}							
									if(Dis_dt/100<3)
									{
										L_Flag=1;
										L_Count=0x00;
									}	
									//绘图前擦除掉原来的图形并绘制新图形
#if		LCDA
									LCDA_DrawLine( 0, line/2+16+(112*Hf_Flag), 109, line/2+16+(112*Hf_Flag), 0);
									LCDA_DrawPixel( (109-Dis_dt/50), line/2+16+(112*Hf_Flag), 1);
#elif	LCDB
									LCDB_DrawLine( 1, line+16, 179, line+16, 0);
									LCDB_DrawPixel( (179-Dis_dt/50), line+16, 1);
#elif	LCDC
									LCDC_DrawByte(line/8+16+(14*Hf_Flag),0,0x00);
									LCDC_DrawByte(line/8+16+(14*Hf_Flag),8,0x00);
									LCDC_DrawByte(line/8+16+(14*Hf_Flag),16,0x00);
									LCDC_DrawByte(line/8+16+(14*Hf_Flag),24,0x00);
									LCDC_DrawByte(line/8+16+(14*Hf_Flag),32,0x00);
									LCDC_DrawByte(line/8+16+(14*Hf_Flag),40,0x00);
									//Delay_ms(5);
									LCDC_DrawByte
									(line/8+16+(14*Hf_Flag),
									((40-Dis_dt/100)/8)*8,
									ppp[((40-Dis_dt/100)%8)]);
#endif																						
								}
								else					//有高低计值出现的显示
								{
									if(Dis_dt/100>38)
										H_Flag=1;							
									if(Dis_dt/100<2)
										L_Flag=1;
									if(H_Flag&L_Flag)	//需要人工绘制上升下降沿
									{
#if		LCDA
										for(i=14;i<55;i++)
										{
											LCDA_DrawPixel( 2*i, line/2+16+(112*Hf_Flag), 1);
										}
#elif	LCDB
										for(i=49;i<89;i++)
										{
											LCDB_DrawPixel( 2*i, line+16, 1);
										}
#elif	LCDC
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),0,0x55);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),8,0x55);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),16,0x55);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),24,0x55);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),32,0x55);	
#endif
										H_Flag=0;
										L_Flag=0;
										L_Count=0x05;
									}
									else				//有高低极值出现的但无需处理正常显示
									{
#if		LCDA
										LCDA_DrawLine( 0, line/2+16+(112*Hf_Flag), 109, line/2+16+(112*Hf_Flag), 0);
										LCDA_DrawPixel( (109-Dis_dt/50), line/2+16+(112*Hf_Flag), 1);
#elif	LCDB
										LCDB_DrawLine( 0, line+16, 179, line+16, 0);
										LCDB_DrawPixel( (179-Dis_dt/50), line+16, 1);
#elif	LCDC
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),0,0x00);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),8,0x00);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),16,0x00);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),24,0x00);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),32,0x00);
										LCDC_DrawByte(line/8+16+(14*Hf_Flag),40,0x00);																					
										LCDC_DrawByte
										(line/8+16+(14*Hf_Flag),
										((40-Dis_dt/100)/8)*8,
										ppp[((40-Dis_dt/100)%8)]);	
#endif										
									}									
								}
								L_Count++;
							}
						}					
						key=GetKey();				 //调用键盘扫描函数,返回的键值送变量key
						if(key!=0xFF)
						{
							Alarm(1);		//响铃
							Delay_ms(50);
							Alarm(0);		//关闭铃声
							switch (key)
							{
								case 0x0b:								
									EA=0;
									sine();
									EA=1;								
									break;
								case 0x0c:								
									EA=0;
									saw();
									EA=1;								
									break;
								case 0x0d:								
									EA=0;
									triangle();
									EA=1;								
									break;
								case 0x0e:								
									EA=0;
									square();
									EA=1;								
									break;
								case 0x0f:
									EA=0;
									Cir_Flag=0;
#if		LCDA
									LCDA_ClearScreen();
#elif	LCDB
									LCDB_ClearScreen();
#elif	LCDC
									LCDC_DisFull(Clr);
#endif
									dis_start0();
									none();
									EA=1;
									break;
								default:  
									break;	
							}
						}
					}					 
					break;
				case 0x0f:
#if		LCDA
									LCDA_ClearScreen();
#elif	LCDB
									LCDB_ClearScreen();
#elif	LCDC
									LCDC_DisFull(Clr);
#endif
									dis_start0();			
					break;
				default:  
					break;
			}
			Delay_ms(5);   
		}
	}
}

/************************************************************************************
* 文件结束
************************************************************************************/

⌨️ 快捷键说明

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