12864并行驱动程序

李晓航Elijah   2012-7-15 14:49 楼主

IMG_20120715_144503.jpg

已知BUG:显示”液晶12864驱动程序“乱码,就是中文和西文必须分开显示
代码:
主函数main.c
#include <msp430g2553.h>
#include "lcd12864.h"
void main()
{
WDTCTL = WDTPW + WDTHOLD;


BCSCTL1 = CALBC1_8MHZ; // 多谐2楼指导
DCOCTL = CALDCO_8MHZ;


P1DIR|=0xff;
P2DIR|=0xff;

lcdreset(); //初始化LCD12864屏
clrscreen();

write_com(0x80); //位置控制
printstring("液晶12864");

write_com(0x90); //位置控制
write_swcom(0x8a);//写单个数控制字
write_swdat(0x35);
write_swdat(0x36);

write_com(0x95); //位置控制
write_swdat(0x38);

write_com(0x88); //位置控制
printstring("液晶12864");
while(1);
}

12864.c
#include <msp430g2553.h> //包含库文件

#define uint unsigned int
#define uchar unsigned char
uchar LCD_table1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0123456789

//sbit LCD_RS = P2.0;
//sbit LCD_RW = P2.1;
//sbit LCD_EN = P2.2;
//sbit LCD_PSB= P2.3;
//sbit LCD_RST= P2.4;

#define LCD_DataIn P1DIR=0x00;//数据口方向设置为输入
#define LCD_DataOut P1DIR=0xff;//数据口方向为输出
#define LCD2MCU_Data P1IN
#define MCU2LCD_Data P1OUT

#define LCD_RS_L P2OUT&=0xfe;
#define LCD_RS_H P2OUT|=0x01;
#define LCD_RW_L P2OUT&=0xfd;
#define LCD_RW_H P2OUT|=0x02;
#define LCD_EN_L P2OUT&=0xfb;
#define LCD_EN_H P2OUT|=0x04;
#define LCD_PSB_L P2OUT&=0xf7;
#define LCD_PSB_H P2OUT|=0x08;
#define LCD_RST_L P2OUT&=0xef;
#define LCD_RST_H P2OUT|=0x10;

void delay_1ms()
{
uint i;
for(i=0;i<1140;i++);
}

void delay_nms(uint n)
{
uint j;
for(j=0;j<n;j++)
delay_1ms();
}
/*------------------检查忙位-----------------------------*/
void chk_busy()
{
uchar lcdtemp=0;

LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
}

/*------------------写命令到LCD------------------------------*/
void write_com(uchar cmdcode)
{
chk_busy();
LCD_RW_L;
MCU2LCD_Data = cmdcode;
LCD_EN_H;
_NOP();
LCD_EN_L;
}

/*-------------------写数据到LCD----------------------------*/
void write_data(uchar Dispdata)
{
chk_busy();
LCD_RS_H;
LCD_RW_L;

MCU2LCD_Data = Dispdata;
LCD_EN_H;
_NOP();
LCD_EN_L;
}

/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
LCD_RST_L;
delay_nms(60);
LCD_RST_H;
delay_nms(1);
LCD_PSB_H;

delay_nms(600);
write_com(0x30);
delay_nms(10); //选择基本指令集
write_com(0x02); //地址归位
delay_nms(5);
write_com(0x0c); //开显示(无游标、不反白)
delay_nms(10);
write_com(0x01); //清除显示,并且设定地址指针为00H
delay_nms(500);
write_com(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay_nms(10);
}

/*------------------显示字符串--------------------------*/
void printstring(uchar *s)
{
while(*s>0)
{
write_data(*s);
s++;
delay_nms(5);
}
}

/*------------------清屏命令--------------------------*/
void clrscreen()
{
write_com(0x01);
delay_nms(10);
}


void write_swcom(uchar com)
{
LCD_RS_L;
LCD_RW_L;
delay_nms(1);
MCU2LCD_Data=com;
LCD_EN_L;
delay_nms(1);
}

void write_swdat(uchar dat)
{
chk_busy();
LCD_RS_H;
LCD_RW_L;
delay_nms(1);
MCU2LCD_Data=dat;
LCD_EN_H;
delay_nms(1);
LCD_EN_L;
delay_nms(1);
}

12864.h
#ifndef LCD12864_H_
#define LCD12864_H_
#define uint unsigned int
#define uchar unsigned char

extern void delay_1ms();
extern void delay_nms(uint n);
extern void chk_busy();
extern void write_com(uchar cmdcode);
extern void write_data(uchar Dispdata);
extern void lcdreset();
extern void printstring(uchar *s);
extern void clrscreen();
extern void write_swcom(uchar com);
extern void write_swdat(uchar dat);


#endif /* LCD12864_H_ */

[ 本帖最后由 李晓航Elijah 于 2012-7-15 16:43 编辑 ]

回复评论 (15)

改频率,无乱码

BCSCTL1 = CALBC1_8MHZ;    // Set range
DCOCTL = CALDCO_8MHZ;
点赞  2012-7-15 16:00

回复 沙发 x0310 的帖子

有效果
点赞  2012-7-15 16:42

12864的电压问题

我的12864的电压在5.0V后就会出现乱码,但是在4.8V就会正常,但是4.8V的字比较暗,怎么解决???
点赞  2012-7-16 09:12

回复 4楼 nlls1990 的帖子

请补充。看门狗关掉了吗
点赞  2012-7-16 10:49

回复 5楼 李晓航Elijah 的帖子

出来了,谢谢啦
我把线重新连了一下,就可以了
点赞  2012-7-16 10:54

新手,跪求连接图?

新手,跪求连接图?
点赞  2012-7-16 23:15

回复 7楼 画质饺子 的帖子

//sbit LCD_RS = P2.0;
//sbit LCD_RW = P2.1;
//sbit LCD_EN = P2.2;
//sbit LCD_PSB= P2.3;
//sbit LCD_RST= P2.4;
点赞  2012-7-17 07:57
谢谢楼主
点赞  2012-7-17 09:04

求指教

亲爱的搂住请问P1的几个接口是接在哪里的?
点赞  2012-7-18 19:14
不错哦
点赞  2012-7-31 10:32

拜师

楼主 很强大求拜师 加QQ 要比赛了 希望楼主指导
点赞  2012-7-31 20:51

回复 12楼 刘述武199074 的帖子

不不不,我430只摸了两天,只改了12864的两段程序。430适合做仪器仪表我就没搞下去了,我做控制的
点赞  2012-8-1 09:01

回复 10楼 阿器福 的帖子

P1就接到液晶上的数据线,DB0-DB7
点赞  2012-8-1 09:03

回复 13楼 李晓航Elijah 的帖子

我们马上要比赛 用430做东西 倒是候帮点忙啊 大神
点赞  2012-8-1 09:19

回复 15楼 刘述武199074 的帖子

鞭长莫及
点赞  2012-8-1 09:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复