📄 文档 (7)显示界面完善.txt
字号:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//数据口定义
#define lcd1602_bus P0
/*定义9850端口*/
sbit sclk=P3^0; //W_CLK
sbit load=P3^1; //FQUD
sbit sdata=P3^2; //DATA
/******* 引脚LCD定义 *****/
sbit rs_1602=P2^5;
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit alarm=P0^0;
sbit beep=P2^3; //按键声音开关
// TLC0838数据口定义
sbit CS=P2^0; //TLC0838---PIN18
sbit DI=P2^1; //TLC0838---PIN17
sbit CLK=P2^2; //TLC0838---PIN16
sbit DO=P2^3; //TLC0838---PIN14
//SE接成低电平
uchar error=1;
/*********延时子程序**********/
void delay_1ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void delay(uchar t)
{
uchar i;
while(t--)
{
/* 对于11.0592M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
uchar busy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus; //e在高电平时读
e_1602=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd1602_wrdata(uchar lcddata)
{
while(lcd1602_busy()); //等待空闲
lcd1602_bus=lcddata; //在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd1602_clear(void)
{
lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay(1);
}
/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay(1);
lcd1602_wrcmd(0x0e); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay(1);
lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
delay(1);
lcd1602_wrcmd(0x01); //清屏
delay(1);
}
/**********4*4矩阵键盘****************/
/************
矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
D C B A
1〔15 14 13 12〕
2〔11 10 9 8〕
3〔 7 6 5 4〕
4〔 3 2 1 0〕
利用已有的那个按键程序 */
uchar getkey_ii()
{
unsigned char keycode=0xff,temp,i;
P1=0x0f;
temp=P1&0x0f;
if(temp!=0x0f) //判是否有键按下
{
beep=0;
P1=0xef; //自第0行开始扫描输出,自列读入键值
for(i=0;i<4;i++)
{
temp=P1&0x0f;
if(temp==0x07) //判断第0列是否有键按下
{
keycode=i*4+0;
break;
}
else if(temp==0x0b)//判断第1列是否有键按下
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)//判断第2列是否有键按下
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)//判断第3列是否有键按下
{
keycode=i*4+3;
break;
}
P1=(P1<<1)|0x1;
}
while((P1&0x0f)!=0x0f) //等待释放
{
P1=0x0f;
}
beep=1;
}
return keycode;
}
/********* 显示数字 *************/
void xianshu(unsigned long a)
{ unsigned long c,p=0;
c=a/1000000000;
if(c!=0)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%1000000000)/100000000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%100000000)/10000000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%10000000)/1000000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%1000000)/100000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%100000)/10000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%10000)/1000;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%1000)/100;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
p=1;
}
c=(a%100)/10;
if(c!=0 || p==1)
{lcd1602_wrdata(c+0x30);
}
c=a%10+0x30;
lcd1602_wrdata(c);
}
/******* 菜单显示子程序 ************/
void xianshi(uchar j)
{ uchar code str[][9]={{"1.SIN "},{"2.OOK "},{"3.set F "},{"4.set dF"},{"5.set XW"},{"6.FSK "},{"7.FM "},{"1.SIN "}};
uchar i;
unsigned char offset=0x80;
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
lcd1602_wrcmd(offset+0x00);
lcd1602_wrdata('-');
lcd1602_wrdata('>');
for(i=0;i<8;i++) lcd1602_wrdata(str[j+0][i]);
lcd1602_wrcmd(offset+0x40);
lcd1602_wrdata(' ');
lcd1602_wrdata(' ');
for(i=0;i<8;i++) lcd1602_wrdata(str[j+1][i]);
}
/*************** AD9850驱动程序 ************/
ad9850(float freq, float dfreq,ulong d4)
{
float fw;
uchar i,j,temp;
uchar s;
uchar d[5];
fw=freq*34.359738368; //d[4]中存放控制字最高位,即相位控制字
//Freq=MCLK*FW/2^32
d[4]=(unsigned long)(d4/11.25)<<3;
d[0]=(unsigned long)fw;
d[1]=(unsigned long)fw>>8;
d[2]=(unsigned long)fw>>16;
d[3]=(unsigned long)fw>>24;
load=0;
sclk=0;
sclk=1;
sclk=0;
load=1;
load=0;
for(i=0;i<5;i++)
{
temp=d[i];
for(j=0;j<8;j++)
{
sclk=0;
if(temp&1) sdata=1;
else sdata=0;
sclk=1;
temp=temp>>1;
}
}
load=1;
load=0;
lcd1602_clear();
lcd1602_wrdata(' ');
lcd1602_wrdata(' ');
lcd1602_wrdata(' ');
lcd1602_wrdata(' ');
lcd1602_wrdata(' ');
if ((unsigned long)freq%1000==0 )
{
s='K'; freq=freq/1000;
if ( (unsigned long) freq%1000==0) {s='M';freq=freq/1000 ; }
}
else{ s=' ';}
xianshu(freq);
lcd1602_wrdata(s);
lcd1602_wrdata('H');
lcd1602_wrdata('Z');
lcd1602_wrcmd(0x80+0x40); //换行
if ((unsigned long)dfreq%1000==0 )
{
s='K'; dfreq=dfreq/1000;
if ( (unsigned long) dfreq%1000==0) {s='M';dfreq=dfreq/1000 ; }
}
else{ s=' ';}
lcd1602_wrdata(0x7e);
xianshu(dfreq);
lcd1602_wrdata(s);
lcd1602_wrdata('H');
lcd1602_wrdata('Z');
lcd1602_wrcmd(0x80+0x4b); //定坐标 控制显示位子
lcd1602_wrdata(0xf2);
lcd1602_wrdata(':');
xianshu(d4);
}
/********************** 按键显示数程序 *************************/
ulong dushu()
{
uchar code d[]="please insert XW:";
unsigned char offset=0x80;
uchar key;
ulong i,a=0;
lcd1602_clear();
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
key=18; //避免和下面的WHILE语句条件冲突;临时改变KEY 只变一次
while(key!=15 )
{
key=getkey_ii();
if(key==0)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+1;
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
xianshu(a);
//lcd1602_wrcmd(offset+0x40);
// for(i=0;i<11;i++) lcd1602_wrdata(str12[i]);
}
else if (key==1)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+2;
xianshu(a);
//lcd1602_wrcmd(offset+0x40);
//for(i=0;i<15;i++) lcd1602_wrdata(str22[i]);
}
else if (key==2)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+3;
xianshu(a);
// lcd1602_wrcmd(offset+0x40);
// for(i=0;i<15;i++) lcd1602_wrdata(str31[i]);
}
else if (key==4)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
a=a*10+4;
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
xianshu(a);
}
else if (key==5)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+5;
xianshu(a);
}
else if (key==6)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+6;
xianshu(a);
}
else if (key==8)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+7;
xianshu(a);
}
else if (key==9)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+8;
xianshu(a);
}
else if (key==10)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+9;
xianshu(a);
}
else if (key==13)
{
lcd1602_clear();
lcd1602_wrcmd(offset+0x00);
for(i=0;i<16;i++) lcd1602_wrdata(d[i]);
lcd1602_wrcmd(offset+0x40); //换行
a=a*10+0;
xianshu(a);
}
}
return a;
}
/*****************TLC0838驱动程序***********************/
uint adc_tlc0838(uchar channel)
{
uchar t,i;
uint Temp1=0,Temp2=0;
if (channel==0) t=0;
else if(channel==1) t=1;
else if(channel==2) t=4;
else if(channel==3) t=5;
else if(channel==4) t=2;
else if(channel==5) t=3;
else if(channel==6) t=6;
else if(channel==7) t=7;
CS=1;
_nop_();_nop_();_nop_();_nop_();
CLK=0;
CS=0; //使AD通道打开
DI = 1; //Start bit=1
CLK = 1;
_nop_();
_nop_();
CLK=0;
CS=0;
DI = 1;
CLK = 1;
_nop_();
_nop_();
for(i=0;i<3;i++)
{
CLK = 0;
_nop_();
_nop_();
if(t&1)DI=1;
else DI=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -