N76E003 驅動 UC1705並口屏(8080)

Tips:本文主要代碼源於原子哥STM32驅動8080液晶屏代碼,在此表示感謝。

通過數據手冊可以得知CD引腳其實就是控制命令與數據切換的I/O。在程序中我們使用RS代替
在這裏插入圖片描述
下圖爲8080並口連接圖
在這裏插入圖片描述
下圖爲N76E003引腳分配(因爲沒錢開板,所以本次全部使用熱轉印製作測試,故GPIO分配存在不合理的地方)
在這裏插入圖片描述
其中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_Quasi_Mode;				
P01_Quasi_Mode;				
P02_Quasi_Mode;				
P03_Quasi_Mode;				
P04_Quasi_Mode;				
P05_Quasi_Mode;				
P06_Quasi_Mode;				
P07_Quasi_Mode;				
P10_Quasi_Mode;				
P11_Quasi_Mode;				
P12_Quasi_Mode;				
P13_Quasi_Mode;				
P14_Quasi_Mode;				
P15_Quasi_Mode;				
P16_Quasi_Mode;				
P17_Quasi_Mode;				
P30_Quasi_Mode;

下圖爲UC1705芯片初始化流程
在這裏插入圖片描述
這裏以軟復位爲例,命令爲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;
	
	Test[0]=val&1;
	Test[1]=(val>>1)&1;
	Test[2]=(val>>2)&1;
	Test[3]=(val>>3)&1;
	Test[4]=(val>>4)&1;
	Test[5]=(val>>5)&1;
	Test[6]=(val>>6)&1;
	Test[7]=(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;j<Col+8;j++)
  {
      //Temp=pgm_read_byte(STR_p);//
		Temp=*STR_p;  
		Disp_Dat(Row,j,Temp,fs);
		STR_p++;
  }
  Row++;
 }
}



void main(void)
{
	uint x=0;
P00_Quasi_Mode;				
P01_Quasi_Mode;				
P02_Quasi_Mode;				
P03_Quasi_Mode;				
P04_Quasi_Mode;				
P05_Quasi_Mode;				
P06_Quasi_Mode;				
P07_Quasi_Mode;				
P10_Quasi_Mode;				
P11_Quasi_Mode;				
P12_Quasi_Mode;				
P13_Quasi_Mode;				
P14_Quasi_Mode;				
P15_Quasi_Mode;				
P16_Quasi_Mode;				
P17_Quasi_Mode;				
P30_Quasi_Mode;

	LCD_UC1705_Init();//初始化
	Timer0_Delay1ms(10);
		while(1)
		{		
					Disp_Nub8X16(0,2,x++,0);//執行累加顯示數字
					Timer0_Delay1ms(1000);
					if(x>10)x=0;
		}
}

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章