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;
}
}