C语言如何编写驱动

C语言如何编写驱动,第1张

准李橘备好相世扰纯应芯片的技术手册。

根据技术手册,配置对应时钟寄存器

如需要中断,配置中断相关寄存器。完成对应的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

的功能,就能可以实现你要求的功能了


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

原文地址: http://outofmemory.cn/yw/12494148.html

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

发表评论

登录后才能评论

评论列表(0条)

保存