单片机显示接口c语言程序,12232c液晶显示和8051单片机的接口c语言程序

原标题:12232c液晶显示和8051单片机的接口c语言程序

以下为彭总编写的c语言程序,我用过了!赫赫!!在atmega128中写通讯协议的头四位数字时好像不能分开一位一位的送,而是要把它当作一个16进制的整体移位写入!程序中的comm为写0表示写 的指令,dat为1表示写数据。cs,sclk,std分别为片选、时钟、及数据io口,可用sbit指令定义。

/************lcd初始化程序**************/

void init_lcd (void)

{

wr_lcd (comm,0x30); /*30---基本指令集动作,8位控制接口*/

wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/

delay (80);

wr_lcd (comm,0x06); /*光标的移动方向,光标右移*/

wr_lcd (comm,0x0c); /*开显示,关光标*/

}

/******************LCD显示任意量程序********************/

void eng_disp (uchar x,uchar y,uchar code *eng)

{

uchar i,j;

wr_lcd (comm,0x30);

wr_lcd (comm,0x80); /*第一行的起始地址*/

for(j=0;j

{

for (i=0;i

wr_lcd (dat,eng[j*16+i]);

if((y==2)&&(j==1))

{wr_lcd (comm,0x90);

for (i=0;i<8;i++)

wr_lcd (dat,eng[j*16+i]);

}

}

}

/*********************LCD显示中文(欢迎界面)程序******************/

void chn_disp (uchar code *chn) /*lcd显示中文*/

{

uchar i,j;

wr_lcd (comm,0x30);

wr_lcd (comm,0x80); /*第一行的起始地址*/

j=0;

for (i=0;i<16;i++)

wr_lcd (dat,chn[j*16+i]);

wr_lcd (comm,0x90); //第二行的起始地址

j=1;

for (i=0;i<16;i++)

wr_lcd (dat,chn[j*16+i]);

}

/***************************LCD清内存程序*******************/

void clrram (void) //lcd清内存

{

wr_lcd (comm,0x30);

wr_lcd (comm,0x01);

delay (120);

}

/*************LCD写数据或写命令子程序****************/

void wr_lcd (uchar dat_comm,uchar content) /*lcd写数据*/

{

uchar a,i,j;

delay (40);

a=content; //a为指令代码或者数据

cs=1; //置位cs开始传输数据

sclk=0; //拉低sclk准备给上升沿,发送数据

std=1; //置1

for(i=0;i<5;i++) /*先传输起始字节,首先5个1,sclk的上升沿传输启动*/

{

sclk=1;

sclk=0;

}

std=0; //RW=0;

sclk=1;

sclk=0;

if(dat_comm)

std=1; //如果是数据则RS为1

else

std=0; //如果是控制字则RS为0

sclk=1; //给上升沿,启动传输

sclk=0; //拉低sclk

std=0; //第8位为0,起始字节传输完毕

sclk=1; //给上升沿,启动传输

sclk=0;

for(j=0;j<2;j++) //一个字节分两次发送,第一次发送高四位,后面补4个0,第二次发送低4位,后面同样补4个0

{

for(i=0;i<4;i++) //先传输高4位

{

a=a<<1; //数据循环左移一位,低位补0

std=CY; //把进位进行传输

sclk=1;

sclk=0;

}

std=0;

for(i=0;i<4;i++) //后4位数据为4个0

{

sclk=1;

sclk=0;

}

}

}

/**********************LCD延时程序************************************/

void delay (uint us) //lcd延时时间

{

while(us--);

}

void delay1 (uint ms)

{

uint i,j;

for(i=0;i

for(j=0;j<15;j++)

delay(1);

}

/*********************显示数据位子程序*******************/

void math_disp(uint math)

{ uint k;

uchar i;

uchar j;

k=math;

dispbuf[0]=k/10000; //得到万位数

k=k%10000;

dispbuf[1]=k/1000; //得到千位数

k=k%1000;

dispbuf[2]=k/100; //得到百位数

k=k%100;

dispbuf[3]=k/10; //得到十位数

dispbuf[4]=k%10; //得到个位数

wr_lcd (comm,0x90); //给第二行的起始地址以让数据在第二行显示,

for(i=0;i<5;i++)

{

for(j=0;j<2;j++) //连续显示两个tab2中的字节,LCD自动把这两个字节联系起来显示一个数据

{

wr_lcd(dat,tab2[xs2*dispbuf[i]+j]); //调用显示子函数

}

}

}

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值