
//****************** bravey ************11.27
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit en=P2^7 //这些管脚要看原理图的,或许我的单片机和你的不一样。
sbit rs=P2^6
sbit rw=P2^5
uchar code d1[]={填入你要现实的字的码值,用取模软件 };
uchar code d2[]={填入你要现实的字的码值,用取模软件 };
void delay(uint z)//延迟函数
{
uint x,y
for(x=zx>0x--)
for(y=0y<110y++)
}
void write_com(uchar com) //送地址函数定义
{
rs=0
rw=0
P0=com
delay(5)
en=1
delay(5)
en=0
}
void write_datt(uchar datt) //送数据
{
rs=1
rw=0
P0=datt
delay(5)
en=1
delay(5)
en=0
}
void lcd_init() //初始化
{
en=0
write_com(0x0c)//整体显示,无光标,不反白
write_com(0x07)//地址指针加一设置,且整体左移
write_com(0x01)//清屏
}
void main()
{
uchar i
lcd_init()
write_com(0x80)//地址指针初始化,第一行显示拼音名字
for(i=0i<13i++)
{
write_datt(d1[i])
delay(20)
}
write_com(0x90)
for(i=0i<9i++)
{
write_datt(d1[i])//高位
write_datt(d2[i])//低位
delay(20)
}
while(1)
}
这是一个简单的12864显示字的程序。LZ可以参考参考
#include <reg52.h>#include <intrins.h>
#include <math.h>
//------------定义接口-------------//
sbit RS=P2^5
sbit RW=P2^6
sbit E=P2^7
sbit RES=P2^1
#define Lcd_Bus P1
// P1 接 LCM
#define uchar unsigned char
#define FIRST_ADDR 0
//定义字符/汉字显示起始位置
/*------------------检查忙位-----------------------------*/
void chk_busy()
{
RS=0
RW=1
E=1
Lcd_Bus=0xff
while((Lcd_Bus&0x80)==0x80)
E=0
}
/*------------------延时子程序-----------------------------*/
void delay(unsigned int t)
{
unsigned int i,j
for(i=0i<ti++)
for(j=0j<10j++)
}
/*------------------写命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
chk_busy()
RS=0
RW=0
E=1
Lcd_Bus=cmdcode
delay(5)
//------------------在数据写入的时候加入适当的延时
E=0
delay(5)
}
/*-------------------写数据到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
chk_busy()
RS=1
RW=0
E=1
Lcd_Bus=Dispdata
delay(5)
//------------------在数据写入的时候加入适当的延时
E=0
delay(5)
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
delay(2000)
write_com(0x30)
delay(10)
//选择基本指令集
write_com(0x30)
//选择8bit数据流
delay(5)
write_com(0x0c)
//开显示(无游标、不反白)
delay(10)
write_com(0x01)
//清除显示,并且设定地址指针为00H
delay(500)
write_com(0x06)
//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay(0)
}
/*------------------显示字符串--------------------------*/
void hzkdis(unsigned char code*s)
{
while(*s>0)
{
write_data(*s)
s++
delay(50)
}
}
/*------------------首屏显示--------------------------*/
void ceshi()
{
write_com(0x01)
//清除显示,并且设定地址指针为00H
delay(5)
write_com(0x80)
//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
hzkdis("中国计量学院")
write_com(0x90)
//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
hzkdis("光电学院")
write_com(0x88)
//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
hzkdis("06光信2")
write_com(0x98)
//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
hzkdis("测试程序")
}
//------------------清整个GDRAM空间----------------------------
void clrgdram()
{
unsigned char x,y
for(y=0y<64y++)
for(x=0x<16x++)
{
write_com(0x34)
write_com(y+0x80)
//行地址
write_com(x+0x80)
//列地址
write_com(0x30)
write_data(0x00)
write_data(0x00)
}
}
//------------------------------------------------------------
void clrscreen()
{
write_com(0x01)
delay(10)
}
unsigned char ReadByte(void)
{
unsigned char byReturnValue
chk_busy()
Lcd_Bus=0xff
RS=1
RW=1
E=0
E=1
byReturnValue=Lcd_Bus
E=0
return byReturnValue
}
//增加画点子程序
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
unsigned char Row,Tier,Tier_bit
unsigned char ReadOldH,ReadOldL
write_com(0x34)
write_com(0x36)
Tier=X>>4
Tier_bit=X&0x0f
if(Y<32)
{
Row=Y
}
else
{
Row=Y-32
Tier+=8
}
write_com(Row+0x80)
write_com(Tier+0x80)
ReadByte()
ReadOldH=ReadByte()
ReadOldL=ReadByte()
write_com(Row+0x80)
write_com(Tier+0x80)
if(Tier_bit<8)
{
switch(Color)
{
case 0 :
ReadOldH&=(~(0x01<<(7-Tier_bit)))
break
case 1 :
ReadOldH|=(0x01<<(7-Tier_bit))
break
case 2 :
ReadOldH^=(0x01<<(7-Tier_bit))
break
default :
break
}
write_data(ReadOldH)
write_data(ReadOldL)
}
else
{
switch(Color)
{
case 0 :
ReadOldL&=(~(0x01<<(15-Tier_bit)))
break
case 1 :
ReadOldL|=(0x01<<(15-Tier_bit))
break
case 2 :
ReadOldL^=(0x01<<(15-Tier_bit))
break
default :
break
}
write_data(ReadOldH)
write_data(ReadOldL)
}
write_com(0x30)
}
void main(void)
{
uchar i,j,colour=1
// uint ADzhi
RW=0
lcdreset()
// ceshi()
clrgdram()
// delay(5000)
clrscreen()
for(i=4i<124i++)
{
j=36-28*sin((i-8)*3.14)
//正弦波显示
DrawPoint(i,j,colour)
}
delay(5000)
while(1)
}
#include "AT89x51.h"#define uchar unsigned char
#define LCD_Data P2 //DO-D7数据总线
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LCD_RS=P0^0//定义引脚
sbit LCD_RW=P0^1
sbit LCD_E=P0^2
sbit LCD_PS=P0^3
uchar show[]="12864液晶测试程序0123456789ABCDEFGHIJKLMNOPQ"
/////////延时程序/////////
void delay(second) //second=1时,延时5ms子程序
unsigned char second
{
unsigned char i,j,k
for(i=secondi>0i--)
for(j=20j>0j--)
for(k=248k>0k--)
}
////////读状态////////
void ReadStatusLCD(void)
{
LCD_E=0 //使能 取消选择
LCD_Data=0xFF
LCD_RS=0 //instruction
LCD_RW=1 //read
LCD_E=1 //使能 选择
while (LCD_Data&0x80) //检测忙信号
LCD_E=0
}
////////写指令////////
void WriteCommandLCD(uchar Command,BuysC) //BuysC为0时忽略忙检测
{
LCD_E=0
if (BuysC) ReadStatusLCD()//根据需要检测忙
LCD_RS=0
LCD_RW=0
LCD_Data=Command
LCD_E=1
LCD_E=0
}
////////写数据////////
void WriteDataLCD(uchar Data,BuysC)
{
LCD_E=0
if (BuysC) ReadStatusLCD()//根据需要检测忙
LCD_RS=1
LCD_RW=0
LCD_Data=Data
LCD_E=1
LCD_E=0
}
void LCDInit(void) //LCD初始化
{
WriteCommandLCD(0x01,1)//清除显示
delay(1)
WriteCommandLCD(0x03,1)//地址归位
delay(1)
WriteCommandLCD(0x0f,1)//开显示
// WriteCommandLCD(0x1c,1)//游标右移
WriteCommandLCD(0x30,1)//基本指令集动作
}
//显示一个汉字
void Display(uchar show[])
{
uchar *p,i=0
p=show
WriteCommandLCD(0x80,1)
while(*p!='\0')
{
WriteDataLCD(*p++,1)
i++
if(i==16) WriteCommandLCD(0x90,1)
else if(i==32) WriteCommandLCD(0x88,1)
else if(i==48) WriteCommandLCD(0x98,1)
}
}
void main(void)
{
LCD_PS=1
delay(8)//启动等待,等LCM讲入工作状态
LCDInit()//LCM初始化
Display(show)
delay(250)
//WriteCommandLCD(0xa7,1)
delay(250)
while(1)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)