表示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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)