DD: MOV R2,#8DB0~DB7 转换为 DB7~DB0
DD1: MOV A,DAT1 入口数据在 DAT1 中
RRC A
MOVDAT1,A
MOVA,DAT2
RLC A
MOVDAT2,A
DJNZR2, DD1 出口数据 在 A 或者 DAT2 中
RET
#include <reg52.h>#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
/********************引脚定义********************/
sbitRS =P3^0 //数据指令
sbitRW =P3^1 //读写
sbitE =P3^2 //使能
sbitCSL =P3^3 //左片选
sbitCSM =P3^4 //中片选
sbitCSR =P3^5 //右片选
sbitRST =P3^6
unsigned char Page//页 地址
unsigned char Col //列 地址
unsigned char code BMP1[]
unsigned char code BMP2[]
void Delay(unsigned int MS)
void wtcom(void)
/***************************/
/*检查Busy */
/***************************/
void BusyL(void)
{
CSL= 1
CSM= 0
CSR= 0
wtcom()
}
void BusyM(void)
{
CSL= 0
CSM= 1
CSR= 0
wtcom()
}
void BusyR(void)
{
CSL= 0
CSM= 0
CSR= 1
wtcom()
}
void wtcom(void)
{
RS = 0//指令
RW = 1
P1 = 0xFF //输出0xff以便读取正确
E = 1
_nop_()_nop_()_nop_()
while(P1 &0x80) //Status Read Bit7 = BUSY
E = 0
_nop_()_nop_()_nop_()
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个 *** 作单元位置 */
/********************************************************/
void Locatexy(void)
{
unsigned char x,y
switch (Col&0xc0) /* col.and.0xC0*/
{/*条件分支执行 */
case 0: {BusyL()break}/*左区 */
case 0x40: {BusyM()break}/*中区 */
case 0x80: {BusyR()break}/*右区 */
}
x = Col&0x3F|0x40 /* col.and.0x3f.or.Set Y Address*/
y = Page&0x07|0xB8/* row.and.0x07.or.set Page */
wtcom() /* waitting for enable */
RS = 0//指令
RW = 0//写
P1 = y//设置页面地址
E = 1
_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
wtcom() /* waitting for enable */
RS = 0
RW = 0
P1 = x//设置列地址
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
/***************************/
/*写指令 */
/***************************/
void WriteCommandL( unsigned char CommandByte )
{
BusyL()
P1 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
void WriteCommandM( unsigned char CommandByte )
{
BusyM()
P1 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
void WriteCommandR( unsigned char CommandByte )
{
BusyR()
P1 = CommandByte
RS = 0//指令
RW = 0
E = 1
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
/***************************/
/*读数据 */
/***************************/
unsigned char ReadData( void )
{
unsigned char DataByte
Locatexy()/*坐标定位,返回时保留分区状态不变 */
RS = 1/*数据输出*/
RW = 1/*读入 */
P1 = 0xFF //输出0xff以便读取正确
E = 1/*读入到LCM*/
_nop_()_nop_()_nop_()_nop_()
DataByte = P1 /*数据读出到数据口P1 */
E = 0
_nop_()_nop_()_nop_()_nop_()
return DataByte
}
/***************************/
/*写数据 */
/***************************/
void WriteData( unsigned char DataByte )
{
Locatexy()/*坐标定位,返回时保留分区状态不变 */
RS = 1/*数据输出*/
RW = 0/*写输出 */
P1 = DataByte /*数据输出到数据口 */
E = 1/*写入到LCM*/
_nop_()_nop_()_nop_()_nop_()
E = 0
_nop_()_nop_()_nop_()_nop_()
}
void LcmClear( void )
{
Page = 0
Col = 0
for(Page=0Page<8Page++)
for(Col=0Col<192Col++)
WriteData(0)
}
void LcmInit( void )
{
WriteCommandL(0x3f) //开显示
WriteCommandM(0x3f)
WriteCommandR(0x3f)
WriteCommandL(0xc0) //设置起始地址=0
WriteCommandM(0xc0)
WriteCommandR(0xc0)
WriteCommandL(0x3f) //开显示
WriteCommandM(0x3f)
WriteCommandR(0x3f)
LcmClear()
Col = 0
Page= 0
Locatexy()
}
void LcmPutDots( unsigned char DotByte )
{
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
WriteData( DotByte )
DotByte = ~DotByte
}
}
}
void LcmPutBMP( unsigned char *puts )
{
unsigned int X=0
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
WriteData( puts[X] )
X++
}
}
}
void LcmReverseBMP( void )
{
unsigned char temp
Page = 0
Col = 0
for(Page=0Page<8Page++)
{
for(Col=0Col<192Col++)
{
temp = ReadData() //空读一次
temp = ReadData()
temp = ~temp
WriteData(temp)
}
}
}
void Delay(unsigned int MS)
{
unsigned char us,usn
while(MS!=0)
{
usn = 2 //for 12M
while(usn!=0)
{
us=0xf6
while (us!=0){us--}
usn--
}
MS--
}
}
void Main( void )
{
Delay(200)//等待复位
LcmInit()
LcmClear()
while(1)
{
LcmPutBMP(BMP1)
Delay(1500)
LcmReverseBMP()
Delay(1500)
LcmPutBMP(BMP2)
Delay(1500)
LcmReverseBMP()
Delay(1500)
}
}
更多0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)