用以下代码和连接方式使用 G2553 与 12864的话,电源要怎么加在哪里呢?而且这个代码有警告 Warning[Pe175]: subscript out of rang,应该怎么办呢?
只用连接三个引脚,大大节省资源 P1.1---SID P1.2---SCLK P1.3---CS 主频在1Mhz下
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
unsigned char a[]={"终于把12864学会了!"};
#define SID BIT1
#define SCLK BIT2
#define CS BIT3
#define LCDPORT P1OUT
#define SID_1 LCDPORT |= SID
#define SID_0 LCDPORT &= ~SID
#define SCLK_1 LCDPORT |= SCLK
#define SCLK_0 LCDPORT &= ~SCLK
#define CS_1 LCDPORT |= CS
#define CS_0 LCDPORT &= ~CS
void delay(unsigned char ms)
{
unsigned char i,j;
for(i=ms;i>0;i--)
for(j=120;j>0;j--);
}
/***********************************************************
*名 称:LCD_Write_cmd()
*功 能:写一个命令到LCD12864
*入口参数:cmd:待写入的命令,无符号字节形式
*出口参数:无
*说 明:写入命令时,RW=0,RS=0 扩展成24位串行发送
*格 式:11111 RW0 RS 0 xxxx0000 xxxx0000
* |最高的字节 |命令的bit7~4|命令的bit3~0|
***********************************************************/
void write_cmd(uchar cmd)
{
uchar i,high4bits,low4bits;
ulong lcdcmd;
high4bits = cmd & 0xf0;
low4bits = cmd & 0x0f;
lcdcmd=((ulong)0xf8<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcdcmd & 0x00800000) SID_1;
lcdcmd <<=1;
delay(3);
SCLK_1;
delay(3);
SCLK_0;
}
CS_0;
}
}
/***********************************************************
*名 称:LCD_Write_Byte()
*功 能:向LCD12864写入一个字节数据
*入口参数:byte:待写入的字符,无符号形式
*出口参数:无
*范 例:LCD_Write_Byte('F') //写入字符'F'
***********************************************************/
void write_dat(uchar dat)
{
uchar i,high4bits,low4bits;
ulong lcddat;
high4bits = dat & 0xf0;
low4bits = dat & 0x0f;
lcddat=((ulong)0xfa<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcddat & 0x00800000) SID_1;
lcddat <<=1;
delay(3);
SCLK_1;
delay(3);
SCLK_0;
}
CS_0;
}
/***********************************************************
*名 称:LCD_pos()
*功 能:设置液晶的显示位置
*入口参数:x:第几行,1~4对应第1行~第4行
* y:第几列,0~15对应第1列~第16列
*出口参数:无
*范 例:LCD_pos(2,3) //第二行,第四列
***********************************************************/
void lcd_pos(uchar x,uchar y)
{
uchar pos;
switch(x)
{
case 1:pos=0x80;break;
case 2:pos=0x90;break;
case 3:pos=0x88;break;
case 4:pos=0x98;break;
default:pos=0x80;
}
pos += y;
write_cmd(pos);
}
/****************************************************/
//LCD12864初始化
void LCD_init(void)
{
write_cmd(0x30);
delay(5);
write_cmd(0x0C);
delay(5);
write_cmd(0x01);
delay(5);
write_cmd(0x02);
delay(5);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1SEL=0x00;
P1DIR = BIT1 + BIT2 + BIT3;
LCD_init();
delay(40);
lcd_pos(1,0);
write_dat(a[0]);
write_dat(a[1]);
write_dat(a[2]);
write_dat(a[3]);
write_dat(a[4]);
write_dat(a[5]);
write_dat(a[6]);
write_dat(a[7]);
write_dat(a[8]);
write_dat(a[9]);
write_dat(a[10]);
write_dat(a[11]);
lcd_pos(2,0);
write_dat(a[12]);
write_dat(a[13]);
write_dat(a[14]);
write_dat(a[15]);
write_dat(a[16]);
write_dat(' ');
write_dat(a[17]);
write_dat(a[18]);
write_dat(a[19]);
write_dat(a[20]);
write_dat(a[21]);
write_dat(a[22]);
write_dat(a[23]);
write_dat(a[24]);
while(1)
{;}
//return 0;
}
就是在使用之前 12864是不是只要单片机写入程序,再连接12864就可以了,是不是这一步就叫装驱动?
唉,我不是伸手党啊,但是又很想知道答案,谁能在我自学的道路上帮一把吧。
从你的帖子来看,你还有许多基础的东西要学,估计是在做毕设,想一蹴而就,这个学习方法不好。
就你的问题来说,
1、单片机里面的程序就是来实现屏的驱动的
2、 P1.1---SID P1.2---SCLK P1.3---CS 应该是三线spi通讯,你还需要接lcd的电源和背光,注意电压和极性
3、不知道你这个12864是带字库的么,从程序看可能是带的,带的话程序可行,不带的话因为你没有字库,所以出不来效果。
我是大一的,初学电子设计。我也是用科协刚买的LCD屏幕,如果没有字库的话,应该怎么做呢?
包含点阵字库进去,大一还很早,把基础慢慢学学,多读读程序
如果我是JLX12864G378的LCD,那么应该怎么接电源呢?就是VCC引出来接到哪儿嘞。
问题解决了亲,是因为没有接电路,背光太亮看不清呢。。
作为小白我也想问问一个问题~那个JLX12864的管脚rom_in,out……这四个需要连接到单片机么。。
建议楼主你百度LCD引脚连接硬件设备后,在从论坛中找一个成功程序下载,从头学习
high4bits = cmd & 0xf0;
low4bits = cmd & 0x0f;后面加
SendByte(0xf8);
下面的位置
high4bits = cmd & 0xf0;
low4bits = cmd & 0x0f;后面加
SendByte(0xfa);