有个51单片机关于12864串口显示读写程序求助(c语言)

有个51单片机关于12864串口显示读写程序求助(c语言),第1张

if(a&(1<<(i-1))) RW_SID=1

表示1左移i-1位再于a进行与运算,i=8的情况下i-1=7,1左移7位就是0x80。再跟a与运算(全1出1有0出0)即可获得a的最高位。以此类推可以取出a的所有位。

if(RW_SID==1) dat|=(1<<(i-1))

当RW_SID端口为1时把1左移i-1位跟dat或运算。i=8的情况下1左移i-1位正好是0x80,再经过与运算保存最高位,循环移位再或运算就能读取到全部位保存在dat里面

可以写成

//写部分

if(a&0x80)//取出a的最高位

RW_SID=1//如果是1则输出1

else

RW_SID=0//否则输出0

a<<=1//a整体左移,让第7位补到最高位的位置,循环取出

E_CLK=1

delay(100)

E_CLK=0

delay(100)

//读部分

E_CLK=1

delay(100)

dat<<=1//接收1次数据后左移。第一次为0的情况影响数据

if(RW_SID)//当端口为高的时候

dat++//dat+1相当于dat|=1 当端口为0的时候默认左移最低位是补零的,所以不用管

E_CLK=0//循环8次后第一次接受到的数据就在最高位了

delay(100)

效果是一样的相对来说比较好理解

标准的一般都是这个程序

#include <reg52.h>

#include <math.h>

#define lcd_data P1

sbit cs1=P2^3

sbit cs2=P2^4

sbit di=P2^0

sbit rw=P2^1

sbit e=P2^2

void delay(int t)

{

int i,j,k

for(i=0i<ti++)

{ for(j=0j<255j++)

k++}

}

void write_com_l(unsigned int command)

{

cs1=1

rw=0

di=0

lcd_data=command

e=1

e=0

cs1=0

}

void write_data_l(unsigned int data0)

{

cs1=1

rw=0

di=1

lcd_data=data0

e=1

e=0

cs1=0

}

void write_com_r(unsigned int command)

{

cs2=1

rw=0

di=0

lcd_data=command

e=1

e=0

cs2=0

}

void write_data_r(unsigned int data0)

{

cs2=1

rw=0

di=1

lcd_data=data0

e=1

e=0

cs2=0

}

void disp0()

{

unsigned int i,j

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

{write_com_l(0xb8+i)

write_com_r(0xb8+i)

write_com_l(0x40)

write_com_r(0x40)

for (j=0j<64j++)

{write_data_l(0xaa)

write_data_r(0xaa)

}

}

}

void disp1()

{

unsigned int i,j

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

{write_com_l(0xb8+i)

write_com_r(0xb8+i)

write_com_l(0x40)

write_com_r(0x40)

for (j=0j<64j++)

{write_data_l(0x55)

write_data_r(0x55)

}

}

}

void disp2()

{

unsigned int i,j

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

{write_com_l(0xb8+i)

write_com_r(0xb8+i)

write_com_l(0x40)

write_com_r(0x40)

for (j=0j<64j++)

{write_data_l(0x0f)

write_data_r(0x0f)

}

}

}

void disp3()

{

unsigned int i,j

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

{write_com_l(0xb8+i)

write_com_r(0xb8+i)

write_com_l(0x40)

write_com_r(0x40)

for (j=0j<64j++)

{write_data_l(0xf0)

write_data_r(0xf0)

}

}

}

void init_lcd() //初始化LCD清屏

{

write_com_l(0x3e)

write_com_r(0x3e)

write_com_l(0x3f)

write_com_r(0x3f)

write_com_l(0xc0)

write_com_r(0xc0)

write_com_l(0xb8)

write_com_r(0xb8)

write_com_l(0x40)

write_com_r(0x40)

for(1)

{

disp0()

delay(0x0ff)

disp1()

delay(0x0ff)

disp2()

delay(0x0ff)

disp3()

delay(0x0ff)

}

}

void main()

{

IE=0x81

init_lcd()

}

void innt0 () interrupt 0

{

do {}while(1)

}

#include<reg51.h>

#include<absacc.h>

#define uchar unsigned char

#define datawr 0x1200 //写数据通道

#define comwr 0x1000//写控制命令通道

#define datare 0x1300 //读数据通道

#define comre 0x1100//读忙通道

uchar code disp_data[]={"长沙大学" //第一行,第一页

"11级通信工程一班" //第三行

" 电信系 " //第二行

"抄袭小组" //第四行

"128X64液晶显示器" //第一行,第二页

"测试程序" //第三行

" 07年07月25日 " //第二行

"Tornado "} //第四行

void set12864()

void write_command(uchar command)

void write_page(uchar data_add)

void read_page(uchar data_add)

void delays(uchar cont)

void main()

{

while(1)

{

set12864()//初始化12864

write_page(0) //写入一页数据

read_page(0x30) //读出一页数据到内部RAM

delays(2) //延时2s

write_page(64)//写入下一页数据

delays(2) //延时2s

}

}

//初始化12864子程序

void set12864()

{

write_command(0x30) //功能设定控制字

write_command(0x0c) //显示开关控制字

write_command(0x01) //清除屏幕控制字

write_command(0x06) //进入设定点控制字

}

//写控制命令子程序

void write_command(uchar command)

{

bit flag="1"//12864空闲标志位

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80

XBYTE[comwr]=command //空闲传送控制字

}

//写一页子程序

void write_page(uchar data_add)

{

bit flag="1"//12864空闲标志位

uchar num="64" //64个循环,连续写入32个汉字或是64个西文字符

write_command(0x80)

for(num>0num--)

{

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80

XBYTE[datawr]=disp_data[data_add++]//空闲传送数据

}

}

//读一页子程序

void read_page(uchar data_add)

{

bit flag="1"//12864空闲标志位

uchar num="64" //64个循环,连续写入32个汉字或是64个西文字符

write_command(0x80)

for(num>0num--)

{

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80

DBYTE[data_add++]=XBYTE[datare]//空闲传送数据

}

}

//延时cont秒子程序

void delays(uchar count)

{

unsigned char h,i,j,k

do

{

for(h=5h>0h--)

for(i=4i>0i--)

for(j=116j>0j--)

for(k=214k>0k--)

}while(--count)

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存