准李橘备好相世扰纯应芯片的技术手册。
根据技术手册,配置对应时钟寄存器
如需要中断,配置中断相关寄存器。完成对应的ISR中断搜咐服务程序。
实现对外接口。
** 1602A液晶屏驱动程序** 晶 振 频 率:11.0592M*****************************************/#include <reg51.h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5//定义接口sbit LCM_RW=P3^6sbit LCM_RS=P3^7#define LCM_Data P1//数据接口 void LCM_WriteData(uchar WDLCM)void LCM_WriteCommand(uchar WCLCM,BuysC)uchar LCM_ReadData(void)uchar LCM_ReadStatus(void)void LCM_Init(void)void DisplayOneChar(uchar X, uchar Y, uchar DData)void DisplayListChar(uchar X, uchar Y, uchar code *DData)void Delay5Ms(void)void Delay400Ms(void)uchar code uctech[] = {"1602A"}uchar code net[] = {"www.52c51.com"}void main(void){Delay400Ms()//启动等待,等LCM讲入工作状态LCM_Init()//LCM初始化Delay5Ms()//延时片刻(可不要) DisplayListChar(6, 1, uctech)DisplayListChar(0, 0, net)LCM_ReadData()//测试用句无意义LCM_Data=255while(1)} /****************************1602A写数据函数**************************//*函数原型:void LCM_WriteData(uchar WDLCM)/*函数功能:1602A写数据/*输入参数:要写入的数据/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteData(uchar WDLCM){LCM_ReadStatus()//检测忙LCM_Data = WDLCMLCM_RS = 1LCM_RW = 0LCM_E = 0//若晶振速度太高可以在这后加小的延时LCM_E = 0//延盯正时LCM_E = 1} /****************************1602A写指令函数**************************//*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC)/*函数迟则昌功能:1602A写指令/*输入参数:要写入的指令/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测{if (BuysC) LCM_ReadStatus()//根据需要检测忙码扒LCM_Data = WCLCMLCM_RS = 0LCM_RW = 0LCM_E = 0LCM_E = 0LCM_E = 1} /****************************1602A读数据函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读数据/*输入参数:无/*输出参数:1602A返回的数据/*调用模块:/**********************************************************************/ uchar LCM_ReadData(void){LCM_RS = 1LCM_RW = 1LCM_E = 0LCM_E = 0LCM_E = 1return(LCM_Data)} /****************************1602A读状态函数**************************//*函数原型:uchar LCM_ReadData(void)/*函数功能:1602A读状态/*输入参数:无/*输出参数:1602A返回的状态/*调用模块:/**********************************************************************/ uchar LCM_ReadStatus(void){LCM_Data = 0xFFLCM_RS = 0LCM_RW = 1LCM_E = 0LCM_E = 0LCM_E = 1while (LCM_Data &0x80)//检测忙信号return(LCM_Data)} /****************************1602A初始化函数**************************//*函数原型:void LCM_Init(void)/*函数功能:1602A初始化/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void LCM_Init(void){LCM_Data = 0LCM_WriteCommand(0x38,0)//三次显示模式设置,不检测忙信号Delay5Ms()LCM_WriteCommand(0x38,0)Delay5Ms()LCM_WriteCommand(0x38,0)Delay5Ms()LCM_WriteCommand(0x38,1)//显示模式设置,开始要求每次检测忙信号LCM_WriteCommand(0x08,1)//关闭显示LCM_WriteCommand(0x01,1)//显示清屏LCM_WriteCommand(0x06,1)// 显示光标移动设置LCM_WriteCommand(0x0C,1)// 显示开及光标设置} /******************1602A按指定位置显示一个字符函数**********************//*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示的字符/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1X &= 0xF//限制X不能大于15,Y不能大于1if (Y) X |= 0x40//当要显示第二行时地址码+0x40X |= 0x80// 算出指令码LCM_WriteCommand(X, 0)//这里不检测忙信号,发送地址码LCM_WriteData(DData)} /*******************1602A按指定位置显示一串字符函数*********************//*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)/*函数功能:1602A按指定位置显示一个字符/*输入参数:X坐标 Y坐标 要显示字符串的首地址/*输出参数:无/*调用模块:/**********************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLengthListLength = 0Y &= 0x1X &= 0xF//限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20)//若到达字串尾则退出{if (X <= 0xF)//X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength])//显示单个字符ListLength++X++}}} /********************5ms延时函数************************//*函数原型:void Delay5Ms(void)/*函数功能:5ms延时/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void Delay5Ms(void){unsigned int TempCyc = 5552while(TempCyc--)} /********************400ms延时延时函数************************//*函数原型:void Delay400Ms(void)/*函数功能:400ms延时延时/*输入参数:无/*输出参数:无/*调用模块:/**********************************************************************/ void Delay400Ms(void){uchar TempCycA = 5unsigned int TempCycBwhile(TempCycA--){TempCycB=7269while(TempCycB--)}}#include<reg51.h>#include<intrins.h>
#define uchar unsigned char
#define nop _nop_()
sbit e=P2^0
sbit r_w=P2^1
sbit d_i=P2^2
sbit cs2=P2^3
sbit cs1=P2^4
//void hanzi_dis(uchar x,uchar y,uchar *dd)
//void zifu_dis(uchar x,uchar y,uchar *dd)
void delay(unsigned int ttt)
void wcom(uchar cmd)
void wddr(uchar dat)
void checkbusy()
void cleanscreen()
void lcd_init()
void main()
{
delay(400)
lcd_init()
while(1){
}
}
void delay(unsigned int ttt) // 长延时亩物,ttt为延时的mS数
{
unsigned int aaa
while(ttt--)// 延时约1mS
{
aaa=89
while(aaa--)
}
}
void lcd_init()
{
//delay(15)
cs1=cs2=1
delay(20)
cs1=0
cs2=0
wcom(0xc0)
delay(5)
wcom(0xc0)
delay(5)
wcom(0x3f)
delay(5)
wcom(0xba8)
wcom(0x40)
cleanscreen()
}
void wcom(uchar cmd)
{
checkbusy()
d_i=0
r_w=0
e=0
P0=cmd
e=1
nop
nop
nop
nop
e=0
}
void wddr (uchar dat)
{
checkbusy()
d_i=1
r_w=0
e=0
P0=dat
e=1
nopnop
nopnop
e=0
}
/*void checkbusy ()
{ bit result
e=0
d_i=0
r_w=1
P0=0xff
e=1
nop
nopnop
nop
do {delay(1)
result = (bit)(P0&0x80)}
while(result!=0)
e=0} */
void checkbusy()
{
unsigned char dat
d_i=0
r_w=1
do
{
P0=0x00
e=1
dat=P0
e=0
dat=0x80 &dat //仅当第7位为0时才可 *** 作(判别busy信号)
}while(!(dat==0x00))
}
void cleanscreen() //清屏
{
unsigned char page,i
for(page=0xb8page<0xc0page++)
{
wcom(page)
wcom(0x40)
for(i=0i<64i++)
wddr(0x00)
}
}
/*void hanzi_dis(uchar x,uchar y,uchar *dd)
{
uchar i=0,j=0
uchar temp=0
if(x<64){cs1=0cs2=1}
else{cs1=1cs2=0x=x-64}
for(j=0j<2j++)
{
wcom(0x40+x)
delay(3)
wcom(0xb8+y+j)
delay(3)
for(i=0i<16i++)
{
temp=dd[16*j+i]
wddr(temp)
delay(5)
}
}
}
void zifu_dis(uchar x,uchar y,uchar *dd)
{uchar i,j
if(x<橘败64){cs1=0cs2=1}
else{cs1=1cs2=0x=x-64}
for(j=0j<2j++)
{
wcom(0x40|x)
//delay(3)
wcom(0xb8|y+j)
//delay(3)
for(i=0i<8i++)
{
wddr(dd[8*j+i])
delay(5)
}
}} */
这是初始化程序,
因为ampireLCD12864
是点阵式 所以显示迅伍液文字,要用字模软件,取数据,
仔细研究一下ampireLCD12864
的功能,就能可以实现你要求的功能了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)