求夜晶16032的简单程序?
小弟刚接触液晶,那位好新的大哥给我一个简单的参考程序,小弟在这谢谢各位了! sbit LCD_RS = P2^7;sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;
#define uchar unsigned char
#define uintunsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code mytab = {0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00};//℃
/*************************************************************
* 延时子程序 *
* 晶振 11.0592MHz延时为1ms *
*************************************************************/
void delay_ms(uint num)
{
uchar i;
while((num--)!=0)
{
for(i=0;i<115;i++)
{;}
}
}
/*************************************************************
*检查LCD忙状态 *
*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 *
*************************************************************/
bit lcd_busy(void)
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*************************************************************
*写指令数据到LCD *
*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 *
*************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/************************************************************
*写显示数据到LCD *
*RS=H,RW=L,E=高脉冲,D0-D7=数据。 *
************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*自定义字符写入CGRAM*/
voidwritetab(void)
{
uchar i;
lcd_wcmd(0x40); //写CGRAM
for (i = 0; i< 8; i++)
lcd_wdat(mytab);
}
/*LCD初始化设定*/
void lcd_init(void)
{
delay_ms(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay_ms(5);
writetab(); //自定义字符写入CGRAM
delay_ms(5);
}
/*设定显示位置*/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80);//数据指针=80+地址变量
}
/*写字符串函数*/
void write_str(uchar addr,uchar *p)
{
uchar i=0;
lcd_pos(addr);
while(p!='\0')
{
lcd_wdat(p);
i++;
}
}
/*************************************************************
* RS=1,RW=0,写状态寄存器 *
* RS=1,RW=1,读状态寄存器 *
* RS=0,RW=0,写发送寄存器 *
* RS=0,RW=1,读接收数据寄存器 *
*************************************************************/ 【1楼】 depaul123
这个程序用在16032上可以直接运行吧! 给lz程序的就是在害他,连个液晶的手册都没有,驱动芯片都不知道是什么就给他程序。。。。。 【3楼】 pulan
我用的nh16032,可是我写的程序就是显示不出来,弄的我很是个郁闷!所以就来论坛请教一下了. 回复【1楼】depaul123
-----------------------------------------------------------------------
********89C51引脚定义********
RS BIT P3.3
R_W BIT P3.4
E BIT P3.5
DB0_DB7 EQU P1
;*******程序开始******
ORG 0000H
LJMP MAIN
ORG 030H
MAIN: MOV SP,#60H
LCALL INITIAL
LCALL CLS
MOV R4,#64
LCALL SAVE_CGRAM
MOV A,#10000000B
LCALL WRITE_COM
MOV R1,#4
CLR A
LCALL DIS_MAP
MOV A,#11000000B
LCALL WRITE_COM
MOV R1,#4
MOV A,#4
LCALL DIS_MAP
MOV A,#10000100B
LCALL WRITE_COM
MOV DPTR,#LINE0
LCALL DISP
MOV A,#11000100B
LCALL WRITE_COM
MOV DPTR,#LINE1
LCALL DISP
SJMP $
;*******显示字符串到LCM子程序********
DISP: PUSH ACC
DISP_LOOP: CLR A
MOVC A,@A+DPTR
JZ END_DISP
LCALL WRITE_DATA
INC DPTR
SJMP DISP_LOOP
END_DISP: POP ACC
RET
;*******显示图形子程序*****
DIS_MAP:LCALL WRITE_DATA
INC A
DJNZ R1,DIS_MAP
RET
;****** 启动LCM子程序******
INITIAL:MOV A,#00111000B
LCALL WRITE_COM
MOV A,#00001100B
LCALL WRITE_COM
MOV A,#00000110B
LCALL WRITE_COM
RET
;******查询忙碌标志信号子程序******
CHECK_BUSY: PUSH ACC
BUSY_LOOP: CLR E
SETB R_W
CLR RS
SETB E
MOV A, DB0_DB7
CLR E
JB ACC.7,BUSY_LOOP
POP ACC
LCALL DEL
RET
;****** 写指令到LCM子程序******
WRITE_COM: LCALL CHECK_BUSY
CLR E
CLR RS
CLR R_W
SETB E
MOV DB0_DB7,A
CLR E
RET
;****** 写数据到LCM子程序******
WRITE_DATA: LCALL CHECK_BUSY
CLR E
SETB RS
CLR R_W
SETB E
MOVDB0_DB7,A
CLR E
RET
;*******清除LCM子程序*******
CLS: MOV A,#00000001B
LCALL WRITE_COM
RET
;****延时2.7mS子程序****
DEL: MOV R6,#5
L1: MOV R7,#248
DJNZ R7,$
DJNZ R6,L1
RET
;*******自定义图形写入CGRAM子程序********
SAVE_CGRAM: MOV A,#01000000B
LCALL WRITE_COM
MOV DPTR,#TAB
CGRAM_LOOP: CLR A
MOVC A,@A+DPTR
LCALL WRITE_DATA
INC DPTR
DJNZ R4, CGRAM_LOOP
RET
;*******字符串*****************************
TAB: DB 03H,04H,08H,10H,1FH,04H,04H,00H
DB 1FH,00H,00H,00H,1FH,00H,00H,00H
DB 1FH,00H,00H,00H,1FH,00H,00H,00H
DB 18H,04H,02H,01H,1FH,04H,04H,00H
DB 04H,04H,04H,04H,04H,07H,00H,00H
DB 0FH,14H,14H,14H,14H,1FH,10H,00H
DB 1EH,05H,05H,05H,05H,1FH,01H,00H
DB 04H,04H,04H,04H,04H,1CH,00H,00H
LINE0:DB " Welcome to ",00H
LINE1: DB " LCD Monitor",00H
END 先说明是什么控制器的液晶,才好说程序…… 回复【6楼】i387DX
-----------------------------------------------------------------------
YXD-1602A5液晶屏 965340186 发表于 2010-1-23 19:33
回复【1楼】depaul123
-----------------------------------------------------------------------
我勒个擦,汇编
页:
[1]