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

📄 sweep_320_240.c

📁 在采用 320x240 屏的设计实验箱上运行
💻 C
字号:
#include <absacc.h>
#include <reg51.h>
#include <stdlib.h>
#include <math.h>
#include <intrins.h>
#include "display_fun.h"
#include "ziku.h"
#include "wave.h"

#define uchar unsigned char
#define uint unsigned int

/*定义开关中断*/
#define DISABLE		EA=0
#define ENABLE		EA=1
#define ON		1
#define OFF		0

/*定义键盘*/
#define key0		0
#define	key1		1
#define	key2		2
#define	key3		3
#define	key4		4
#define	key5		5
#define	key6		6
#define key7		7
#define key8		8
#define key9		9
#define key_mod		10
#define key_clr		11
#define key_enter	12

/*define Command*/

#define Wsin		0
#define Wtri		1
#define Wpul		2
#define Wclr		3
 
/*定义端口,P2口用作控制线*/
sbit WR_M=P2^4;                //回送M控制线
sbit RESET_PHASEREG=P2^5;     //复位相位累加器

/*P1口用作LED显示线*/
sbit LED_CLK=P1^0;   //LED时钟线
sbit LED_DAT=P1^1;   //LED数据线

sbit Cmd_CS=P2^5;
sbit DC=P2^6;
sbit Mh=P2^7;
sbit Int_wire=P3^2;


uchar count=0;       //显示的位数
bit flag=0;         //是否按了ENTER,为0表示没有按
uchar idata value[5]={0,2,0,0,0};   //存储显示的数值
uchar mh_data=0;                   //送给CPLD的频率步进值高位
uchar ml_data=0;                   //送给CPLD的频率步进值低位

uchar idata key_pressed;
static uchar key_no;

void led_display(uchar i);
/*数字'1','2','3','4','5','6','7','8','9','0'的七段码字库*/
const uchar code LED_FONT[11]={  //
	0xFC, //0
	0x60, //1
	0xDA, //2
	0xF2, //3
	0x66, //4
	0xB6, //5
	0xBE, //6
	0xE0, //7
	0xFE, //8
	0xF6, //9
    0x00 //不显示
};

void init_port()
{
	uchar i;
	P0 = 0xFF;
	P1 = 0xFF;
	RESET_PHASEREG=1;    //禁止相位累加器工作
	WR_M=1;              //回送M控制线初始为高电平
	Cmd_CS=1;
        P3 = 0xFF;
        for(i=0;i<6;i++)           
            led_display(10); 
}


void init_interrupt()
{ 
IE=0x81;     
PX0=1;
EX0=1;
IE0=0;
EA=1;
IT0=1;        //外部中断0为跳变触发方式
        ENABLE; 

       //CPU开中断
}

void led_display(uchar i)
{
        uchar j,mask;
	mask=0x01;
	for(j=0;j<8;j++){
		LED_CLK=0;
		LED_DAT=( (LED_FONT[i]) & mask);
		mask<<=1;
		LED_CLK=1;   //上升沿移位
	}
}       


void wait(void)
{
	unsigned int i;
		for(i=0;i<5000;i++);
}

void delayMs(unsigned char dly)
{
unsigned char i;
unsigned int k;
	for(i=dly;i!=0;i--)
	{
		for(k=0;k<1000;k++);			
	}
}



#define  SysFrq   12

void SetPhase(unsigned long int Freq)
{
unsigned char div;
unsigned int  phase;
#if SysFrq==12
if(Freq>31250)
{
Freq=31250;
value[0]=3;
value[1]=1;
value[2]=2;
value[3]=5;
value[4]=0;
}
if(Freq<1007)
{
div=31;
phase=Freq/0.4922;
}

if((Freq>=1007)&&(Freq<2081))
{
div=15;
phase=Freq/1.0173;
}
if((Freq>=2081)&&(Freq<4463))
{
div=7;
phase=Freq/2.1798;
}
if((Freq>=4463)&&(Freq<6249))
{
div=5;
phase=Freq/3.0517;
}
if((Freq>=6249)&&(Freq<7811))
{
div=4;
phase=Freq/3.8147;
}
if((Freq>=7811)&&(Freq<10415))
{
div=3;
phase=Freq/5.0863;
}
if((Freq>=10415)&&(Freq<15624))
{
div=2;
phase=Freq/7.6294;
}
if((Freq>=15624))
{
div=1;
phase=Freq/15.2588;
}
#endif
#if SysFrq==11
if(Freq>30316)
{
Freq=30316;
value[0]=3;
value[1]=0;
value[2]=3;
value[3]=1;
value[4]=6;
}
if(Freq<928)
{
div=31;
phase=Freq/0.4536;
}

if((Freq>=928)&&(Freq<1919))
{
div=15;
phase=Freq/0.9375;
}
if((Freq>=1919)&&(Freq<4113))
{
div=7;
phase=Freq/2.0090;
}
if((Freq>=4113)&&(Freq<5759))
{
div=5;
phase=Freq/2.8125;
}
if((Freq>=5759)&&(Freq<7199))
{
div=4;
phase=Freq/3.5156;
}
if((Freq>=7199)&&(Freq<10104))
{
div=3;
phase=Freq/4.9345;
}
if((Freq>=10104)&&(Freq<15157))
{
div=2;
phase=Freq/7.4017;
}
if((Freq>=30316))
{
div=1;
phase=Freq/14.8034;
}
#endif
P0=phase&0xff;//((unsigned char *)&phase)[1];
Mh=0;
DC=1;
Cmd_CS=1;
Cmd_CS=0;
Cmd_CS=1;
P0=(div<<3)|((phase&0x0700)>>8);//((unsigned char *)&phase)[0];
Mh=1;
DC=1;
Cmd_CS=1;
Cmd_CS=0;
Cmd_CS=1;
}

void SetCMD(unsigned char Cmd)
{
P0=Cmd;
DC=0;
Cmd_CS=1;
Cmd_CS=0;
Cmd_CS=1;
}

void refresh_led()
{
led_display(10);
led_display(value[0]);
led_display(value[1]);
led_display(value[2]);
led_display(value[3]);
led_display(value[4]);
}

#define AP 0x2a


void display_mod(unsigned char mod)
{
/*	Set_Display_Add(768);
	printf("MOD:");
	switch(mod)
	{
		case Wsin: printf("SIN  ");
				break;
		case Wtri: printf("TRI  ");
				break;
		case Wpul: printf("PULSE");
				break;
		case Wclr: printf("NONE ");
				break;
	}*/
//	showchinese(0,0,mod)
	unsigned int x=264 , y=64;
	switch(mod)
	{
		case 0: 	showchinese(x,y,CD5FD);//正
					showchinese(x+16,y,CCFD2);//弦
					showchinese(x+32,y,CB2A8);//波
					initram_1();
					show_123(sin);
					break;
		case 1:  	showchinese(x,y,CC8FD);//三
					showchinese(x+16,y,CBDC7);//角
					showchinese(x+32,y,CB2A8);//波
					initram_1();
					show_123(tri);
					break;
		case 2:  	showchinese(x,y,CBED8);//矩
					showchinese(x+16,y,CD0CE);//形
					showchinese(x+32,y,CB2A8);//波
					initram_1();
					show_123(pul);
					break;
		case 3:  	showchinese(x,y,CCEDE);//无
					showchinese(x+16,y,CD0C5);//信
					showchinese(x+32,y,CBAC5);//号
					initram_1();
					show_123(clr);
					break;
		default:	break;
	}
	//show_wave(mod);
}

void show_fre(void)
{
	unsigned int x=264,y=144 ;
	show_num(x,y,CC000+(value[0]<<4));
	show_num(x+8,y,CC000+(value[1]<<4));
	show_num(x+16,y,CC000+(value[2]<<4));
	show_num(x+24,y,CC000+(value[3]<<4));
	show_num(x+32,y,CC000+(value[4]<<4));
}

void set_up(unsigned char flag)//flag!=0,setup;flag=0,none
{
	if(flag)
	{
		showchinese(264,184,CC9E8);//设
		showchinese(264+16,184,CD6C3);//置
	}
	else
	{
		showchinese(264,184,C0000);//00
		showchinese(264+16,184,C0000);//00
	}
}

/***************************************************************
*名称:showchinese(uchar x,uchar y,int chin)
*描述:在x,y位置处,显示字符码为chin
*参数:坐标x,坐标y
*返回:
****************************************************************/
void showchinese(unsigned int x,unsigned int y,int chin)
{ 
	int temp1,temp2; 
	uchar hi,lo;
	uchar b,c;
    unsigned int d=x;
	temp2=chin;
	outcode(0x4F);
	for(c=0;c<2;c++)
	{
		temp1=0x5000+d/8+y*AP;//5218
		hi=temp1>>8;//hi=temp1/256;
		lo=(uchar)temp1;//lo=temp1%256;
		outcode(0x46);
		outdata(lo);
		outdata(hi);
		outcode(0x42);
		for(b=0;b<16;b++){
			outdata(hzdot[temp2]);
			temp2++;
		}
		d=d+8;
	}
}
/***************************************************************
*名称:display_lead(void)
*描述:初始化液晶屏上第三层的汉字
*参数:
*返回:
****************************************************************/
void display_lead(void)
{
	uchar x=8;
	uchar y=220;

	showchinese(x,y,CC7EB);//请
	showchinese(x+16,y,CB0B4);//按
	showchinese(x+32,y,CC8B7);//确
	showchinese(x+48,y,CB6A8);//定
	showchinese(x+64,y,CBCFC);//键
	showchinese(x+80,y,CCAE4);//输
	showchinese(x+96,y,CC8EB);//入
	showchinese(x+112,y,CC6B5);//频
	showchinese(x+128,y,CC2CA);//率

	showchinese(264,24,CC4A3);//模
	showchinese(264+16,24,CCABD);//式
	show_num(264+32,24,CC010);//:

	showchinese(264,104,CC6B5);//频
	showchinese(264+16,104,CC2CA);//率
	show_num(264+32,104,CC010);//:

	show_num(304,144,CC011);//H
	show_num(312,144,CC012);//z
}
/***************************************************************
*名称:display_init(void)
*描述:初始化液晶屏和相关图形
*参数:
*返回:
****************************************************************/
void display_init(void)
{
	turnoff();
	init();
	initram();
	turnon();
	DrawFrame();
	DrawGrid();
	display_lead();
}
/***************************************************************
*名称:showsine (void)
*描述:显示采样的结果,采64个点但显示256点
*参数:xr_temp[]显示数组,N_temp数组元素个数,
	   start_add图形开始的x地址,last上次显示最后一个元素
*返回:
****************************************************************/
/*void showsine (uchar xr_temp[],uchar N_temp,uchar start_add,uchar last)
{
	uchar i ;
	WriteD(start_add,xr_temp[1]>>1);
	vector(start_add-1,last>>1,xr_temp[1]>>1);
	for(i=2;i<N_temp;i++)
	{
		WriteD(i-1+start_add,xr_temp[i]>>1);
		vector(i-2+start_add,xr_temp[i-1]>>1,xr_temp[i]>>1);
	}
}*/

void show_num (unsigned int x, unsigned int y, int chin)
{
	int temp1,temp2; 
	uchar hi,lo;
	uchar b;
    unsigned int d=y;
	temp2=chin;
	outcode(0x4f);
	temp1=0x5000+x/8+d*AP;//5218
	hi=temp1>>8;//hi=temp1/256;
	lo=(uchar)temp1;//lo=temp1%256;
	outcode(0x46);
	outdata(lo);
	outdata(hi);
	outcode(0x42);
	for(b=0;b<16;b++){	
		outdata(hzdot[temp2]);
		temp2++;
	}
}

#define Start	 	0
#define Screen		1
#define Setup		2
#define FreqScan	3

#define enter_num	0
#define wait_key	1
#define exit_setup	2

unsigned long int Freq,FreqS;
unsigned long int Freq_temp;
unsigned char MainSM=0;
unsigned char SetupSM=0;

void main(void)
{
	unsigned char mod,value_index;
        init_port();
        init_interrupt();
        _nop_();
        _nop_();
        _nop_();
        display_init();
        //cls();
        //Set_Display_Add(0);
        //printf("dds        \nPlease press enter key to set Frequency");
        while(1){
        //SetCommand(0xaa,1);
        
       switch(MainSM)
        {
        case Start:	MainSM=Screen;
        		SetPhase(2000);
        		SetCMD(mod&0x03);
        		display_mod((mod)&0x03);
        		//Set_Display_Add(560);
        		//putchar(value[0]+0x30);
        		//putchar(value[1]+0x30);
        		//putchar(value[2]+0x30);
        		//putchar(value[3]+0x30);
        		//putchar(value[4]+0x30);
						show_fre();
        		refresh_led();
		break;
        case Screen:	if(key_pressed==ON)
        		{
        		switch(key_no)
        		{
        			case key_enter: MainSM=Setup;
        					break;
        			case key_clr:	MainSM=FreqScan;
        					FreqS=Freq;
        					break;
        			case key_mod: SetCMD((++mod)&0x03);
        				      display_mod((mod)&0x03);
        				      refresh_led();
        					break;
        			default:  break;      	        		
        		}
        	       	key_pressed=OFF;
        		}
        	break;
        case FreqScan:	//扫频输出状态
        		delayMs(10);	//延时函数,每隔若干毫秒步进50Hz
        		SetPhase(FreqS&0x7fff);	//设置频率,以模32k循环
        		FreqS+=50;		//频率步进50hz
        		if(key_pressed==ON)
        		{
        		switch(key_no)
        		{
        			case key_enter: MainSM=Setup;
        					break;
        			case key_clr:	MainSM=Screen;
        					SetPhase(Freq);
        					break;
        			case key_mod: SetCMD((++mod)&0x03);
        				      display_mod((mod)&0x03);
        				      refresh_led();
        					break;
        			default:  break;      	        		
        		}
        	       	key_pressed=OFF;
        		}
        	break;
        	
        case Setup:	//Set_Display_Add(428);
        		//printf("SETUP");
					set_up(1);//设置
        			switch(SetupSM)
        			{
        				case  enter_num:	value[0]=0;
        							value[1]=0;
        							value[2]=0;
        							value[3]=0;
        							value[4]=0;
        							//Set_Display_Add(560);
        							//putchar(value[0]+0x30);
        							//putchar(value[1]+0x30);
        							//putchar(value[2]+0x30);
        							//putchar(value[3]+0x30);
        							//putchar(value[4]+0x30);
									show_fre();
        							value_index=0;
        							SetupSM=wait_key;
        							break;
        				case  wait_key:		if(key_pressed==ON)
        							{
        							switch(key_no)
        								{
        								case key0:
        								case key1: 
        								case key2: 
        								case key3: 
        								case key4: 
        								case key5:
        								case key6:
        								case key7:
        								case key8:
        								case key9:
        									if(value_index<5)
        									{
        									value[value_index]=key_no;
        									value_index++;
        									}
        									
        									break;
        								case key_enter:SetupSM=exit_setup;
        									break;
        								case key_mod: SetCMD((++mod)&0x03);
        									      display_mod((mod)&0x03);
        									      refresh_led();
        									break;
        								default:  break;      	        		
        								}
        							//Set_Display_Add(560);
        							//putchar(value[0]+0x30);
        							//putchar(value[1]+0x30);
        							//putchar(value[2]+0x30);
        							//putchar(value[3]+0x30);
        							//putchar(value[4]+0x30);
									show_fre();
        							refresh_led();
        	       						key_pressed=OFF;
        							}
        							       							
        							break;
        				case  exit_setup:	Freq_temp=value[0];
        							Freq=Freq_temp*10000;
        							Freq_temp=value[1];
        							Freq=Freq+Freq_temp*1000;
        							Freq_temp=value[2];
        							Freq=Freq+Freq_temp*100;
        							Freq_temp=value[3];
        							Freq=Freq+Freq_temp*10;
        							Freq=Freq+value[4];
        							SetPhase(Freq);
        							//Set_Display_Add(560);
        							//putchar(value[0]+0x30);
        							//putchar(value[1]+0x30);
        							//putchar(value[2]+0x30);
        							//putchar(value[3]+0x30);
        							//putchar(value[4]+0x30);
									show_fre();
        							refresh_led();
        							//Set_Display_Add(428);
        							//printf("     ");
									set_up(0);//设置00
        							refresh_led();
        							SetupSM=enter_num;
        							MainSM=Screen;
        							break;
        			}
              	break;
        default:
        	break;
        }
        
        
        
        }          //等待中断
}

void interrupt_handle() interrupt 0	
{ 						
        //uchar disdata;
        DISABLE;                //CPU关中断
        wait();			//键盘消抖延时
	if (Int_wire==0)
	{
	key_pressed=ON;
	P2=0xFF;
        key_no=P2&0x0F;        //读取P2口的低四位显示数据编码	
        }          
        ENABLE;                   //CPU开中断
}

⌨️ 快捷键说明

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