
#include <reg52.h>
#include <math.h>
#define lcd_data P1
sbit cs1=P2^3
sbit cs2=P2^4
sbit di=P2^0
sbit rw=P2^1
sbit e=P2^2
void delay(int t)
{
int i,j,k
for(i=0i<ti++)
{ for(j=0j<255j++)
k++}
}
void write_com_l(unsigned int command)
{
cs1=1
rw=0
di=0
lcd_data=command
e=1
e=0
cs1=0
}
void write_data_l(unsigned int data0)
{
cs1=1
rw=0
di=1
lcd_data=data0
e=1
e=0
cs1=0
}
void write_com_r(unsigned int command)
{
cs2=1
rw=0
di=0
lcd_data=command
e=1
e=0
cs2=0
}
void write_data_r(unsigned int data0)
{
cs2=1
rw=0
di=1
lcd_data=data0
e=1
e=0
cs2=0
}
void disp0()
{
unsigned int i,j
for (i=0i<8i++)
{write_com_l(0xb8+i)
write_com_r(0xb8+i)
write_com_l(0x40)
write_com_r(0x40)
for (j=0j<64j++)
{write_data_l(0xaa)
write_data_r(0xaa)
}
}
}
void disp1()
{
unsigned int i,j
for (i=0i<8i++)
{write_com_l(0xb8+i)
write_com_r(0xb8+i)
write_com_l(0x40)
write_com_r(0x40)
for (j=0j<64j++)
{write_data_l(0x55)
write_data_r(0x55)
}
}
}
void disp2()
{
unsigned int i,j
for (i=0i<8i++)
{write_com_l(0xb8+i)
write_com_r(0xb8+i)
write_com_l(0x40)
write_com_r(0x40)
for (j=0j<64j++)
{write_data_l(0x0f)
write_data_r(0x0f)
}
}
}
void disp3()
{
unsigned int i,j
for (i=0i<8i++)
{write_com_l(0xb8+i)
write_com_r(0xb8+i)
write_com_l(0x40)
write_com_r(0x40)
for (j=0j<64j++)
{write_data_l(0xf0)
write_data_r(0xf0)
}
}
}
void init_lcd() //初始化LCD清屏
{
write_com_l(0x3e)
write_com_r(0x3e)
write_com_l(0x3f)
write_com_r(0x3f)
write_com_l(0xc0)
write_com_r(0xc0)
write_com_l(0xb8)
write_com_r(0xb8)
write_com_l(0x40)
write_com_r(0x40)
for(1)
{
disp0()
delay(0x0ff)
disp1()
delay(0x0ff)
disp2()
delay(0x0ff)
disp3()
delay(0x0ff)
}
}
void main()
{
IE=0x81
init_lcd()
}
void innt0 () interrupt 0
{
do {}while(1)
}
clude "intrins.h"sbit io_LCD12864_RS = P1^0
sbit io_LCD12864_RW = P1^1
sbit io_LCD12864_EN = P1^2
#define io_LCD12864_DATAPORT P0
#define SET_DATAio_LCD12864_RS = 1
#define SET_INC io_LCD12864_RS = 0
#define SET_READ io_LCD12864_RW = 1
#define SET_WRITE io_LCD12864_RW = 0
#define SET_EN io_LCD12864_EN = 1
#define CLR_EN io_LCD12864_EN = 0
void v_Lcd12864CheckBusy_f( void ) //忙检测函数
{
unsigned int nTimeOut = 0
SET_INC
SET_READ
CLR_EN
SET_EN
while( ( io_LCD12864_DATAPORT &0x80 ) &&( ++nTimeOut != 0 ) )
CLR_EN
SET_INC
SET_READ
}
void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令
{
v_Lcd12864CheckBusy_f()
SET_INC
SET_WRITE
CLR_EN
io_LCD12864_DATAPORT = byCmd
_nop_()
_nop_()
SET_EN
_nop_()
_nop_()
CLR_EN
SET_READ
SET_INC
}
void v_Lcd12864SendData_f( unsigned char byData ) //发送数据
{
v_Lcd12864CheckBusy_f()
SET_DATA
SET_WRITE
CLR_EN
io_LCD12864_DATAPORT = byData
_nop_()
_nop_()
SET_EN
_nop_()
_nop_()
CLR_EN
SET_READ
SET_INC
}
void v_DelayMs_f( unsigned int nDelay ) //延时
{
unsigned int i
for( nDelay >0 nDelay-- )
{
for( i = 125 i >0 i-- )
}
}
void v_Lcd12864Init_f( void ) //初始化
{
v_Lcd12864SendCmd_f( 0x30 ) //基本指令集
v_DelayMs_f( 50 )
v_Lcd12864SendCmd_f( 0x01 ) //清屏
v_DelayMs_f( 50 )
v_Lcd12864SendCmd_f( 0x06 ) //光标右移
v_DelayMs_f( 50 )
v_Lcd12864SendCmd_f( 0x0c )//开显示
}
void v_Lcd12864SetAddress_f( unsigned char x, y )//地址转换
{
unsigned char byAddress
switch( y )
{
case 0 : byAddress = 0x80 + x
break
case 1 : byAddress = 0x90 + x
break
case 2 : byAddress = 0x88 + x
break
case 3 : byAddress = 0x98 + x
break
default :
break
}
v_Lcd12864SendCmd_f( byAddress )
}
void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char *pData )
{
v_Lcd12864SetAddress_f( x, y )
while( *pData != '\0' )
{
v_Lcd12864SendData_f( *pData++ )
}
}
void main( void )
{
v_Lcd12864Init_f()
v_Lcd12864PutString_f( 0,0, "快乐随行")
v_Lcd12864PutString_f( 2,1, "分都不给")
v_Lcd12864PutString_f( 0,2, "*LCD12864ST7920*")
v_Lcd12864PutString_f( 0,3, "辛苦回答了半天")
while( 1 )
}
//如果只是要话一个点的话简单,这里是个串口程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*****LCD接口定义*****/
sbit SID = P1^0 //串行数据
sbit SCLK = P1^1//串行同步时钟
/*****汉字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
}
/*****n(ms)延时子程序*****/
void delayms(uint t) //约延时n(ms)
{
uint i
while(t--)
{
for(i=0i<125i++)
}
}
/*****串行发送一个字节*****/
void SendByte(uchar Dbyte)
{
uchar i
for(i=0i<8i++)
{
SCLK = 0
Dbyte=Dbyte<<1 //左移一位
SID = CY//移出的位给SID
SCLK = 1
SCLK = 0
}
}
/*****写指令*****/
void Lcd_WriteCmd(uchar Cbyte )
{
//delayms(1)
SendByte(0xf8) //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte) //高四位
SendByte(0xf0&Cbyte<<4) //低四位(先执行<<)
}
/*****写数据*****/
void Lcd_WriteData(uchar Dbyte )
{
//delayms(1)
SendByte(0xfa) //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte) //高四位
SendByte(0xf0&Dbyte<<4) //低四位(先执行<<)
}
/*****初始化LCD*****/
void Lcd_Init(void)
{
delayms(3)
Lcd_WriteCmd(0x30) //选择基本指令集
delayms(1)
Lcd_WriteCmd(0x30) //选择8bit数据流
delayms(1)
Lcd_WriteCmd(0x0c) //开显示(无游标、不反白)
delayms(1)
Lcd_WriteCmd(0x01) //清除显示,并且设定地址指针为00H
delayms(2)
}
void pic_Disp(uchar x,uchar y)//显示一个点
{
Lcd_WriteCmd(0x34) //切换到扩充指令,
Lcd_WriteCmd(0x34)//关闭图形显示
Lcd_WriteCmd(0x80+y)//行地址
Lcd_WriteCmd(0x80+x)//列地址,如果是下半屏这里多加8
Lcd_WriteData(0)//写数据 D15-D8
Lcd_WriteData(1)//写数据 D7-D0
Lcd_WriteCmd(0x36)//打开图形显示
}
void main()
{
Lcd_Init()
pic_Disp(1,1)
while(1)
}
给你测试了,行可行
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)