初级会员

- 积分
- 94
- 金钱
- 94
- 注册时间
- 2015-8-1
- 在线时间
- 11 小时
|

楼主 |
发表于 2015-9-11 08:49:58
|
显示全部楼层
回复【2楼】正点原子:
---------------------------------
接口简单方便:可选择4 位并行接口、8 位并行接口、4 线SPI 串行接口、IIC 接口(I2C 接口)。这个可以用!!
下面是对应型号51的程序,可以麻烦帮我看看我stm32的哪里有问题吗
#include <reg51.h>
sbit scl=P1^7;
sbit sda=P1^6;
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
char code CGRAM_data[]={
0x08,0x1F,0x02,0x0F,0x0A,0x1F,0x02,0x02, //年
0X55,0X55,0X55,0X55,0X55,0X55,0X55,0X55, //偶竖
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,0XAA, //奇竖
0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00, //奇横
0X00,0XFF,0X00,0XFF,0X00,0XFF,0X00,0XFF, //偶横
0XFF,0X11,0X11,0X11,0X11,0X11,0X11,0XFF, //方框
0XFF,0X11,0X11,0X11,0X11,0X11,0X11,0XFF, //方框
0XFF,0X11,0X11,0X11,0X11,0X11,0X11,0XFF, //方框
};
char code CGRAM_data_nian[]={
0x08,0x1F,0x02,0x0F,0x0A,0x1F,0x02,0x02,
};
//=============delay time=====================
void delay(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<110;k++);
}
//--------------wait a switch,jump out if  2.0 get a signal"0"------------------
void waitkey()
{
repeat:
if (P2&0x01) goto repeat;
else;
delay(500);
}
void transfer(int data1)
{
int i;
for(i=0;i<8;i++)
{
scl=0;
if(data1&0x80) sda=1;
else sda=0;
scl=1;
scl=0;
data1=data1<<1;
}
sda=0;
scl=1;
scl=0;
}
void start_flag()
{
scl=1; /*START FLAG*/
sda=1; /*START FLAG*/
sda=0; /*START FLAG*/
}
void stop_flag()
{
scl=1; /*STOP FLAG*/
sda=0; /*STOP FLAG*/
sda=1; /*STOP FLAG*/
}
void initial_lcd()
{
start_flag(); /*开始标志*/
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x00); /*控制字节:Co=0,A0=0,表示以下传输的N 个字节是指令*/
transfer(0x38);//Function set
transfer(0x0c);//Display ON/OFF
transfer(0x01);//Clear display
transfer(0x06);//Entry mode set
stop_flag(); /*结束标志*/
}
void write_CGRAM()
{
int i;
char *dp=CGRAM_data;
start_flag();
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x80); /*控制字节:Co=1,A0=0,表示以下传输的有且只有1 个字节是指令*/
transfer(0x40); //设置XGRAM ADDRESS:第几个CGRAM,0X40 表示第0 个。
transfer(0x40); /*控制字节:Co=0,A0=1,表示以下传输的n 个字节是数据*/
for(i=0;i<64;i++)
{
transfer(*dp);
dp=dp+1;
}
stop_flag();
}
void disp_CGRAM()
{
int i;
start_flag();
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x80); /*控制字节:Co=1,A0=0,表示以下传输的1 个字节是指令*/
transfer(0x80); //设置DDRAM ADDRESS:第几行,第几列
transfer(0x40); /*控制字节:Co=0,A0=1,表示以下传输的n 个字节是数据*/
for(i=0;i<16;i++)
{
transfer(0x01);
}
stop_flag();
start_flag();
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x80); /*控制字节:Co=1,A0=0,表示以下传输的1 个字节是指令*/
transfer(0xc0); //设置DDRAM ADDRESS:第几行,第几列
transfer(0x40); /*控制字节:Co=0,A0=1,表示以下传输的n 个字节是数据*/
for(i=0;i<16;i++)
{
transfer(0x01);
}
stop_flag();
}
/*在指定行和列位置显示指定的字母、数字(5*7 点阵的)*/
void disp_char(int line,int column,char code *dp)
{
int i;
start_flag();
transfer(0x78); /*选择SLAVE ADDRESS*/
transfer(0x80); /*控制字节:Co=1,A0=0,表示以下传输的1 个字节是指令*/
transfer(0x80+(line-1)*0x40+(column-1)); //设置DDRAM ADDRESS:第几行,第几列
transfer(0x40); /*控制字节:Co=0,A0=1,表示以下传输的n 个字节是数据*/
for(i=0;i<16;i++)
{
transfer(*dp);
dp=dp+1;
}
stop_flag();
}
void main()
{
delay(100);
initial_lcd();
write_CGRAM();
while(1)
{
disp_char(1,1,"*16*2 LCM no BL*"); /*在第1 行,第1 列,显示字符。。。。*/
disp_char(2,1,"**JLX1602I LCM**"); /*在第2 行,第1 列,显示字符。。。。*/
waitkey();
disp_char(1,1,"16X2 characters:"); /*在第1 行,第1 列,显示字符。。。。*/
disp_char(2,1,"*standard ascii*"); /*在第2 行,第1 列,显示字符。。。。*/
waitkey();
disp_CGRAM(); /*显示自编的CGRAM 字符。。。。*/
waitkey();
}
}> |
|