Tips:本文主要代码源于原子哥STM32驱动8080液晶屏代码,在此表示感谢。
点击这里下载UC1705数据手册
通过数据手册可以得知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_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芯片初始化流程
这里以软复位为例,命令为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;j 10)x=0;
}
}