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

📄 main._c

📁 AVR单片机mega8上的lcm_12832液晶驱动程序
💻 _C
字号:
/**********************************************************************
//ICC-AVR application builder : 2006-6-27 15:04:57
// Target : M8
// Crystal: 3.6864Mhz
//

***********************************************************************/

#include <iom8v.h>
#include <macros.h>

#define uchar unsigned char
#define uint unsigned int

#define	setbit(x,y) (x|=(1<<y))      //set bit y in byte x
#define	clrbit(x,y) (x&=(~(1<<y)))   //clear bit y in byte x

uchar exampl[]="北京";

void ledon(void)
{
   DDRB = (1<<PB2);
   PORTB = (0<<PB2);
}

void ledoff(void)
{
   DDRB = (1<<PB2);
   PORTB = (1<<PB2);
}

//延时
// Delay  n*(5ms)
void delay(uint n)           
{  
     while(n--)
    {
	    uint i = 5236;     //Delay 5ms
	    while(i--);
	};	
}


void delayms(uint i)
{
	while(i--)
	{
		uchar j = 125;//125;//250;
		while(j--);
	}
}

void delayus(uchar i)
{	
	while(i--);
}


void wait(void)
{
	DDRB = ((1<<PB0)|(1<<PB1));
	DDRC = 1<<PC1;
	DDRD = 0xff;
	//PORTD = 0xff;
	PORTB = ((1<<PB0)|(0<<PB1));			//RW = 1 WRITE	RS =0 INSTRUCTION	
	PORTC = (1<<PC1);			//E = 1
	DDRD = 0;
	while(PIND&0x80);
	PORTB = ((0<<PB0)|(0<<PB1));			//RW = 0 WRITE	RS =0 INSTRUCTION
}

void send_i(uchar i)
{	
	DDRB = ((1<<PB0)|(1<<PB1));
	DDRC = 1<<PC1;
	DDRD = 0xff;
	wait();
    PORTB = ((0<<PB0)|(0<<PB1));			//RW = 0 WRITE	RS =0 INSTRUCTION
	PORTD = i;
	//setbit(PORTC,PC1);
	//NOP();
	//clrbit(PORTC,PC1);
	PORTC = (1<<PC1);			//E = 1
	NOP();
	PORTC = (0<<PC1);			//E = 0	
}

void send_d(uchar d)
{
 	DDRB = ((1<<PB0)|(1<<PB1));
	DDRC = 1<<PC1;
	DDRD = 0xff;
	wait();
    PORTB = ((0<<PB0)|(1<<PB1));			//RW = 0 WRITE	RS =1 DATA
	PORTD = d;
	PORTC = (1<<PC1);			//E = 1
	NOP();
	PORTC = (0<<PC1);			//E = 0	
	//setbit(PORTC,PC1);
	//NOP();
	//clrbit(PORTC,PC1);
}

void lw(uchar x,uchar y,uchar d)
{
	send_i(0xB8|y);
	send_i(0x40|x);
	send_d(d);
	//PORTD = 0xff;
}

void lcd_init(void)
{
 	uchar x,y;
	delay(100);		//>40ms  800
	
	send_i(0x30);		//select basic instruction
	delay(10);		//>100us
	send_i(0x30);		//set basic mode
	delay(10);		//>37us
	send_i(0x0c);		//turn on lcd  0c
	delay(10);		//>100us
	send_i(0x01);		//clr screen text
	delay(20);		//>10ms
	send_i(0x06);		//enter dot setup  06
}

void putstring(uchar addr,uchar *str)
{
	uchar j;
	send_i(addr|0x80);
	for(j=0;j<3;j++)
		{
			send_d(exampl[j]);	
		}
}

/*=======================================================
 显示光标定位
=======================================================*/

void locateXY( uchar posx,uchar posy) {

    uchar temp;

	temp = posx & 0xf;
	posy &= 0x1;
	if ( posy )temp |= 0x40;
	temp |= 0x80;
	send_i(temp);
}

/*=======================================================
 按指定位置显示数出一个字符
=======================================================*/
void disponechar(uchar x,uchar y,uchar wdata) {

	locateXY( x, y );				// 定位显示地址
	send_d( wdata );			// 写字符
}

/*=======================================================
 显示字符串
=======================================================*/
void eputstr(uchar x,uchar y, uchar *ptr) {
    uchar i,l=0;
	while (ptr[l] >31){l++;};
	for (i=0;i<l;i++) {
		disponechar(x++,y,ptr[i]);
		if ( x == 16 ){
			x = 0; y ^= 1;
		}
	}
}

void main(void)
{
   ledon();
   lcd_init();
   delay(50);
   eputstr(0,0,exampl);		// 上面一行显示一个预定字符串
   //putstring(0x80,exampl);
   delayus(500000);
   delayus(500000);
   delayus(500000);
   delayus(500000);
   delayus(500000);
   delayus(500000);
   delayus(500000);
   delayus(500000);

   ledoff();
   PORTD = 0;
   while(1);
}

⌨️ 快捷键说明

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