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

📄 1602b_lcd_test.c

📁 用avr的m16产生pwm波控制舵机的程序!
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include "1602LCD.h"
volatile int zkb;
volatile int zq;          
volatile int t1,t2;
uchar n=0,t=0;
void delay_1ms(void); //函数声明,本实验中会用到这两个函数
void delay_nms(unsigned int n);  
/*DS1302函数声明*/
void write_data(uchar addr,uchar data);
uchar read_data(uchar addr);
void init_1302(void);
void init_time(uchar sec,uchar min,uchar hour,uchar day,uchar month,uchar d,uchar year);
//PWM信号产生中断函数
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
//每次触发为20微秒
TCNT2 = 0xF1;           //反转值,理论值为0xEC 但是实测值为0xEF  有点没搞懂  ??

  if((--zq)==0)
  {      
    PORTC^=0B00000001;    //PORTB.0 反转  
    if((PORTC&0x01)==0x01)
	{
      zq=t1; 
    }else
    {
      zq=t2;
    }          
  }
}
void timer2_init(void)//50kHz
{
 //TCCR2 = 0x00; //stop
ASSR=0x00;
TCCR2=0x02;
TCNT2=0xEF;
OCR2=0x00;
}
/************************************************
1302显示子程序
************************************************/
void showtime()
{
 	  uchar s,i,th,tl;
 //1302
     s=read_data(0x8b);
	 tl=s&0x0f;
	  switch(tl)
	  		{
			case 1:LCD_write_string(0,0,"monday");break;
			case 2:LCD_write_string(0,0,"tuesday");break;
			case 3:LCD_write_string(0,0,"wednesday");break;
			case 4:LCD_write_string(0,0,"thursday");break;
			case 5:LCD_write_string(0,0,"friday");break;
			case 6:LCD_write_string(0,0,"saturday");break;
			case 7:LCD_write_string(0,0,"sunday");break;
			}
	  LCD_set_xy(0,1);
	  //year
	  s=read_data(0x8d);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  //LCD_write_char(0,th+48);
      LCD_write_char(0,tl+48);
	  LCD_write_char(0,'/');
	  //month
   	  s=read_data(0x89);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(0,th+48);
      LCD_write_char(0,tl+48);
	  LCD_write_char(0,'/');
	  //day
   	  s=read_data(0x87);
	  tl=s&0x0f;
   	  th=(s>>4);
      LCD_write_char(0,th+48);
      LCD_write_char(0,tl+48);
	  //LCD_write_char(0,' ');
	  LCD_write_char(0,' ');
	  // LCD_set_xy(0,1);
	  //hour
   	  s=read_data(0x85);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(0,th+48);
      LCD_write_char(0,tl+48);
	  LCD_write_char(0,':');
	  //min
   	  s=read_data(0x83);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(0,th+48);
      LCD_write_char(0,tl+48);
	  LCD_write_char(0,':');
	  //sec
   	  s=read_data(0x81);
	  tl=s&0x0f;
   	  th=(s>>4);
   	  LCD_write_char(0,th+48);
      LCD_write_char(0,tl+48);
     //date
}
//////////////////////////////////////////////////////////////
//k1接pd0 k2接pd1 k3接pd2
/*void settime()
{
uchar dout=0,i,j,k;
ret:;
PORTC  = 0x00;
DDRC  = 0xff;
write_data(0x8e,0x00);      //关闭寄存器写保护
dout=PINC;
i=((dout&0x40)==0x40);
delay_nms(100);
if(i)
{
n++;
t=0;
LCD_write_char(0x10,0);//光标自动右移
if(n==15)n=0;}
 switch(n)
	  {
		case 1 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
		      { t++;
			   write_data(0x80,((read_data(0x81))&0xf0)|t);;
			   LCD_set_xy(1,1);
			   k=((read_data(0x81))&0xf0);
			   LCD_write_char(0,k+48);
				 break;//0
			  }
		       
				//else goto ret;
		case 2 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			    write_data(0x80,((read_data(0x81))&0x0f)|(t<<4));
				LCD_set_xy(2,1);
				k=(read_data(0x81));
				k=(k>>4);
				LCD_write_char(0,k+48);
				break;
			  }
				//else goto ret;
		case 4 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			   write_data(0x82,((read_data(0x83))&0xf0)|t);
			   LCD_set_xy(4,1);
			   k=((read_data(0x83))&0xf0);
			   LCD_write_char(0,k+48);
				break;
			  }
		case 5 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			    write_data(0x82,((read_data(0x83))&0x0f)|(t<<4));
				LCD_set_xy(5,1);
				k=(read_data(0x83));
				k=(k>>4);
				LCD_write_char(0,k+48);
				break;
			  }
		case 7 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			    write_data(0x84,((read_data(0x85))&0xf0)|t);
				LCD_set_xy(7,1);
				k=((read_data(0x85))&0xf0);
			   LCD_write_char(0,k+48);
				break;
			  }
		case 8 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			    write_data(0x84,((read_data(0x85))&0x0f)|(t<<4));
				LCD_set_xy(8,1);
				k=(read_data(0x85));
				k=(k>>4);
				LCD_write_char(0,k+48);
				break;
			  }
		case 10 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			   write_data(0x86,((read_data(0x87))&0xf0)|t);
			   LCD_set_xy(10,1);
				k=((read_data(0x87))&0xf0);
			   LCD_write_char(0,k+48);
				break;
			  }
		case 11 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			   write_data(0x86,((read_data(0x87))&0x0f)|(t<<4));
			   LCD_set_xy(11,1);
				k=(read_data(0x87));
				k=(k>>4);
				LCD_write_char(0,k+48);
				break;
			  }
		case 13 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			   write_data(0x88,((read_data(0x89))&0xf0)|t);
			   LCD_set_xy(13,1);
				k=((read_data(0x89))&0xf0);
			   LCD_write_char(0,k+48);
				break;
			  }
		case 14 :dout=PINC;j=((dout&0x80)==0x80);
		      if(j)
			  { t++;
			  write_data(0x88,((read_data(0x89))&0x0f)|(t<<4));
			  LCD_set_xy(14,1);
				k=(read_data(0x89));
				k=(k>>4);
				LCD_write_char(0,k+48);
				break;
			  }
	   else break;
	  }
}*/
void main(void)
  {
     volatile char aa=20,i=0,dout;
     OSCCAL=0X95;
	 /********************************************/
	 CLI();
	 PORTD=0x00;
	 DDRD |= LCD_DATA | LCD_RW;
	 DDRD |= LCD_RS   | LCD_EN;
	 PORTA = 0xc7;//端口设置
     DDRA  = 0xff;
	// PORTC  = 0x00;
     //DDRC  = 0xff;
	 init_1302();
	 init_1302();
	 init_time(0x00,0x58,0x20,0x19,0x04,0x06,0x08);//秒、分、时、日、月、星期、年
	 DDRC|=0x01;      //置为输出
	 PORTC|=0x01;
	 timer2_init();
	 MCUCR = 0x00;
	 GICR  = 0x00;
	 TIMSK = 0x40;
     LCD_init();
	   /*初始化参数*/
	 zkb=1500;    
	 t1=zkb/20;        
	 t2=(20000-zkb)/20; 
	 zq=t1;
// Global enable interrupts
    SEI();
    while(1)
       {
	   //settime();
	    // showtime();
		delay2_nms(100);
         zkb+=aa;
         if(zkb==500||zkb==2500){    //标准应该是1000至2000
          aa=-aa;          
        }
        t1=zkb/20;        
        t2=(20000-zkb)/20;
		//////////////////////////////////////////////
        /* LCD_write_char(0x01,0);      //显示清屏
         LCD_write_string(3,0,"Welcome");
         LCD_write_string(1,1,"www.527dz.com!");
         delay_nms(5000);
         LCD_write_char(0x01,0);      //显示清屏
         LCD_write_string(0,0,"Tel:13308844201");
         LCD_write_string(0,1,"527dz@527dz.com");
         delay_nms(5000);*/
       }
  } 	
void delay2_1ms(void)//1ms延时函数
{
  unsigned int i;
  for (i=0;i<150;i++)
  {
  } 
}   

void delay2_nms(unsigned int n)//延时n毫秒
{
  unsigned int i;
  for (i=0;i<n;i++)//执行n次1毫秒延时
  delay2_1ms(); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -