计算机编程广告没计,单片机电子广告牌系统设计(原理图+源程序+论文)

本文详细介绍了一个基于嵌入式系统的LCD控制程序,涉及宏定义、数据传输、初始化过程、中断服务和字符显示等关键技术。通过#include预处理指令、数据类型定义和串行通信,实现计算机发送数据到LCD的显示。
摘要由CSDN通过智能技术生成

#include

#define uint  unsigned int

#define uchar unsigned char

//#define x1    0x80  //第一行坐标

#define x2    0x88        //第三行坐标

#define x3    0x90        //第二行坐标

//#define x4    0x98        //第四行坐标

#define comm  0                //指令标志

#define dat   1                //数据标志

sbit cs   = P0^0;        //高电平为数据,低电平为指令

sbit std  = P0^1;        //数据输出位

sbit sclk = P0^2;        //时钟

sbit psb  = P0^3;   //H=并口; L=串口;

sbit rst  = P0^4;   //Reset Signal 低电平有效

uchar code tab[]={

"计算机发送数据:"

};

uchar code num[]={

"0123456789ABCDEF"

};

uchar buffer[6];        //接收数据缓冲区

uchar display[12];        //显示数据缓冲器

uchar k=0;

void wr_lcd (uchar dat_comm,uchar content);        // 串行传输数据

void delay (uint us);                                                // 延时

void init_lcd(void);                                            //初始化lcd

void init_serial(void);                                                // 初始化串行中断

void chn_disp(uchar code *chn,uchar j);                //显示汉字或字符

void convert(uchar *point);                                        // 数据转换

void chn_disp1(void);                                                // 显示串口送入数据

void clrram(void);                                                        // 清DDRAM

/******************主程序******************/

void main()

{

SP=0x5f;

init_serial();      //初始化串口

init_lcd();                        //初始化LCD

clrram();                        //清屏

chn_disp(tab,0);          //显示第1行"计算机发送数据:"

while(1)

{

if(k==6)                //6个数据已接收到

{

k=0;

convert(buffer);//转换接收数据缓冲区数据

chn_disp1();        //显示6个接收数据

}

}

}

/****************初始化lcd****************/

void init_lcd(void)

{

rst=1;                                 //液晶复位端无效

psb=0;                                 //串行输出

wr_lcd (comm,0x30);  //基本指令动作

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

delay (100);

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

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

}

/****************初始化串行中断****************/

void init_serial(void)

{

SCON = 0x50;                //8位串行口模式1,允许接收,REN=1

TMOD|= 0x20;                //定时器1工作在模式2

TH1 = 0xfd;                        //波特率位9600,晶振频率位11.0592MHz

TL1 = 0xfd;

ES = 1;             //使能串行口中断

EA = 1;                                //使能全局中断

TR1 = 1;                        //启动定时器1

}

/****************串口中断服务程序****************/

void serial_IT(void) interrupt 4

{

if(RI==1)

{

RI=0;

buffer[k++]=SBUF;//将串口接收数据送入接收数据缓冲区

}

}

/**************显示汉字或字符**************/

void chn_disp(uchar code *chn,uchar j)

{

uchar i;

wr_lcd (comm,0x30);  //基本指令动作

wr_lcd (comm,0x80);         //设定DDRAM地址至00H

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

wr_lcd (dat,chn[j*16+i]);//显示第j行字符

}

/******************数据转换*******************/

void convert(uchar *point)

{

uchar i,j1,j2;

for(i=0;i<6;i++)                        //将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区

{

j1=point[i]/16;                         //高4位

j2=point[i]%16;                  //低4位

display[2*i]=num[j1];        //换算成显示码

display[2*i+1]=num[j2];

}

}

/**************显示串口送入数据**************/

void chn_disp1(void)

{

uchar i;

wr_lcd(comm,0x30);                           //基本指令动作

wr_lcd(comm,x3);                           //设定DDRAM地址至10H

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

{

wr_lcd(dat,display[2*i]);  //将显示码送入第二行显示

wr_lcd(dat,display[2*i+1]);

wr_lcd(comm,x3+2*i+2);

}

wr_lcd(comm,x2);                           //设定DDRAM地址至08H

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

{

wr_lcd(dat,display[2*i+6]);//将显示码送入第三行显示

wr_lcd(dat,display[2*i+7]);

wr_lcd(comm,x2+2*i+2);

}

}

/******************清DDRAM******************/

void clrram(void)

{

wr_lcd (comm,0x30);                           //基本指令动作

wr_lcd (comm,0x01);                           //清除显示,并将DDRAM清零

delay (180);

}

/******************       ******************/

void wr_lcd(uchar dat_comm,uchar content)

{

uchar a,i,j;

delay(50);

a=content;                        //指令码或数据码

cs=1;                                //发送数据

sclk=0;

std=1;                                //发送5个"1",作为数据起始位

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

{

sclk=1;

sclk=0;

}

std=0;                                //发送第6位,R/W=0,写数据

sclk=1;

sclk=0;

if(dat_comm)                //发送第7位RS

std=1;                        //若为高电平,发送数据

else

std=0;                        //若为低电平,发送指令

sclk=1;

sclk=0;

std=0;                                //发送第8位"0"

sclk=1;

sclk=0;

for(j=0;j<2;j++)    //将数据位分两个字节发送

{

for(i=0;i<4;i++)//发送数据高4位或低4位

{

a=a<<1;

std=CY;

sclk=1;

sclk=0;

}

std=0;

for(i=0;i<4;i++)//发送4位"0"

{

sclk=1;

sclk=0;

}

}

}

/******************延时******************/

void delay(uint us)   //delay time

{

while(us--);

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值