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

📄 disp_test.c

📁 ST7920黑白液晶显示器的AVR单片机程序,可以在屏幕任意点开始显示汉字的小程序
💻 C
字号:
#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char
#define uint unsigned int

#define RS PA0									//LCD的RS信号
#define RW PA1									//LCD的RW信号
#define E  PA2									//LCD的E 信号
#define RST PB1									//LCD的RST信号

#define SPEAKER PA4

void delay(uint);								//延时子程序

void MCU_initial(void);					//MCU初始化
void LCD_initial(void);					//LCD初始化
void LcdWrite(uchar rd,uchar data);				//LCD写函数,rd=0表示写命令,=1表示写数据
uchar LcdReadCom(void);					//LCD读命令字
void WriteHz(uchar *ptr,uchar row,uchar col);			//ptr为要显示的字符,row与col为显示起始的行与列,均从0开始

uchar disp1[]="显示测试";
uchar disp2[]="hanar929";

void main()
{
	MCU_initial();
	LCD_initial();
	WriteHz(disp1,2,2);
	WriteHz(disp2,3,1);
}


void MCU_initial()
{
	DDRA = 0xff;				//定义PA口为输出
	DDRC = 0xff;				
	DDRD = 0xff; 
	PORTA = 0xff;
//	PORTC = 0xff;
	PORTD = 0xff;
	PORTA&=~BIT(E);
	PORTA&=~BIT(SPEAKER);
}

void LCD_initial()
{
	PORTB&=~BIT(RST);
	delay(5000);
	PORTB|=BIT(RST);
	LcdWrite(0,0x30);		//LCD设置为基本指令集
	LcdWrite(0,0x02);		//LCD地址归位,游标移至原点
	LcdWrite(0,0x04);		//LCD游标初始化
	LcdWrite(0,0x01);		//清屏
	LcdWrite(0,0x0E);		//LCD开显示
	LcdWrite(0,0x80);		//设置DDRAM地址归零
}

uchar LcdReadCom(void)
{
	uchar data;
	PORTA&=~BIT(RS);  		//PORTA0位置0,即RS=0
	PORTA|=BIT(RW);			//PORTA1位置1,即RW=1					
	PORTA|=BIT(E);			//PORTA2位置1,即E =1
	DDRC&=0x00;
	PORTC|=0x80;
	data = PINC;
	delay(200);
	DDRC=0xff;
	PORTA&=~BIT(E);			//PORTA2位置0,即E =0
	
	return data;
}

void LcdBusy()
{
	uchar busy;
	do{
		busy = LcdReadCom();
	}while(busy&0x80);
 }

void LcdWrite(uchar rd,uchar data)
{
	LcdBusy();
	if(rd == 0)							//command
	  PORTA&=~BIT(RS);			//RS=0
	else PORTA|=BIT(RS);		//RS=1,data
	PORTA&=~BIT(RW);				//RW=0
	DDRC = 0xff;
	PORTC = 0xff;
	NOP();
	PORTC = data;
	PORTA|=BIT(E);					//E =1
	delay(500);
	PORTA&=~BIT(E);					//E =0
}
void WriteHz(uchar *ptr,uchar row,uchar col)			//ptr为要显示的字符,row与col为显示起始的行与列,均从0开始
{
	uchar addr,i;
	switch(row)							//设定显示起始的行号
	{
		case 0: addr = 0x80;break;
		case 1: addr = 0x90;break;
		case 2: addr = 0x88;break;
		case 3: addr = 0x98;break;
		default:addr = 0x80;break;
	}
	addr+=col;
	LcdWrite(0,addr);
	for(i = 0;*(ptr+i) != 0;i++)
		LcdWrite(1,*(ptr+i));
} 

void delay(uint timer)
{
	for(;timer>0;timer--);
}

⌨️ 快捷键说明

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