1、1602LCD:即表示一行显示16个字符,共两行。
如果D=0,则LCD上不显示任何东西。
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
**********************************************************************
*/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8); //11111abc a如果高表示从LCD读数据,低
表示往LCD写数据。 b 高表示显示数据,低表示控制指令 c 固定为0
sendbyte(cmdcode & 0xf0); //取cmdcode的高四位
sendbyte((cmdcode << 4) & 0xf0); //取cmdcode的第四位
delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
**********************************************************************
*/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
指 | 指 令 码 | 功 能 | |||||||||
令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
清除
显示
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" |
地址
归位
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 |
显示状态开/关 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
D=1: 整体显示 ON
C=1: 游标ON
B=1:游标位置反白允许
|
进入点
设定
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 |
游标或显示移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | X | X | 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 |
功能
设定
|
0 | 0 | 0 | 0 | 1 | DL | X | RE | X | X |
DL=0/1:4/8位数据
RE=1: 扩充指令操作
RE=0: 基本指令操作
|
设定CGRAM
地址
|
0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 设定CGRAM 地址 |
设定DDRAM
地址
|
0 | 0 | 1 | 0 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 |
设定DDRAM 地址(显示位址)
第一行:80H-87H
第二行:90H-97H
|
读取忙标志和地址 | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 |
写数据到RAM | 1 | 0 | 数据 | 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) | |||||||
读出RAM的值 | 1 | 1 | 数据 |
从内部RAM读取数据D7——D0
(DDRAM/CGRAM/IRAM/GRAM)
|
指 | 指 令 码 | 功 能 | |||||||||
令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
待命
模式
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
进入待命模式,执行其他指令都棵终止
待命模式
|
卷动地址开关开启 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR |
SR=1:允许输入垂直卷动地址
SR=0:允许输入IRAM和CGRAM地址
|
反白
选择
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 选择2行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常 |
睡眠
模式
|
0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X |
SL=0:进入睡眠模式
SL=1:脱离睡眠模式
|
扩充
功能
设定
|
0 | 0 | 0 | 0 | 1 | CL | X | RE | G | 0 |
CL=0/1:4/8位数据
RE=1: 扩充指令操作
RE=0: 基本指令操作
G=1/0:绘图开关
|
设定绘图RAM
地址
|
0 | 0 | 1 |
0
AC6
|
0
AC5
|
0
AC4
|
AC3
AC3
|
AC2
AC2
|
AC1
AC1
|
AC0
AC0
|
设定绘图RAM
先设定垂直(列)地址AC6AC5…AC0
再设定水平(行)地址AC3AC2AC1AC0
将以上16位地址连续写入即可
|
* 文件名 : 串行12864显示.c
* 描述 : 该程序实现了12864以串行的方式进行通信。
* 创建人 : 东流,2009年4月10日
* 版本号 : 2.0
**********************************************************************
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^5; //片选信号
sbit SID=P2^6; //数据信号
sbit SCLK=P2^7; //时钟信号
sbit RST=P2^2; //复位信号
sbit CH = P2^4; //并行、串行选择信号
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
**********************************************************************
*/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
**********************************************************************
*/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
**********************************************************************
*/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8); //11111abc a如果高表示从LCD读数据,低表示往LCD写数据。 b 高表示显示数据,低表示控制指令 c 固定为0
sendbyte(cmdcode & 0xf0); //取cmdcode的高四位
sendbyte((cmdcode << 4) & 0xf0); //取cmdcode的第四位
delay(2);
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : cmdcode
* 输出 : 无
**********************************************************************
*/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : cmdcode
* 输出 : 无
**********************************************************************
*/
void lcdinit()
{
RST = 0;
delay(100);
RST = 1;
delay(20000);
write_com(0x30); //功能设定,001(DL)X(0或RE)XXDL必须为1RE=1:扩展指令集动作,RE=0:基本指令集动作
delay(50);
write_com(0x0c); //卷动地址或IRAM地址选择:0000001SR。SR=1,允许输入垂直卷动地址,SR=0:允许输入IRAM地址
delay(50);
}
/********************************************************************
* 名称 : hzkdis()
* 功能 : 显示字符串
* 输入 : *s
* 输出 : 无
**********************************************************************
*/
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void Test()
{
write_com(0x03);
delay(50);
write_com(0x81); //写地址
hzkdis(" HOT-51");
write_com(0x91);
hzkdis("单片机开发板");
write_com(0x89);
hzkdis(" ");
write_com(0x98);
hzkdis(" 东流电子");
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void Main()
{
CH = 0; //选择是串口
delay(1);
lcdinit();
delay(10);
while(1)
{
Test();
delay(5000);
}
}
* 文件名 : 定时器的使用.c
* 描述 :
* 创建人 : 东流,2009年4月8日
* 版本号 : 2.0
**********************************************************************
*/
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
uchar code IC_DAT[];
uchar code pic1[];
uchar code pic2[];
uchar code pic3[];
sbit RS = P2^5; //并行的指令/数据选择信号
sbit WRD = P2^6; //读写选择信号
sbit E = P2^7; //使能信号
sbit PSB = P2^2; //并/串行接口选择 高为并,低为串
sbit RES = P2^4; //复位,低电平有效
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(uint n);
void DisplayLine(uchar line1,uchar line2);
void DisplayGraphic(uchar code *adder);
void delay(uint m);
void lcd_mesg(uchar code *adder1);
uchar code IC_DAT[]={
" HOT-51 "
" "
" 单片机开发板 "
" 东流电子 "
};
uchar code IC_DAT2[]={
" 白日依山尽, " //0x80
" 欲穷千里目, " //0x90
" 黄河入海流。 " //0x88
//" 更上一层楼。 " //0x98
"一二三四五六七八九十"
};
/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该
函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
**********************************************************************
*/
unsigned char Convert(unsigned char In_Date)
{
unsigned char i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
void initinal(void) //LCD字库初始化程序
{
delay(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
delay(1); //延时
RES=0; //复位
delay(1); //延时
RES=1; //复位置高
delay(10);
TransferData(0x30,0); //Extended Function Set :8BIT设
置,RE=0: basic instruction set, G=0 :graphic display OFF
////功能设定,001(DL)X(0或RE)XXDL必须为1RE=1:扩展指令集动作,RE=0:基
本指令集动作
delay(100); //大于100uS的延时程序
TransferData(0x30,0);
delay(37); ////大于37uS的延时程序
TransferData(0x08,0); //显示状态开/关00001DCB;D=1,整体显示
ON,C=1,游标ON B=1:游标位置ON
delay(100); //大于100uS的延时程序
TransferData(0x10,0); //设定DDRAM,1ACACACACACACACAC,设定
DDRAM地址计数器(AC)
delay(100); //大于100uS的延时程序
TransferData(0x0C,0); //Display Control,D=1,显示开,关闭游
标,关闭游标位置
delay(100); //大于100uS的延时程序
TransferData(0x01,0); //Display Clear清除显示
delay(10); //大于10mS的延时程序
TransferData(0x06,0); //Enry Mode Set,光标从右向左加1位移
动 进入点设置
delay(100); //大于100uS的延时程序
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void initina2(void) //LCD显示图片(扩展)初始化程序
{
delay(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
delay(1); //延时
RES=0; //复位
delay(1); //延时
RES=1; //复位置高
delay(10);
TransferData(0x36,0); //Extended Function Set RE=1:
extended instruction功能设置
delay(100); //大于100uS的延时程序
TransferData(0x36,0); //Extended Function Set:RE=1:
extended instruction set
delay(37); ////大于37uS的延时程序
TransferData(0x3E,0); //EXFUNCTION(DL=8BITS,RE=1,G=1)功能
设置
delay(100); //大于100uS的延时程序
TransferData(0x01,0); //CLEAR SCREEN清屏
delay(100); //大于100uS的延时程序
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void main(void)
{
while(1)
{
initina2(); //调用LCD显示图片(扩展)初始化
程序
DisplayGraphic(pic2); //显示图片2
delayms(200);
initinal(); //调用LCD字库初始化程序
delay(100); //大于100uS的延时程序
lcd_mesg(IC_DAT); //显示中文汉字1
delayms(240);
delayms(240);
initinal(); //调用LCD字库初始化程序
delay(100); //大于100uS的延时程序
lcd_mesg(IC_DAT2); //显示中文汉字2
delayms(240);
delayms(240);
initinal();
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void lcd_mesg(unsigned char code *adder1)
{
unsigned char i;
TransferData(0x80,0); //Set Graphic Display RAM Address设置
DDRAM地址,第一行
delay(100);
for(i=0;i<32;i++)
{
TransferData(*adder1,1); //传输数据
adder1++;
}
TransferData(0x90,0); //Set Graphic Display RAM Address第二行
delay(100);
for(i=32;i<64;i++)
{
TransferData(*adder1,1);
adder1++;
}
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void TransferData(char data1,bit DI) //传送数据或者命令,当DI=0是,
传送命令,当DI=1,传送数据.
{
WRD=0;
RS=DI;
delay(1);
P0=Convert(data1);
E=1;
delay(1);
E=0;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void delayms(unsigned int n) //延时10×n毫秒程序
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<2000;j++);
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void delay(unsigned int m) //延时程序
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
**********************************************************************
*/
void DisplayGraphic(unsigned char code *adder)
{
int i,j;//*******显示上半屏内容设置
for(i=0;i<32;i++) //
{
TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
TransferData(0x80,0); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
TransferData(*adder,1);
adder++;
}
}
//***