求无字库12864液晶显示图像的51单片机程序,C语言版的

求无字库12864液晶显示图像的51单片机程序,C语言版的,第1张

标准的一般都是这个程序

#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)

}

给你测试了,行可行


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11240802.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存