#include <math.h>
#include <reg52.h>
#include <string.h>
sbit RS=P2^3 //注意:一定要看12864液晶模块的资蔽租料,来确定怎样 *** 作
sbit WRD=P2^4
sbit E=P2^5
sbit PSB=P2^0
sbit RES=P2^2
void TransferData(char data1,bit DI)
void delayms(unsigned int n)
void delay(unsigned int m)
void lcd_mesg(unsigned char code *addr1)
//下面来定义要显示的汉字,8*4
unsigned char code IC_DAT[]={
"陈 "
""
""
""
}
unsigned char code IC_DAT2[]={
"爱一个人难却还爱"
"交结朋友可路更宽"
"诚实守信宏知兆加油努力"
"成功做人成功做事"
}
void initinal(void) //初始化,12864有要求的要写猛缓上
{
delay(40)
PSB=1 //并口工作模式
delay(1)
RES=0//复位
delay(1)
RES=1 //复位置高
delay(10)
TransferData(0x30,0)
delay(100)
TransferData(0x30,0)
delay(37)
TransferData(0x08,0)
delay(100)
TransferData(0x10,0)
delay(100)
TransferData(0x0C,0)
delay(100)
TransferData(0x01,0)
delay(10)
TransferData(0x06,0)
delay(100)
}
void main(void)//分两屏来不断显示上面定义的IC_DAT和IC_DAT2汉字
{
while(1)
{
initinal()//调用LCD字库初始化程序
delay(100)
lcd_mesg(IC_DAT)
delayms(240) //延时程序必要的,长与短,自己调节
delayms(240)
initinal()
delay(100)
lcd_mesg(IC_DAT2)
delayms(240)
delayms(240)
}
}
void lcd_mesg(unsigned char code *addr1) //显示汉字函数,8*4=32
{
unsigned char i
TransferData(0x80,0)
delay(100)
for(i=0i<32i++)
{
TransferData(*addr1,1)
addr1++
}
TransferData(0x90,0)
delay(100)
for(i=32i<64i++)
{
TransferData(*addr1,1)
addr1++
}
}
void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据
{
WRD=0
RS=DI
delay(1)
P0=data1
E=1
delay(1)
E=0
}
void delayms(unsigned int n)//延时子程序
{
unsigned int i,j
for(i=0i<ni++)
for(j=0j<2000j++)
}
void delay(unsigned int m)
{
unsigned int i,j
for(i=0i<mi++)
for(j=0j<10j++)
}
#include <reg52.h>#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Nop() _nop_()
/*引脚端口定义*/
sbit LCD12864_RS_PORT = P1^7 /*LCD12864引脚定义*/
sbit LCD12864_RW_PORT = P1^6
sbit LCD12864_E_PORT= P2^3
#define LCD12864_DA_PORT P0
sbit led_en_port = P2^5/*发光二极管寄存器LE引脚*/
sbit sled_en_port = P3^6/*数码管寄存器LE引脚*/
uchar hanzi_buff1[]={" 液晶显示 "}
//////////////////以下是LCD12864驱动程序////////////////
void LCD12864_WaitIdle()
//LCD12864 忙 信号检测
{
LCD12864_DA_PORT = 0xff
LCD12864_RS_PORT = 0
LCD12864_RW_PORT = 1
LCD12864_E_PORT = 1
while((LCD12864_DA_PORT&0x80)==1)/*等待BF 不为困春哗1*/
LCD12864_E_PORT = 0
}
void LCD12864_COM_Write( uchar com_da)
/* 检测忙信号写入命令字
com_da 为待写入的命令字*/
{
LCD12864_WaitIdle()
LCD12864_RS_PORT = 0
LCD12864_RW_PORT = 0
LCD12864_DA_PORT = com_da
LCD12864_E_PORT = 1
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
LCD12864_E_PORT = 0
}
void LCD12864_NoWaitIdle_COM_Write(uchar com_da)
/* 不检测忙信号写森中入命令字
com_da 为待写入的命令汪行字*/
{
LCD12864_RS_PORT = 0
LCD12864_RW_PORT = 0
LCD12864_DA_PORT = com_da
LCD12864_E_PORT = 1
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
LCD12864_E_PORT = 0
}
void LCD12864_Data_Write(uchar da)
/* 数据写入
da 为待写入的8位数据*/
{
LCD12864_WaitIdle()/*检测忙信号*/
LCD12864_RS_PORT = 1
LCD12864_RW_PORT = 0
LCD12864_DA_PORT = da
LCD12864_E_PORT = 1
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
Nop()
LCD12864_E_PORT = 0
}
void lcd_delay_ms(uchar x)
{
uchar j
while(x--){
for(j=0j<125j++)
{}
}
}
void LCD12864_Reset()
/*LCD12864初始化*/
{
lcd_delay_ms(100)/*适当延时待LCD自动复位完成*/
LCD12864_NoWaitIdle_COM_Write(0x30)/*使用8位并口通讯*/
lcd_delay_ms(10)
LCD12864_NoWaitIdle_COM_Write(0x30)/*使用8位并口通讯*/
lcd_delay_ms(10)
LCD12864_NoWaitIdle_COM_Write(0x0c)/*显示开及光标设置*/
lcd_delay_ms(10)
LCD12864_NoWaitIdle_COM_Write(0x01)/*显示清屏*/
lcd_delay_ms(30)
LCD12864_NoWaitIdle_COM_Write(0x06)/*DDRAM的地址计数器(AC)加1*/
lcd_delay_ms(30)
}
void LCD12864_HANZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL)
//ST7920 汉字字符写入
//参数说明: xpos 待写入的X位置
//ypos 待写入的Y位置
//daH 待写入的汉字的高八位 daL待写入的汉字的低八位
{
uchar xy_pos
if((xpos>=8)||(ypos>=4) ) return/*X位置超出显示范围退出*/
if(ypos==0) xy_pos = 0x80 + xpos
else if(ypos==1) xy_pos = 0x90 + xpos/*计算转换地址*/
else if(ypos==2) xy_pos = 0x88 + xpos
else if(ypos==3) xy_pos = 0x98 + xpos
LCD12864_COM_Write(xy_pos)/*写地址*/
lcd_delay_ms(1)
LCD12864_Data_Write(daH)/*写高八位数据*/
lcd_delay_ms(1)
LCD12864_Data_Write(daL)/*写低八位数据*/
lcd_delay_ms(1)
}
//////////////////以上是LCD12864驱动程序////////////////
void main()
{
uchar i
LCD12864_Reset()/*LCD初始化*/
LCD12864_DA_PORT = 0xff /*释放P0端口*/
led_en_port = 0/*关闭发光二极管显示*/
sled_en_port = 0/*关闭数码管显示*/
while(1)
{
for (i=0i<6i++)
LCD12864_HANZI_WRITE(i,0,hanzi_buff1[i*2],hanzi_buff1[i*2+1])
}
}
7920只能驱动32路,12864为两改孝个7920控制,你旁厅想一个一个的卷动必须设置CS1,CS2,加入CS1上屏,CS2,下屏,你先控核启稿制CS1=0,CS2=1然后COM地址加一,32以后,CS2=0,CS1=1然后COM地址加一就搞定欢迎分享,转载请注明来源:内存溢出
评论列表(0条)