表示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)
效果是一样的相对来说比较好理解
绝对好用的串口程序sbit SID=P2^1//12864数据
sbit SCLK=P2^2//12864时钟
init()
{
write(0,0x30) //8 位介面,基本指令集
write(0,0x0c) //显示打开,光标关,反白关
write(0,0x01) //清屏,将DDRAM的地址计数器归零
delaynms(10)
write(0,0x80)for(i=0i<16i++) write(1,datas11[i])
write(0,0x90)for(i=0i<16i++) write(1,datas2[i])
write(0,0x88)for(i=0i<16i++) write(1,datas3[i])
write(0,0x98)for(i=0i<16i++) write(1,datas4[i])
}
/**********************12864*************************/
void delaynms(unsigned int di) //延时
{
unsigned int da,db
for(da=0da<dida++)
for(db=0db<10db++)
}
void sendbyte(unsigned char bbyte) //发送一个字节
{
unsigned char i
for(i=0i<8i++)
{
SID=bbyte&0x80//取出最高位
SCLK=1
SCLK=0
bbyte<<=1//左移
}
}
void write(bit start, unsigned char ddata) //写指令或数据
{
unsigned char start_data,Hdata,Ldata
if(start==0) start_data=0xf8 //写指令
else start_data=0xfa //写数据
Hdata=ddata&0xf0 //取高四位
Ldata=(ddata<<4)&0xf0 //取低四位
sendbyte(start_data) //发送起始信号
delaynms(5)//延时是必须的
sendbyte(Hdata) //发送高四位
delaynms(1) //延时是必须的
sendbyte(Ldata) //发送低四位
delaynms(1) //延时是必须的
}
/*void lcdinit(void) //初始化LCD
{
delaynms(10)//启动等待,等LCM讲入工作状态
//PSB=0//串口驱动模式
// RESET=0delaynms(1)RESET=1// 复位LCD
// CS=1
write(0,0x30) //8 位介面,基本指令集
write(0,0x0c) //显示打开,光标关,反白关
write(0,0x01) //清屏,将DDRAM的地址计数器归零
}*/
#include<spce061a.h>#include<bit.h>
#define lcd_sclk P0_8
#define lcd_sid P0_9
void byte_write(char a)
{
char b
lcd_sid=0
lcd_sclk=0
for(b=0b<8b++)
{
if(a&0x0080)
lcd_sid=1
else
lcd_sid=0
lcd_sclk=0
lcd_sclk=1
a=a<<1
*P_Watchdog_Clear=0x0001
}
}
void command(char i) //写指令
{
char a,b
a=0xf8
byte_write(a)
b=i&0x00f0
byte_write(b)
b=i&0x000f
b=b<<4
byte_write(b)
}
void data(char i) //写数据
{
char a,b
a=0xfa
byte_write(a)
b=i&0x00f0
byte_write(b)
b=i&0x000f
b=b<<4
byte_write(b)
}
void init() //初始化
{
command(0x38)
command(12)
command(0x01)
command(0x06)
command(0x80)
}
main()
{
char a
char sj[]="恭喜串口测试成功"
*P_IOA_Dir=0xffff//对a口初始化设置为低电平输出
*P_IOA_Attrib=0xffff
*P_IOA_Data=0xffff
init()
for(a=0a<16a++)
data(sj[a])
while(1)
*P_Watchdog_Clear=0x0001
// dely(1)
}
这个是凌阳61的12864液晶串口驱动。但初始化与写指令,写数据的函数可以移植调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)