
for(num=0num<15num++)
{
write_data(table[i])
delay(5)
}
write_com(0x80+0x40)
{
write_data(table1[i])
delay(5)
}
注意啦:这是另送你的整屏左移
for(num=0num<16num++)
{
write_com(0x18)//整屏左移老则
delay(200)
}
你要的:整屏右移
for(num=0num<16num++)
{
write_com(0x1c)//凳耐整平右移
delay(200)
}
希望对侍粗棚你有用。
①问,RS,RW,E 的设置为 读状态时序 的过程,读出来的数据(数据口P1) 的最高位 刚好即为 液晶的 忙碌 标志位。②问,writecontrol(unsigned condata) 函数 是个 写指令 函数;
③问,空 *** 作 是为了让数据稳定后,才使能 液晶接收数据;
④问,写指令有时间 间隔要求,太频繁的读写会丢码,所以要加延时,三条38指令,是因为安全起见,上电后马上初始化会出现液晶电源不稳而丢码;
⑤问,液晶显示 只在 更新数据 的时候刷新一次即可,液晶会维持内容,无需重复刷新。
⑥附送,③和④问,都是驱动太恶心而造成的结果,好的驱动程序不需如此 *** 作。液晶的时序要求为ns级,单片机的指令周期普遍为us级,根本不需过多累赘。
#include"reg52.h" //包含52头文件
#include"SMC1602A.h" //包含SMC1602A宏定义文件
#define BusyReadCount 10 //读忙标志等待次数
#define SMC1602_Data P0 //定义 数据接口
//sbit SMC1602_VO=P2^4 //定义 VO对比度接口
sbit SMC1602_RW=P2^5 //定义 R/W接口25
sbit SMC1602_RS=P2^6 //定义 RS接口26
sbit SMC1602_E=P2^7 //定义 E接口27
#define SMC1602_En SMC1602_E=1 //使能
#define SMC1602_Dis SMC1602_E=0 //禁止
uchar SMC1602_Read(bit read_type) //1602液晶屏读函数
{
uchar read_data
SMC1602_Dis //禁止使能
SMC1602_RW=ReadOperate //读 *** 作
SMC1602_RS=read_type //读类型:0状态,1数据
SMC1602_En //开启使能
read_data=SMC1602_Data //存储结果
SMC1602_Dis //禁止使能
return read_data //返回结果
}
void SMC1602_WriteByte(bit write_type,uchar write_data) //1602液晶屏读函数
{
uchar i=BusyReadCount
for(ii--) //延时 *** 作,为写 *** 作预留回复时间
while((SMC1602_Read(CommOperate)&BusyState) &&(++i<=BusyReadCount)) //读取忙标志(BusyReadCount次),若均忙中,则不再读取忙标志,直接执行写 *** 作
//while(SMC1602_Read(CommOperate)&BusyState) if(++i>BusyReadCount) return //读取忙标志,若BusyReadCount次均忙中,则不进行写 *** 作
//while(SMC1602_Read(CommOperate)&BusyState) //禅铅等待空闲(死等)
SMC1602_Dis //禁止使能
SMC1602_RW=WriteOperate //写 *** 作
SMC1602_RS=write_type //写类型:0指令,1数据
SMC1602_Data=write_data //写 *** 作,将 *** 作数送的数据口
SMC1602_En //开启使能
SMC1602_Dis //禁止使能
}
void SMC1602_WriteCGRAM(uchar *write_buf,uchar start_loca,uchar word_num,uchar start_addr) //SMC1602写CGRAM函数,用于自定义字符
{
uchar i,j
write_buf+=start_loca //指向"需写入数据数组"的起始位置
SMC1602_WriteByte(CommOperate,CGRAMAddr|start_addr<<3) //写CGRAM *** 作,并将CGRAM起始地址设为 start_addr
for(j=0j<word_numj++) //自定义字符数量
for(i=0i<8i++) SMC1602_WriteByte(DataOperate,*write_buf++) //写入贺衫好一个自定义字符塌春8个字节数据
}
void SMC1602_Init() //1602液晶屏初始化函数
{
uint i
SMC1602_WriteByte(CommOperate,DisplayMode) //显示模式设置:16×2显示,5×7点阵,8位数据接口
SMC1602_WriteByte(CommOperate,ScreenMode|ScreenOn) //光标模式设置:开启整体显示,开启光标显示,开启光标闪烁
SMC1602_WriteByte(CommOperate,InputMode) //输入方式设置:关闭整屏移动,开启光标正移动(+1)
SMC1602_WriteByte(CommOperate,CleanLCD) //清屏,复位光标
SMC1602_WriteByte(CommOperate,FirstCol) //定位第一行
for(i=150ii--) //等待电源稳定,否则写CGRAM数据(自定义字符)时容易丢失,uint执行周期长,用uchar将会缩短时间,不足以稳定LCD
}
* 1、LCD第一行显示: www.saxmcu.com* LCD第二行显示: SP-28A--DIY
* 2、先将两行字符写入DDRAM中,然后从右至左逐字移出显毕仿示。
* 3、在指定位置停留1.6秒后,闪烁2次,清屏。
* 4、反复循环上述显示方手察纤式。
*******************************************************************
LCD_RS EQU P2.0
LCD_RW EQU P2.1
LCD_EN EQU P2.2
*******************************************************************
ORG 0000H
AJMP MAIN
ORG 0030H
*******************************************************************
MAIN:
MOV SP,#60H
ACALL LCD_INIT LCD初始化
MAIN1:
ACALL CLR_LCD 清LCD
MOV A,#90H在第一行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE1 第一行字符串的起始地址没源送入DPTR。
ACALL WRITE
MOV A,#0D0H 在第二行第17列的位置
ACALL LCD_CMD
MOV DPTR,#LINE2 第二行字符串的起始地址送入DPTR。
ACALL WRITE
MOV R3,#10H 向左移动16格
LOOPA:
MOV A,#18H 字符同时左移一格
ACALL LCD_CMD
MOV R5,#03H 延时375MS
ACALL DELAY125MS
DJNZ R3,LOOPA
ACALL DELAY4延时1.6s
ACALL DELAY4
MOV R4,#02H设置闪烁次数
ACALL FLASH 开始闪烁
AJMP MAIN1
LINE1:
DB "www.saxmcu.com",00H
LINE2:
DB "SP-28A--DIY",00H
***************************************************************
LCD初始化设定子程序
***************************************************************
LCD_INIT:
ACALL DELAY5MS延时15MS
ACALL DELAY5MS等待LCD电源稳定
ACALL DELAY5MS
MOV A,#38H 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC 不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC 不进行LCD忙检测
ACALL DELAY5MS
MOV A,#38H 16*2显示,5*7点阵,8位数据
ACALL LCD_CMD_NC 不进行LCD忙检测
ACALL DELAY5MS
MOV A,#08H 显示关
ACALL LCD_CMD进行LCD忙检测
MOV A,#01H 清除屏幕
ACALL LCD_CMD进行LCD忙检测
MOV A,#0CH显示开,关光标
ACALL LCD_CMD 进行LCD忙检测
RET
***************************************************************
清LCD子程序
***************************************************************
CLR_LCD:
MOV A,#01H清除屏幕
ACALL LCD_CMD 进行LCD忙检测
RET
***************************************************************
写指令数据到LCD
RS=L,RW=L,D0-D7=指令码,E=高脉冲
***************************************************************
LCD_CMD:
CALL CHECKBUSY
LCD_CMD_NC:
CLR LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
***************************************************************
写显示数据到LCD
RS=H,RW=L,D0-D7=数据,E=高脉冲
***************************************************************
LCD_WDATA:
ACALL CHECKBUSY
SETB LCD_RS
CLR LCD_RW
MOV P0,A
SETB LCD_EN
NOP
NOP
NOP
NOP
CLR LCD_EN
RET
***************************************************************
检测LCD控制器忙状态
读数据
RS=L,RW=H,E=H,输出:D0-D7=数据
P0.7=1,LCD忙,等待。P0.7=0,LCD闲,可以进行读写 *** 作。
***************************************************************
CHECKBUSY:
PUSH ACC
MOV P0,#0FFH
CLR LCD_RS
SETB LCD_RW
SETB LCD_EN
BUSYLOOP:
NOP
JB P0.7,BUSYLOOP
CLR LCD_EN
POP ACC
RET
***************************************************************
发送字符串子程序
***************************************************************
WRITE:
PUSH ACC
WRITE1:
CLR A
MOVC A,@A+DPTR
JZ WRITE2
INC DPTR
ACALL LCD_WDATA
JMP WRITE1
WRITE2:
POP ACC
RET
***************************************************************
闪烁子程序
***************************************************************
FLASH:
MOV A,#08H关闭显示
ACALL LCD_CMD
ACALL DELAY4
MOV A,#0CH开显示,关闭光标
ACALL LCD_CMD
ACALL DELAY4
DJNZ R4,FLASH
RET
***************************************************************
延时5MS子程序
LCD初始化使用
***************************************************************
DELAY5MS:
MOV R6,#10
DL1:
MOV R7,#249
DL2:
DJNZ R7,DL2
DJNZ R6,DL1
RET
***************************************************************
延时125MS子程序
字符串移动时使用
***************************************************************
DELAY125MS:
DL3:
MOV R6,#250
DL4:
MOV R7,#249
DL5:
DJNZ R7,DL5
DJNZ R6,DL4
DJNZ R5,DL3
RET
***************************************************************
延时800MS子程序
闪烁时使用
***************************************************************
DELAY4:
MOV R5,#40
DL6:
MOV R6,#100
DL7:
MOV R7,#100
DL8:
DJNZ R7,DL8
DJNZ R6,DL7
DJNZ R5,DL6
RET
***************************************************************
END
可以吧?
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)