📄 9850.c.c
字号:
/****************定义头文件*****************/
#include<reg52.h>
#include<absacc.h>
#include<math.h>
#include<intrins.h>
/****************宏定义*********************/
#define uchar unsigned char
#define uint unsigned int
#define BOOL bit
#define DDS_date P1
/***************定义所使用的引脚************/
sbit rs = P3^2;
sbit rw = P3^3;
sbit ep = P3^4;
sbit W_CLK= P3^7 ;
sbit FQ_UD= P3^6 ;
#define DDS_date P1
/**************定义全局变量*****************/
uchar KbHit,ucKey;
uchar Key,key_value;
uchar flag_ready;
//lcd_wdat(ucKey);
uchar code DDS_word_1MHz[10][4]={
0x00,0x00,0x00,0x00, //0
0x19,0x99,0x99,0x9A, //1
0x33,0x33,0x33,0x33, //2
0x4C,0xCC,0xCC,0xCD, //3
0x66,0x66,0x66,0x66, //4
0x80,0x00,0x00,0x00, //5
0x99,0x99,0x99,0x9A, //6
0xB3,0x33,0x33,0x33, //7
0xCC,0xCC,0xCC,0xCD, //8
0xE6,0x66,0x66,0x66 //9
};
uchar code DDS_word_100KHz[10][4]={
0x00,0x00,0x00,0x00, //0
0x02,0x8F,0x5C,0x29, //1
0x05,0x1E,0xB9,0x52, //2
0x07,0xAE,0x14,0x7B, //3
0x0A,0x3D,0x70,0xA4, //4
0x0C,0xCC,0xCC,0xCD, //5
0x0F,0x5C,0x28,0xF6, //6
0x11,0xEB,0x85,0x1F, //7
0x14,0x7A,0xE1,0x48, //8
0x17,0x0A,0x3D,0x71 //9
};
uchar code DDS_word_10KHz[10][4]={
0x00,0x00,0x00,0x00, //0
0x00,0x41,0x89,0x37, //1
0x00,0x83,0x12,0x6F, //2
0x00,0xC4,0x9B,0xA6, //3
0x01,0x06,0x24,0xDD, //4
0x01,0x47,0xAE,0x14, //5
0x01,0x89,0x37,0x4C, //6
0x01,0xCA,0xC0,0x83, //7
0x02,0x0C,0x49,0xBA, //8
0x02,0x4D,0xD2,0xF2 //9
};
uchar code DDS_word_1KHz[10][4]={
0x00,0x00,0x00,0x00, //0
0x00,0x06,0x8D,0xB9, //1
0x00,0x0D,0x1B,0x71, //2
0x00,0x13,0xA9,0x2A, //3
0x00,0x1A,0x36,0xE3, //4
0x00,0x20,0xC4,0x9C, //5
0x00,0x27,0x52,0x54, //6
0x00,0x2D,0xE0,0x0D, //7
0x00,0x34,0x6D,0xC6, //8
0x00,0x3A,0xFB,0x7F //9
};
uchar code DDS_word_100Hz[10][4]={
0x00,0x00,0x00,0x00, //0
0x00,0x00,0xA7,0xC6, //1
0x00,0x01,0x4F,0x8B, //2
0x00,0x01,0xF7,0x51, //3
0x00,0x02,0x9F,0x17, //4
0x00,0x03,0x46,0xDC, //5
0x00,0x03,0xEE,0xA2, //6
0x00,0x04,0x96,0x68, //7
0x00,0x05,0x3E,0x2D, //8
0x00,0x05,0xE5,0xF3 //9
};
uchar code DDS_word_10Hz[10][4]={
0x00,0x00,0x00,0x00, //0
0x00,0x00,0x10,0xC7, //1
0x00,0x00,0x21,0x8E, //2
0x00,0x00,0x32,0x55, //3
0x00,0x00,0x43,0x1C, //4
0x00,0x00,0x53,0xE3, //5
0x00,0x00,0x64,0xAA, //6
0x00,0x00,0x75,0x71, //7
0x00,0x00,0x86,0x38, //8
0x00,0x00,0x97,0x00 //9
};
uchar code DDS_word_1Hz[10][4]={
0x00,0x00,0x00,0x00, //0
0x00,0x00,0x01,0xAD, //1
0x00,0x00,0x03,0x5B, //2
0x00,0x00,0x05,0x08, //3
0x00,0x00,0x06,0xB6, //4
0x00,0x00,0x08,0x63, //5
0x00,0x00,0x0A,0x11, //6
0x00,0x00,0x0B,0xBE, //7
0x00,0x00,0x0D,0x6C, //8
0x00,0x00,0x0F,0x19 //9
};
void delay(uchar ms) //延时子程序,单位:ms
{
uchar i;
while(ms--)
{
for(i=0; i<250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz() // 测试LCD忙碌状态
{
uchar result;
uchar k;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
k=P2;
ep = 0;
result = k & 0x80;
if(result!=0)
return 1;
else
return 0;
}
lcd_wcmd(uchar cmd) // 写入指令数据到LCD
{
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P2 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(uchar pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(uchar dat) //写入字符显示数据到LCD
{
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P2 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_init(void) //LCD初始化设定
{
lcd_wcmd(0x38); //设置显示模式:4位总线,双行显示
delay(1);
lcd_wcmd(0x0f); //开光标以及光标设置
delay(1);
lcd_wcmd(0x06); //设置光标右移,已显示文字不动
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void keyscan(void)
{
uchar t1;
uchar t2; //列扫描值
P0 = 0xff;
t1 = P0;
if(t1!=0xff)
{
delay(40); //延时ms,去抖动
t2 = P0;
if(t2==t1)
{
KbHit = 1;
Key = P0; //取得键值
}
else
Key = 0x00;
}
}
void key_pro(void) // 键盘处理子函数
{ //调用键盘扫描函数,返回的键值送变量key
switch(Key) //把从P0口读入的键特征码转化为键值
{
case 0x7e:ucKey='0';key_value=0;break;
case 0xbe:ucKey='4';key_value=4;break;
case 0xde:ucKey='8';key_value=8;break;
case 0xee:ucKey='c';break;
case 0x7d:ucKey='1';key_value=1;break;
case 0xbd:ucKey='5';key_value=5;break;
case 0xdd:ucKey='9';key_value=9;break;
case 0xed:ucKey='d';break;
case 0x7b:ucKey='2';key_value=2;break;
case 0xbb:ucKey='6';key_value=6;break;
case 0xdb:ucKey='a';break;
case 0xeb:ucKey='e';break;
case 0x77:ucKey='3';key_value=3;break;
case 0xb7:ucKey='7';key_value=7;break;
case 0xd7:ucKey='b';break;
case 0xe7:ucKey='f';break;
default: ucKey='z';
}
KbHit=0;
}
void disp_sig(uchar num)
{
// lcd_pos(pos);
lcd_wdat(num);
}
void Display(uchar x,uchar y,char *p) //显示字符串,x为列,y为行显示
{
lcd_wcmd(0x80+(y-1)*0x40+x-1); //发送字符串开始显示地址
while(*p)
{
lcd_wdat(*p);
p++;
}
}
void load_DDS(uchar freq[])
{
uchar key[7]={0,0,0,0,0,0,0};
int i;
uint temp1,temp2;
uchar DDS_W0,DDS_W1,DDS_W2,DDS_W3;
for(i=0;i<7;i++)
{
key[i]=freq[i];
}
temp1=DDS_word_1Hz[key[6]][3]+DDS_word_10Hz[key[5]][3]+DDS_word_100Hz[key[4]][3]+DDS_word_1KHz[key[3]][3]+DDS_word_10KHz[key[2]][3]+DDS_word_100KHz[key[1]][3]+DDS_word_1MHz[key[0]][3];
DDS_W3=(uchar)(temp1); temp2=(unsigned char)(temp1>>8);
temp1=DDS_word_1Hz[key[6]][2]+DDS_word_10Hz[key[5]][2]+DDS_word_100Hz[key[4]][2]+DDS_word_1KHz[key[3]][2]+DDS_word_10KHz[key[2]][2]+DDS_word_100KHz[key[1]][2]+DDS_word_1MHz[key[0]][2]+temp2;
DDS_W2=(uchar)(temp1); temp2=(unsigned char)(temp1>>8);
temp1=DDS_word_1Hz[key[6]][1]+DDS_word_10Hz[key[5]][1]+DDS_word_100Hz[key[4]][1]+DDS_word_1KHz[key[3]][1]+DDS_word_10KHz[key[2]][1]+DDS_word_100KHz[key[1]][1]+DDS_word_1MHz[key[0]][1]+temp2;
DDS_W1=(uchar)(temp1); temp2=(unsigned char)(temp1>>8);
temp1=DDS_word_1Hz[key[6]][0]+DDS_word_10Hz[key[5]][0]+DDS_word_100Hz[key[4]][0]+DDS_word_1KHz[key[3]][0]+DDS_word_10KHz[key[2]][0]+DDS_word_100KHz[key[1]][0]+DDS_word_1MHz[key[0]][0]+temp2;
DDS_W0=(uchar)(temp1);
DDS_date=0x00;
W_CLK = 0;
W_CLK = 1;
DDS_date=DDS_W0;
W_CLK=0;
W_CLK=1;
DDS_date=DDS_W1;
W_CLK=0;
W_CLK=1;
DDS_date=DDS_W2;
W_CLK=0;
W_CLK=1;
DDS_date=DDS_W3;
W_CLK=0;
W_CLK=1;
FQ_UD=0;
FQ_UD=1;
}
/*uchar value(uchar ucKey)
{ static int i=0;
freq0[i]=ucKey;
i++;
lcd_wdat(ucKey);
return;
} */
void main() //主函数
{
uchar i=6,j=0,k=6;
uchar freq[7]={0,0,0,0,0,0,0}; //控制DDS的频率
// uchar freq_display[7]; //存放显示对应的输入频率
lcd_init();
Display(4,1,"WELCOME DDS");
delay(10000);
delay(10000);
delay(10000);
delay(10000);
delay(10000);
Display(4,1," ");
lcd_pos(0x04);
Display(1,1,"SET:");
while(1)
{
keyscan();
if(KbHit!=0)
{ key_pro();
if(ucKey=='c') //c代表清除一个数字
{ for(j=6;j>=k;j--) //该程序实现数组右伊
freq[j]=freq[j-1];
lcd_wcmd(0x04); //光标左移一位,已显示文字不动
delay(1);
lcd_wdat(0x20); //清除当前最后一个字符
i++;
}
else if(ucKey=='f') //f代表确认频率输入
{ i=6; //为下次重新输入做准备
load_DDS(freq);//把输入的频率值给DDS
}
else //该分支实现输入
{// for( ;i>=0;i--)
{ for(j=i;j<6;j++) //该循环实现数组左移
freq[j]=freq[j+1];
}
freq[j]=key_value;
// freq_display[i]=ucKey;
lcd_wcmd(0x06); //光标右移一位,已显示文字不动
lcd_wdat(ucKey);
i--;
k=i;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -