📄 2.c
字号:
#include<reg52.h>
#include<math.h>
#include <intrins.h>
#include <absacc.h>
#define DB P2 /*LCD8位数据*/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit RS=P1^7; /*LCD RS*/
sbit RW=P1^6; /*LCD RW*/
sbit E=P1^5; /*LCD E */
sbit CLK=P1^0;
sbit SRI=P1^1;
sbit LOAD=P1^2;
long data vout; /*输出*/
uint data add=1; /*粗调细调控制,粗调add为10,细调add为1.*/
ulong data phase;
void delay(int b) /*延时控制程序*/
{int i;
for(i=0;i<b;i++);
}
void sentv (void)
{int i;
LOAD=1;
CLK=0;
SRI=0;
delay(20);
for(i=0;i<12;i++)
{CLK=1;
if(phase&0x800)
SRI=1;
else SRI=0;
delay(5);
CLK=0;
phase=phase<<1;
}
LOAD=0;
delay(5);
LOAD=1;
}
void chav(void) /*调电压子程序*/
{static uchar st;
if(P3^6==0) /*是否按下*/
{delay(200);
if(P3^6==0) vout=0; /*长按fout=0*/
else{if(add==1) add=10; /*安下放开为粗调细调之间切换*/
else add=1;
}
}
if(P3^7&&P3^5) /*增减判断*/
st = 1;
if(st)
{
if(P3^7==0&&P3^5==0)
{
if(P3^7)
{
st = 0;
vout=vout+add; /*增*/
}
if(P3^5)
{
st = 0;
vout=vout-add; /*减*/
}
}
}
if(vout<0) /*下限*/
vout=0;
if(vout>4095) /*上限*/
vout=4095;
}
void clearlcd(void) /*清屏*/
{E=1;
RS=0;
RW=0;
DB=0x01;
delay(1520);
E=0;
}
void Readbusy(void) /*判断是否忙*/
{E=1;
RS=0;
RW=1;
_nop_();
while(DB^7==1) /*忙一直判断*/
{if(DB^7==0)break;} /*不忙跳出*/
E=0;
}
void Write(unsigned c) /*写入LED*/
{RS=1;
RW=0;
E=1;
DB=c;
delay(1);
E=0;
}
void Shift(void) /*左移一位*/
{RS=0;
RW=0;
E=1;
DB=0x1c;
delay(1);
E=0;
}
void Display(void) /*显示*/
{int a;
uchar b;
a=vout/1000;
b=0x30|a;
Readbusy();
Write(b);
Shift();
b=0x2E; /*.*/
Readbusy();
Write(b);
Shift();
a=vout%1000/100;
b=0x30|a;
Readbusy();
Write(b);
Shift();
a=vout%100/10;
b=0x30|a;
Readbusy();
Write(b);
Shift();
a=vout%1000;
b=0x30|a;
Readbusy();
Write(b);
Shift();
b=0x56; /*V*/
Readbusy();
Write(b);
}
void Setlcd(unsigned c) /*设置LED*/
{RS=0;
RW=0;
E=1;
DB=c;
delay(1);
E=0;
}
void Rstlcd(void) /*初始设置*/
{delay(15000);
Setlcd(0x3C); /*SET Function*/
Setlcd(0x34); /*SET Function*/
Setlcd(0x0D); /*Display*/
Setlcd(0x07); /*Shift*/
clearlcd();
}
void Home(void) /*光标复位*/
{RS=0;
RW=0;
E=1;
DB=0x02;
delay(1000);
E=0;
}
void main(void) /*主函数*/
{vout=0;
Rstlcd(); /*初始LCD*/
while(1)
{phase=vout; /*计算出32位的频率值*/
sentv();
Readbusy(); /*判断是否忙*/
clearlcd(); /*清屏*/
Display(); /*显示*/
Home();
chav(); /*光标复位*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -