📄 main.c
字号:
#include "reg52.h"
#include "lcd1602.h"
#define u16 unsigned int
#define u8 unsigned char
//各按键定义
sbit key_start=P3^2;
sbit key_up=P2^7;
sbit key_down=P2^6;
sbit key_left=P2^5;
sbit key_right=P2^4;
sbit key_tab=P2^3;
sbit key_ok=P2^2;
//输出脚
sbit pulse=P2^0;
sbit P13=P1^3;
//各变量定义
u8 code PN[]={"P:N:"};
u16 data frequent,number,counter;//频率和脉冲数量,频率脉冲计数值
u8 data timerH,timerL;//定时器初值
u8 data freq[4]={"1000"};//频率显示
u8 data numb[4]={"1000"};//脉冲量显示
u8 data orient;//左右键的移位值
u8 data status;//状态标志
bit bdata tab_flag;//tab键状态标志
//系统初始化程序
void Init(void)
{
orient=3;
P13=1;
pulse=0;
counter=0;
status=0;
tab_flag=0;
EA=0;
}
//显示初始化程序
void Disp_Init(void)
{
DisplayListChar(0,0,PN,2);DisplayListChar(2,0,freq,4);//第一行显示
DisplayListChar(0,1,PN+2,2);DisplayListChar(2,1,numb,4);//第二行显示
}
void delay10ms(void) //延时程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void wait_tab(void)//等待开始
{
if(status==0)//等待按tab键
{
key_tab=1;
if(!key_tab)
{
delay10ms();//去键抖
if(!key_tab)//键是否直的被按下
{
while(!key_tab);//等键松开
DisplayListChar(5,0,freq+3,1);//在脉冲个位显示光标并闪动
WriteCommandLCM(0x10,1);
WriteCommandLCM(0x0f,1);
status++;
}
}
key_start=1;//如果开机直接按start键,则跳过设置状态
if(!key_start)
{
delay10ms();//去键抖
if(!key_start) status=3;
}
}
}
void setting(void)//设置频率及脉冲
{
if(status==1)
{
key_tab=1;//频率与数值的切换
if(!key_tab)
{
delay10ms();//去键抖
if(!key_tab)//键是否直的被按下
{
while(!key_tab);//等键松开
tab_flag=!tab_flag;
orient=3;
if(tab_flag==0)
{
DisplayListChar(5,0,freq+3,1);//在脉冲频率个位显示光标并闪动
WriteCommandLCM(0x10,1);
}
else
{
DisplayListChar(5,1,numb+3,1);//在脉冲个数个位显示光标并闪动
WriteCommandLCM(0x10,1);
}
}
}
key_left=1;//左方向键被按下后的处理
if(!key_left)
{
delay10ms();//去键抖
if(!key_left)//键是否直的被按下
{
while(!key_left);//等键松开,光标移位
orient--;
if(orient>3)
{
orient=3;
WriteCommandLCM(0x14,1);
WriteCommandLCM(0x14,1);
WriteCommandLCM(0x14,1);
}
else WriteCommandLCM(0x10,1);
}
}
key_right=1;//右方向键被按下后的处理
if(!key_right)
{
delay10ms();//去键抖
if(!key_right)//键是否直的被按下
{
while(!key_right);//等键松开,光标移位
orient++;
if(orient>3)
{
orient=0;
WriteCommandLCM(0x10,1);
WriteCommandLCM(0x10,1);
WriteCommandLCM(0x10,1);
}
else WriteCommandLCM(0x14,1);
}
}
key_up=1;//上方向键被按下后的处理
if(!key_up)
{
delay10ms();//去键抖
if(!key_up)//键是否直的被按下
{
while(!key_up);//等键松开,光标移位
if(tab_flag==0)
{
freq[orient]++;
if(freq[orient]>'9') freq[orient]='0';
DisplayListChar(orient+2,0,freq+orient,1);
}
else
{
numb[orient]++;
if(numb[orient]>'9') numb[orient]='0';
DisplayListChar(orient+2,1,numb+orient,1);
}
WriteCommandLCM(0x10,1); //显示光标左移
}
}
key_down=1;//下方向键被按下后的处理
if(!key_down)
{
delay10ms();//去键抖
if(!key_down)//键是否直的被按下
{
while(!key_down);//等键松开,光标移位
if(tab_flag==0)
{
freq[orient]--;
if(freq[orient]<'0') freq[orient]='9';
DisplayListChar(orient+2,0,freq+orient,1);
}
else
{
numb[orient]--;
if(numb[orient]<'0') numb[orient]='9';
DisplayListChar(orient+2,1,numb+orient,1);
}
WriteCommandLCM(0x10,1); //显示光标左移
}
}
key_ok=1;//设置完成被按下后的处理
if(!key_ok)
{
delay10ms();//去键抖
if(!key_ok)//键是否直的被按下
{
while(!key_ok);//等键松开
WriteCommandLCM(0x0C,1);
status=2;
}
}
}
}
void wait_start(void)//等待start被按下
{
if(status==2)
{
key_start=1;
if(!key_start)
{
delay10ms();//去键抖
if(!key_start) status=3;
}
key_tab=1;
if(!key_tab)//如果此时再按tab键,则重新设置
{
delay10ms();//去键抖
if(!key_tab)//键是否直的被按下
{
while(!key_tab);//等键松开
DisplayListChar(5,0,freq+3,1);//在脉冲个位显示光标并闪动
WriteCommandLCM(0x10,1);
WriteCommandLCM(0x0f,1);
status=1;
}
}
}
}
void timer_init(void)//定时器初始化
{
if(status==3)
{
frequent=(freq[0]-'0')*1000+(freq[1]-'0')*100+(freq[2]-'0')*10+freq[3]-'0';//计算频率
if(frequent<100)//如果频率小于100,则自动置为100
{
frequent=100;
freq[0]='0';freq[1]='1';freq[2]='0';freq[3]='0';
DisplayListChar(2,0,freq,4);
}
if(frequent>4000)//如果频率大于4000,则自动置为4000
{
frequent=4000;
freq[0]='4';freq[1]='0';freq[2]='0';freq[3]='0';
DisplayListChar(2,0,freq,4);
}
//以下对频率进行修正,使频率更准
if(frequent<540) frequent=frequent*11/10;
else if(frequent<900) frequent=frequent/10*113/10;
else if(frequent<1500) frequent=frequent/10*116/10;
else if(frequent<2400) frequent=frequent/10*121/10;
else if(frequent<3200) frequent=frequent/10*126/10;
else frequent=frequent/10*143/10;
timerH=(65536-500000/frequent)/256;//计算初值
timerL=(65536-500000/frequent)%256;
number=(numb[0]-'0')*1000+(numb[1]-'0')*100+(numb[2]-'0')*10+numb[0]-'0';//计算脉冲个数
if(!number)//如果脉冲个数为0,则自动置1
{
number=1;
numb[0]='0';numb[1]='0';numb[2]='0';numb[3]='1';
DisplayListChar(2,1,numb,4);
}
TMOD=0x01; //定时器0工作在方式1
TH0=timerH; //对定时器赋初值
TL0=timerL;
ET0=1; EA=1;
TR0=1;
status++;
}
}
void timer0() interrupt 1//定时中断服务函数
{
TR0=0;
TH0=timerH; //对定时器赋初值
TL0=timerL;
pulse=!pulse;
counter++;
TR0=1;
if(counter==number*2)
{
TR0 = 0;
TH0=timerH; //对定时器赋初值
TL0=timerL;
delay10ms();
delay10ms();
delay10ms();
delay10ms();
delay10ms();
P13=0;
delay10ms();
delay10ms();
delay10ms();
delay10ms();
delay10ms();
TR0 = 1;
// counter++;//延时约20us
// counter--;
}
else if(counter >= number*4) Init();
}
void main(void)
{
LCMInit();
Disp_Init();
Init();
while(1)
{
wait_tab();
setting();
timer_init();
wait_start();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -