⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 This procedure for lcw write, for single-chip lovers research learning.
💻 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 + -