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

📄 1.c

📁 M8点阵lcd程序实例
💻 C
字号:
#include <avr/io.h>

#define cd PD2
#define rd PD1
#define wr PD0

void delay(int c)
	{
	int i,j;
	for(i=0;i<c;i++)
		for(j=0;j<1000;j++)
			;
	}

char rd_state()	//读状态
	{
	char temp;
	DDRB=0x00;
	PORTD|=(1<<cd);
	PORTD&=~(1<<rd);
	temp=PINB;
	PORTD|=(1<<rd);
	return(temp);
	}

void rd_enable()	//等待可读写
	{
	char temp;
	temp=rd_state();
	while((temp&0x03)!=0x03)
		temp=rd_state();
	}

void rd_auto()	//等待自动读写
	{
	char temp;
	temp=rd_state();
	while((temp&0x04)!=0x04)
		temp=rd_state();
	}

void wr_auto()	//等待自动写
	{
	char temp;
	temp=rd_state();
	while((temp&0x08)!=0x08)
		temp=rd_state();
	}

/*写命令、写数据命令*********************
数据1、数据2、命令、参数个数*************
*****************************************/
void wr_data(char data1,char data2,char cmd,char num)
	{
	char temp;
	temp=num;
	if(temp==2)
		{
		rd_enable();
		DDRB=0xff;
		PORTD&=~(1<<cd);
		PORTB=data1;
		PORTD&=~(1<<wr);
		PORTD|=(1<<wr);
		}
	 if(temp==2||temp==1)
	 	{
		rd_enable();
		DDRB=0xff;
		PORTD&=~(1<<cd);
		PORTB=data2;
		PORTD&=~(1<<wr);
		PORTD|=(1<<wr);
		}
	rd_enable();
	PORTB=0xff;
	PORTD|=(1<<cd);
	PORTB=cmd;
	PORTD&=~(1<<wr);
	PORTD|=(1<<wr);
	}

char rd_data()	//读数据
	{
	char temp;
	rd_enable();
	PORTD&=~(1<<cd);
	PORTD&=~(1<<rd);
	temp=PINB;
	PORTD|=(1<<rd);
	return(temp);
	}

void lcd_init()
	{
	wr_data(0x00,0x00,0x40,0x02);	//设置文本显示首地址
	wr_data(0x14,0x00,0x41,0x02);	//设置文本显示宽度
	wr_data(0x40,0x01,0x42,0x02);	//设置图形显示首地址
	wr_data(0x20,0x00,0x43,0x02);	//设置图形显示宽度
	wr_data(0x00,0x00,0xa7,0x00);	//光标形状设置
	wr_data(0x00,0x00,0x80,0x00);	//显示方式设置,“或”
	wr_data(0x00,0x00,0x9c,0x00);	//显示开关设置
	}

void main()
	{
	char i,temp=0,row=0;
	delay(50);
	DDRD=0x07;
	lcd_init();
	wr_data(0x00,0x00,0x24,0x02);	//设置写地址
	wr_data(0x00,0x00,0xb0,0x00);	//设置自动写方式
	for(i=0;i<127;i++)
		{

		wr_auto();
		DDRB=0xff;
		PORTD&=~(1<<cd);
		PORTB=temp;
		PORTD&=~(1<<wr);
		PORTD|=(1<<wr);
		temp++;
//		P1=temp;
		}
	wr_data(0x00,0x00,0xb2,0x00);	//自动写结束
	wr_data(0x40,0x01,0x24,0x02);	//设置写地址
	wr_data(0x00,0xaa,0xc4,0x01);	//写图像区
	while(1)
		{
/*		wr_data(row,0x00,0x40,0x02);	//设置文本显示首地址
		delay(40);
		row++;
		if(row>126)
			row=100;*/
		}

	}

⌨️ 快捷键说明

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