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

📄 lcd_rw.c

📁 AVR ICC基于AVR单片机的LCD程序!
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#include <stdlib.h>
#include <eeprom.h>
#include <math.h>
#include "head.h"
#include "headRBHZ.h"

#define MENU 6 

#define fosc 18432000 //晶振8MHZ
#define baud 9600	 //波特率

#define verify1 0x0a
#define verify2 0x46

#define T 490    //检测周期
#define addr 01  //address


#define IN_DBUS()  {DDRB=0x00;PORTB=0xff;}
#define OUT_DBUS() DDRB=0xff
#define LCDDAT   PORTB
#define LCDDATIN PINB
#define DI1  PORTC|=0x01
#define DI0  PORTC&=~0x01
#define RW1  PORTC|=0x02
#define RW0  PORTC&=~0x02
#define E1   PORTC|=0x04
#define E0   PORTC&=~0x04
#define CS1_1 PORTC|=0x08
#define CS1_0 PORTC&=~0x08
#define CS2_1 PORTC|=0x10
#define CS2_0 PORTC&=~0x10
#define REST1 PORTC|=0x20
#define REST0 PORTC&=~0x20

#define K1   !(PIND&0x40)
#define K3   !(PIND&0x20)
#define K2   !(PIND&0x10)
#define K4   !(PIND&0x08)
#define out1 {PORTD&=~0x08; PORTD|=0x04;}
#define out0 {PORTD&=~0x04; PORTD|=0x08;}

uchar LCD_X,LCD_Y;
uchar menu,C,CH,LINK,OUT,on,menu,v;
unit menu1,limup,limdown;
uchar h=0;
uchar dat[5]={0};
unit dat1;


void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0xFF;
 PORTC = 0x00; //m103 output only
 DDRC  = 0xFf;
 PORTD = 0xf0;
 DDRD  = 0x0c;
}

//Watchdog initialize
// prescale: 1024K
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
}



//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL=(fosc/16/(baud+1))%256;
 UBRRH=(fosc/16/(baud+1))/256;
 UCSRB = 0x98; 
}


unsigned long adc_rel[8];//AD转换结果
unsigned char adc_mux;//AD通道

//ADC initialize
// Conversion time: 3uS
void adc_init(void)
{
 ADCSR = 0x00; //disable adc
 ADMUX = 0x40; //select adc input 0  00-ref  01-avcc 11-2.56
 ACSR  = 0x80;
 ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;//64分频
}


unit adc(uchar mux)          ///*****检测信号*****///
{
 ADMUX=(1<<REFS0)|(mux&0x0f);
 ADCSRA|=0x40;
 del(500);
return(ADC);
}

unit cw(uchar CH,uchar n)
{
ulong dat1=0;
uchar i;
 for(i=0;i<n;i++)
  {
  dat1+=adc(CH);
  }
return dat1=dat1/n;
}


//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 uart0_init();
 adc_init();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}




/*  		字符输出函数 		 */
void putchar(unsigned char c)
	{	 
     while (!(UCSRA&(1<<UDRE))) WDR();
	 UDR=c; 
     }

			
/*			字符串输出函数	   	 */	
void puts(void)
	{
	uchar a=0,i=0;
	UCSRB=0x88;
	putchar(123);	
	putchar(verify2);
	while (i<5)
		{
		  putchar(*(dat+i));  
		  a^=(*(dat+i));
		  i++;
		}		
   putchar(a);
  UCSRB=0x00;
   }
	

void output(unit dd)
{
uchar i,j,tn[5];
unit div=10000;
for(j=5;j>0;j--)
 {
 tn[j-1]=dd/div;
 dd%=div;
 div/=10;
 }
for(j=4;j>0;j--)
 {
 if(tn[j]<1||tn[j]>9) tn[j]=15;
 else { break;}
 }
     for( i=0;i<5;i++)
     dat[i]=tn[4-i]+0x30;		  
}

	


	


/*************LCD***************/


void writelcd(uchar dat)
{
E0;         del(1);
RW0;        del(1);
E1;         del(1);
OUT_DBUS(); del(3);
LCDDAT=dat; del(3);//PORTD&=~0xc0; PORTD|=(0xc0&dat); 
E0;         del(3);
WDR();
}

void writelcdcon(uchar dat)
{
DI0;
CS1_1;CS2_1;
writelcd(dat);
}

void writelcddat(uchar dat)
{
DI1;
writelcd(dat);
}

void restlcd(void)
{
REST1;
delay(1);
REST0;
delay(1);
REST1;
}

void lcdon(void)
{
DI0;
CS1_1;CS2_1;
writelcd(0x3f);
}

void lcdoff(void)
{
DI0;
CS1_1;CS2_1;
writelcd(0x3E);
}

void fromx(uchar dat)
{
DI0;
CS1_1;CS2_1;
writelcd(dat|0xC0);
}

void sety(uchar dat)
{
DI0;
writelcd(0xB8|dat);
}

void setx(uchar dat)
{
if(dat<64)
 {CS1_1;CS2_0;}
else 
 {CS1_0;CS2_1;dat-=64;}
DI0;
writelcd(0x40|dat);
}

void w8(uchar x,uchar y,uchar dat)
{
setx(x);
sety(y); 
writelcddat(dat);
WDR();
}

void clrlcd(void)
{
uchar i,j;
for(j=0;j<8;j++)
 for(i=0;i<128;i++)
 {
 w8(i,j,0x0);
 }
}


void clr_row(uchar row,uchar a,uchar b)
{
uchar i;
CS1_1,CS2_1;
for(i=a;i<b;i++)
 w8(i,row,0);
}

uchar dis_en(uchar x,uchar y,uchar c)
{
uchar i;
	const uchar *p;
	//*取指针
	if(c>='A'&&c<='Z')
	{
		p=&A_Z[(c-'A')*5];
	}
	else if (c>='a' && c<='z')
	{
		p=&a_z[(c-'a')*5];
	}
	else if (c>='0' && c<='9')
	{
		p=&num0_9[(c-'0')*5];
	}
	else
	{
		switch (c)
		{
			case '.':p=x_p;break;
			case ':':p=x_mh;break;
			case '_':p=x_ds;break;
			case '^':p=x_shang;break;
			case '~':p=x_xia;break;
			case '/':p=x_xg;break;
			default:p=space;break;
		}
	}
for(i=0;i<5;i++)
w8(x+i,y,p[i]);	
return x+5;
}


//返回操作后的x(列)坐标值
uchar dis_en_row(uchar x,uchar y,uchar *p)
{
	uchar i,cnt=x;
	for(i=0;p[i]!=0;i++)
	{
		cnt=dis_en(cnt,y,p[i]);
	}
	return cnt;
}


uchar dis_num(uchar x,uchar y,uchar c)
{
uchar i;
 for(i=0;i<5;i++)
  {
  w8(x+i,y,num0_9[(5*c)+i]);//num0_9[c*5+i]);
  } 
 return x+5;
}


uchar dis_5(uchar x,uchar y,unit dat)    
{
uchar num[5]={10};
uchar i,n=0,lock=0,ent=x;
for(i=0;i<5;i++)
 {
 num[i]=dat%10;
 dat/=10;
 }
for(i=5;i>1;i--)
 {
 if((num[i-1]>0&&num[i-1]<10)||(lock==1)) 
  {
   lock=1;
   dis_num(x+n*5,y,num[i-1]);
   n++; 
   ent+=5;
  }
 }
dis_num(x+n*5,y,num[0]);
 return ent+5;
}



		


uchar disen(uchar x,uchar y,uchar ASD)
    {
	uchar i,j;
    ASD=ASD-0x20; 
    for(i=0;i<2;i++) 
	   for(j=0;j<8;j++)
	    {
	     w8(x+j,y+i,ASCII[(unit)ASD*2+i][j]); 
        } 
	return x+8; 
    }

uchar disen_row(uchar x,uchar y,uchar *ASD)  //显示ASCLL字符串
{
uchar k=0,n;
 while(*(ASD+k)!=0x00)
  {  
  n=disen(x+8*k,y,ASD[k]);
	k++;
  }
  return n;
}	

uchar disnum(uchar x,uchar y,uchar ASD)
    {
	uchar i,j;
    ASD=ASD+0x10; 
    for(i=0;i<2;i++) 
	   for(j=0;j<8;j++)
	    {
	     w8(x+j,y+i,ASCII[ASD*2+i][j]); 
        } 
	return x+8; 
    }


uchar dis5(uchar x,uchar y,unit dat)    
{
uchar num[5]={10};
uchar i,n=0,lock=0,ent;
for(i=0;i<5;i++)
 {
 num[i]=dat%10;
 dat/=10;
 }
for(i=5;i>1;i--)
 {
 if((num[i-1]>0&&num[i-1]<10)||(lock==1)) 
  {
   lock=1;
   ent=disnum(x+n*8,y,num[i-1]);
   n++;   
  }
 }
ent=disnum(x+n*8,y,num[0]); 
 return ent;
}

	
uchar dis_hz(uchar x,uchar y,const uchar  *hz)
   {
   uchar i;
   uchar t[32];
   for(i=0;i<32;i++)
    t[i]=hz[i];
   for(i=0;i<16;i++)
	w8(i+x,y,t[i]);
   for(i=0;i<16;i++)
	w8(i+x,y+1,t[i+16]);
   return x+16; 
   }
   
//*显示一行汉字,从y开始显示
uchar dis_hz_row(uchar x,uchar row,const uchar **hz)
{
	uchar i,j,n=x;
	for(i=0;hz[i]!=NULL;i++)
	{
		dis_hz(i*16+x,row,hz[i]);
		n+=16;
	}
	return n;
}



//*画点函数
void DRAW_DOT(uchar x,uchar y)   //*128*64*
{
  uchar y_date;
  LCD_Y=y/8;y_date=y%8;y_date=0x01<<y_date;
  LCD_X=x;
  w8(LCD_X,LCD_Y,y_date);  
}


uchar read_x(uchar row, uchar line)//*读制定行,列的数据
{ 	  
	  uchar c;
	  sety(line);
	  setx(row);
	  //*读取数据
	//  IN_DBUS();  /*设置为输入
	  DI1;	  //*数据模式*
	  RW1;	  //*读操作*
	  //*第一次读
	  E0;
	  del(1);	//*延迟1us
	  E1;
	  del(1);
	  E0;
	  del(1);
	  //*第二次读*
	  E0;
	  del(1);	//*延迟1us
	  E1;
	  del(5);
	  c=PIND;
	  E0;
	  del(1);
	  //***********
	  RW0;
	  OUT_DBUS();
	  return c;
}

void write_p(uchar x,uchar y,uchar i)
{
	uchar c;
	//*read_x里面用的参数就是第二屏幕的,置操作第二屏幕*
	c=read_x((uchar)(x>>3),y);
	if(i=='\0')
	{
		c&=~(1<<(x&7));
	}
	else if(i=='\1')
	{
		c|=(1<<(x&7));
	}
	else
	{
		c^=(1<<(x&7));
	}
	w8(y,(uchar)(x>>3),c);

}

void initlcd(void)
{
CS1_1; CS2_1;
restlcd();
lcdoff();
lcdon();
fromx(0);
clrlcd();
}

/*************LCD***************/

/*
当前温度值
传感器设置
下限设置
上限设置
输出设置
通信设置
*/

void wmenu(uchar menu)
 {
 uchar i;
 uchar flash *p1[]={hz_dang,hz_qian,hz_wen,hz_du,hz_zhi,NULL};	
 uchar flash *p2[]={hz_chuan,hz_gan,hz_qi,hz_she,hz_zhi,NULL};	
 uchar flash *p3[]={hz_xia,hz_xian,hz_she,hz_zhi,NULL};	
 uchar flash *p4[]={hz_shang,hz_xian,hz_she,hz_zhi,NULL};	
 uchar flash *p5[]={hz_shu,hz_chu,hz_she,hz_zhi,NULL};	
 uchar flash *p6[]={hz_tong,hz_xin,hz_she,hz_zhi,NULL};	
 clr_row(1,0,128);
 clr_row(0,0,128);
 switch (menu)
		{  
			case 0: disen_row(3,h,"1."); i=dis_hz_row(16,h,p1); disen_row(i+1,h,":");  break;
			case 1: disen_row(3,h,"2."); i=dis_hz_row(16,h,p2); disen_row(i+1,h,":");  break;
			case 2: disen_row(3,h,"3."); i=dis_hz_row(16,h,p3); disen_row(i+1,h,":");  break;
			case 3: disen_row(3,h,"4."); i=dis_hz_row(16,h,p4); disen_row(i+1,h,":");  break;
			case 4: disen_row(3,h,"5."); i=dis_hz_row(16,h,p5); disen_row(i+1,h,":");  break;
			case 5: disen_row(3,h,"6."); i=dis_hz_row(16,h,p6); disen_row(i+1,h,":");  break;
			default:break;	
     	} 
 }
 
void show_v(unit v)
{
uchar i;
clr_row(3,0,128);
clr_row(4,0,128);
i=dis5(30,3,v); 
w8(i+5,3,0x60); 
w8(i+6,3,0x90); 
w8(i+7,3,0x90); 
w8(i+8,3,0x60); 
disen_row(i+10,3,"C");
}
 
void setmenu(unit n)
 { 
 uchar i;
   if(K3)
    {
	 delay(50);
 	 if(K3)
	  {
      menu1++;  if(menu1>=n) menu1=0;
	  i=3;  EEPROM_WRITE(i,menu1);
      delay(50);
	  }
     }
	else
   if(K2)
    {
	 delay(50);
 	 if(K2)
	  {
      menu1--;  if(menu1>=250) menu1=n-1;
	  i=3;  EEPROM_WRITE(i,menu1);
      delay(50);
	  }
     } 
   if(menu1<n)   for(i=0;i<12;i++) w8(18+i,7,x_up[i]);
   if(menu1>0)   for(i=0;i<12;i++) w8(100+i,7,x_down[i]);
 }


void main(void)
{
uchar i,j;
uchar flash *Psta[]={hz_chu1,hz_shi,hz_hua,NULL};	
unit a=1500; 
ulong date;
delay(100);
init_devices(); 


on=EEPROMread(1);
if(on==1) out1 else out0
menu1=EEPROMread(3);
menu=EEPROMread(5);
C=EEPROMread(7);
CH=EEPROMread(9);
LINK=EEPROMread(11);
OUT=EEPROMread(13);
EEPROM_READ(15,limup);
EEPROM_READ(17,limdown);


if(CH==0xff)  
for(i=0;i<20;i++) EEPROMwrite(i,1);


initlcd();
disen_row(16,3,"---WECOME---");
delay(1000);
clrlcd();
i=dis_hz_row(40,3,Psta); 
delay(300);
i=disen(i,3,'.'); 
delay(300);
i=disen(i,3,'.'); 
delay(300);
i=disen(i,3,'.'); 
delay(500);
clrlcd();
wmenu(menu);





while(1)
{
 date=0;
 for(i=0;i<100;i++)
  {
  date+=adc(CH);
  }
 dat1=date/100;
 output(dat1);
 puts();
 wmenu(menu);
 if(dat1>limup)   {on=0,EEPROMwrite(1,on); out0}
 if(dat1<limdown) {on=1,EEPROMwrite(1,on); out1}
  
 clr_row(7,0,120);
 if(on==1)    dis_en_row(60,7,"on");
  else if(on==0)       dis_en_row(58,7,"off");
  
  if(K1)
    {
	 delay(50);
 	 if(K1)
	  {
      menu++;  if(menu>=MENU) menu=0;
 	  EEPROMwrite(5,menu);
	  EEPROMwrite(3,menu1=0);
 	  wmenu(menu); 
      delay(50);
	  }
     }

if(menu==0)  
 {
 show_v(dat1);
 }
else



if(menu==1)  
 {
  menu1=EEPROMread(9);
  setmenu(8);
  CH=menu1;
  EEPROMwrite(9,menu1);
  clr_row(3,0,128);
  clr_row(4,0,128);
   switch (menu1)
		{  
			case 0: i=disen_row(25,3,"1.");  disen_row(i+1,3,"Pt100");  break;
            case 1: i=disen_row(25,3,"2.");  disen_row(i+1,3,"Pt1000");  break;
		    case 2: i=disen_row(25,3,"3.");  disen_row(i+1,3,"R100");  break;
		    case 3: i=disen_row(25,3,"4.");  disen_row(i+1,3,"B1000");  break;
		    case 4: i=disen_row(25,3,"5.");  disen_row(i+1,3,"T100");  break;
		    case 5: i=disen_row(25,3,"6.");  disen_row(i+1,3,"Pt200");  break;
		    case 6: i=disen_row(25,3,"7.");  disen_row(i+1,3,"Pt300");  break;
		    case 7: i=disen_row(25,3,"8.");  disen_row(i+1,3,"Pt400");  break;
		    default:break;	
     	}   
 }
 else
if(menu==2)  
 {
  menu1=limdown;
   setmenu(1800);
    if(K2&&K3)
    {
    menu1=dat1;
	}
   limdown=menu1;
   show_v(menu1);
   EEPROM_WRITE(17,limdown);
 }
 else
if(menu==3)  
 {
  menu1=limup;
   setmenu(1800);
    if(K2&&K3)
    {
    menu1=dat1;
	}  
   limup=menu1;
   show_v(menu1);
   EEPROM_WRITE(15,limup);
 }
 else
if(menu==4)  
 {
  menu1=EEPROMread(13);
  setmenu(3);
  EEPROMwrite(13,menu1);
  clr_row(3,0,128);
  clr_row(4,0,128);
   switch (menu1)
		{  
			case 0: i=disen_row(25,3,"1.");  disen_row(i+1,3,"Current");  break;
            case 1: i=disen_row(25,3,"2.");  disen_row(i+1,3,"Switch");  break;
		    case 2: i=disen_row(25,3,"3.");  disen_row(i+1,3,"Frequency");  break;
		    default:break;	
     	}   
 
 }
 else
if(menu==5)  
 {
  menu1=EEPROMread(11);
  setmenu(6);
  EEPROMwrite(11,menu1);
  setmenu(6);
  clr_row(3,0,128);
  clr_row(4,0,128);
   switch (menu1)
		{  
			case 0: i=disen_row(25,3,"1.");  disen_row(i+1,3,"RS232");  break;
            case 1: i=disen_row(25,3,"2.");  disen_row(i+1,3,"RS485");  break;
		    case 2: i=disen_row(25,3,"3.");  disen_row(i+1,3,"TTL");  break;
		    case 3: i=disen_row(25,3,"4.");  disen_row(i+1,3,"CC_Link");  break;
		    case 4: i=disen_row(25,3,"5.");  disen_row(i+1,3,"MODBUS");  break;
		    case 5: i=disen_row(25,3,"6.");  disen_row(i+1,3,"DMX");  break;
		    default:break;	
     	}   
 }
 
 
delay(100);
}


}



⌨️ 快捷键说明

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