N76E003 驱动 UC1705并口屏(8080)

Tips:本文主要代码源于原子哥STM32驱动8080液晶屏代码,在此表示感谢。
点击这里下载UC1705数据手册

通过数据手册可以得知CD引脚其实就是控制命令与数据切换的I/O。在程序中我们使用RS代替
N76E003 驱动 UC1705并口屏(8080)_第1张图片
下图为8080并口连接图
N76E003 驱动 UC1705并口屏(8080)_第2张图片
下图为N76E003引脚分配(因为没钱开板,所以本次全部使用热转印制作测试,故GPIO分配存在不合理的地方)
N76E003 驱动 UC1705并口屏(8080)_第3张图片
其中D0-D7使用下列函数赋值,具体操作就是每次右移一次,到最低位与1进行&运算

void SET_DATA(uchar val)
{
	P04=val&1;
	P03=(val>>1)&1;
	P01=(val>>2)&1;
	P00=(val>>3)&1;
	P10=(val>>4)&1;
	P11=(val>>5)&1;
	P12=(val>>6)&1;
	P13=(val>>7)&1;
}

其次所有的GPIO设置为强推挽模式

P00_PushPull_Mode;				
P01_PushPull_Mode;				
P02_PushPull_Mode;				
P03_PushPull_Mode;				
P04_PushPull_Mode;				
P05_PushPull_Mode;				
P06_PushPull_Mode;				
P07_PushPull_Mode;				
P10_PushPull_Mode;				
P11_PushPull_Mode;				
P12_PushPull_Mode;				
P13_PushPull_Mode;				
P14_PushPull_Mode;				
P15_PushPull_Mode;				
P16_PushPull_Mode;				
P17_PushPull_Mode;				
P30_PushPull_Mode;

下图为UC1705芯片初始化流程
N76E003 驱动 UC1705并口屏(8080)_第4张图片
这里以软复位为例,命令为0XE2
在这里插入图片描述

void LCD_Write_Byte(uchar Cmd,uchar Dat)//根据数据手册进行操作
{   
	LCD_CS=0;  //片选
	LCD_RS=Cmd;//选择是发送命令or数据
	LCD_RD=0;
	LCD_WR=0;
	SET_DATA(Dat);
	LCD_RD=1;
	Timer0_Delay1ms(2);
	LCD_CS=1;
	LCD_RD=0;
}
 LCD_Write_Byte(0,0xE2);//发送软复位命令

其余命令不在此赘述,以下为完整代码

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"


#define uint unsigned int
#define uchar unsigned  char


sbit LCD_CS=P0^5; //片选端口
sbit LCD_RST=P0^6;//复位
sbit LCD_RS=P0^7;//数据/命令切换   C/D
sbit LCD_WR=P3^0;//写数据
sbit LCD_RD=P1^7;//读数据




const uchar Number8X16[]={
/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,


/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,

};




void SET_DATA(uchar val)
{
	P04=val&1;
	P03=(val>>1)&1;
	P01=(val>>2)&1;
	P00=(val>>3)&1;
	P10=(val>>4)&1;
	P11=(val>>5)&1;
	P12=(val>>6)&1;
	P13=(val>>7)&1;
}

/**********************************************************************************
**函数名:void LCD_Write_Byte(u8 Cmd,u8 Dat)
**功能:对LCD12864写命令
**说明:无
**参数: Cmd =0  命令 Cmd=1 数据
**********************************************************************************/
void LCD_Write_Byte(uchar Cmd,uchar Dat)	   //LCD写入函数
{   
	LCD_CS=0;  
	LCD_RS=Cmd;
	LCD_RD=0;
	LCD_WR=0;
	SET_DATA(Dat);
	LCD_RD=1;
	Timer0_Delay1ms(2);
	LCD_CS=1;
	LCD_RD=0;
}


///**********************************************************************************
//**函数名:void LCD_Write_Byte(u8 Cmd,u8 Dat)
//**功能:对LCD12864写命令
//**说明:无
//**参数: Cmd =0  命令 Cmd=1 数据
//**********************************************************************************/
void LCD_Write_Byte80(uchar Cmd,uchar Dat)	   //LCD写入函数
{   
//	u16 para;
	LCD_CS=0;  
  LCD_RS=Cmd;
	LCD_WR=0;
	SET_DATA(Dat);
	Timer0_Delay1ms(2);
	LCD_RD=1;
	Timer0_Delay1ms(2);
	LCD_CS=1;
}

///**********************************************************************************
//**函数名:void LCD_Reset()
//**功能:对LCD12864复位
//**说明:无
//**********************************************************************************/
void LCD_Reset()  //LCD硬件复位
{
	LCD_RST=0;
	Timer0_Delay1ms(50);
	LCD_RST=0;
	Timer0_Delay1ms(50);
	LCD_RST=1;
	Timer0_Delay1ms(50);
}




void LCD_Coor(uchar x, uchar y)	   //LCD坐标控制
{
 LCD_Write_Byte(0,0xb0+y);  //设置页地址
 LCD_Write_Byte(0,(x>>4)+0x10);//设置列地址高4位 
 LCD_Write_Byte(0,x&0x0f);  //设置列地址低4位
}



void LCD_Clr()  //清屏函数
{
   uchar i,j; 
   for(i=0;i<9;i++)
		{ 
			LCD_Coor(0,i); 
			for(j=0;j<132;j++) 
			{ 
				LCD_Write_Byte(1,0x00); 
			}
		}  
}





void LCD_UC1705_Init()
{
  LCD_Reset();
  Timer0_Delay1ms(20);
  LCD_Write_Byte(0,0xE2);  ////软件复位
	Timer0_Delay1ms(20);
	//--表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)--//
  LCD_Write_Byte(0,0xA0);  //ADC select segment direction 
  Timer0_Delay1ms(20);
	//--表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向--//
  LCD_Write_Byte(0,0xC8);  //Common direction 
  Timer0_Delay1ms(20);
	//--表格第9个命令,0xA6为设置字体为黑色,背景为白色---//
	//--0xA7为设置字体为白色,背景为黑色---//
  LCD_Write_Byte(0,0xA2);  // //reverse display
  Timer0_Delay1ms(20);
	//--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//
	LCD_Write_Byte(0,0xA4);  // //normal display
  Timer0_Delay1ms(20);
	//--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//
	LCD_Write_Byte(0,0xA2);  //bias set 1/9
  Timer0_Delay1ms(20);
  //--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
	//--0xF801,选择增压为5X,其实效果差不多--//
	LCD_Write_Byte(0,0xF8);  //Boost ratio set
  Timer0_Delay1ms(20);	
	LCD_Write_Byte(0,0x01);  //x4
  Timer0_Delay1ms(20);	
  //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
	//--选择从0x00到0X3F。用来设置背景光对比度。---/
	LCD_Write_Byte(0,0x81);   //V0 a set
  Timer0_Delay1ms(20);
	LCD_Write_Byte(0,0x23);  //
  Timer0_Delay1ms(20);
  //--表格第17个命令,选择调节电阻率--//
	LCD_Write_Byte(0,0x25);  //Ra/Rb set
  Timer0_Delay1ms(20);
	LCD_Write_Byte(0,0x2F);  //--表格第16个命令,电源设置。--//
  Timer0_Delay1ms(20);
  LCD_Write_Byte(0,0x40); //起始行从第一行开始
  Timer0_Delay1ms(20);
//  LCD_Write_Byte(0,0xB0); 
	
  Timer0_Delay1ms(20);
// LCD_Write_Byte(0,0x10); 
 
   Timer0_Delay1ms(20);
 // LCD_Write_Byte(0,0x00); 
	
  Timer0_Delay1ms(20);
  LCD_Write_Byte(0,0xAF); 	//显示开
  Timer0_Delay1ms(20);
	LCD_Clr();
}


///****************************************************************************/
////函数名称:Disp_Dat(uchar Row,uchar Col,uchar Number,uchar fs)
////函数功能:将显示数据输出到屏幕指定位置显示
////输入参数:low       行地址
////输入参数:Col      列地址
////输入参数:Number    显示数据
////输入参数:fs   显示方式(0,反显,否则正常显示)
////返 回 值:无
///****************************************************************************/
void Disp_Dat(uchar Row,uchar Col,uchar Number,uchar fs)
{
 uchar L_H,L_L;      //列
 uchar Page;         //页
 
 //计算页地址
 Page=0xb0+Row;
 L_H=0x10+(Col>>4);
 L_L=(Col&0x0f);

    LCD_Write_Byte(0,Page);
    LCD_Write_Byte(0,0x1f&L_H); //列地址,高低字节两次写入,从第0 列开始
    LCD_Write_Byte(0,L_L);
 
 if(fs==0)
 {
     LCD_Write_Byte(1,~Number); 
 }
 else
 {
     LCD_Write_Byte(1,Number); 
 }
}

///****************************************************************************/
////函数名称:Disp_Nub8X16(uchar Row,uchar Col,uchar Number,uchar fs)
////函数功能:将25x48点阵数值输出到屏幕指定位置显示
////输入参数:low       行地址
////输入参数:Col      列地址
////输入参数:Number    显示数值
////输入参数:fs   显示方式(0,反显,否则正常显示)
////返 回 值:无
///****************************************************************************/
void Disp_Nub8X16(uchar Row,uchar Col,uchar Number,uchar fs)
{
 uchar i,j;
 uchar Temp;
 const uchar *STR_p;
 
 STR_p=&Number8X16[Number*16];
 for(i=0;i<2;i++)
 {
  for(j=Col;j10)x=0;
		}
}

N76E003 驱动 UC1705并口屏(8080)_第5张图片

你可能感兴趣的:(N76E003,N76E003,单片机,学习)