📄 sweep_320_240.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 + -