专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
求一份12864串行传输打点的程序
2019-03-24 08:31
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
6324
19
1052
不要写字的,只要打点就行了。 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
zwq2
1楼-- · 2019-03-24 12:35
< 不同液晶控制芯片不同,命令也不同
加载中...
465055608
2楼-- · 2019-03-24 17:29
精彩回答 2 元偷偷看……
加载中...
xuejian
3楼-- · 2019-03-24 21:45
#include<msp430G2553.h>
#define uchar unsigned char
#define CS1 P2OUT |= BIT0 //串行LCD宏定义
#define CS0 P2OUT &=~BIT0
#define SID1 P2OUT |= BIT1
#define SID0 P2OUT &=~BIT1
#define SCLK1 P2OUT |= BIT2
#define SCLK0 P2OUT &=~BIT2
#define RST1 P2OUT |= BIT3
#define RST0 P2OUT &=~BIT3
//#define PSB0 P2OUT |= BIT4
//#define PSB1 P2OUT &=~BIT4
//函数声明
void InitSys();
void delay_ms(unsigned int);
void display_strings(void);
void displaydot(unsigned char x0,unsigned char y0 );
void lcdinit(void);
void clrgdram(void);
void write_com(unsigned char);
void write_data(unsigned char);
void sendbyte(unsigned char);
uchar ReadByte(void);
uchar Read_dos(uchar mode);
int flag=1;
char row1[]={"液晶显示屏12864 "};
char row2[]={"串行静态显示模式"};
char row3[]={"430LaunchpadBord"};
char row4[]={"只需四个IO口即可"};
char num[]={"0123456789"};
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys(); //初始化
//display_strings(); //写入液晶中静态显示部分数据
//delay_ms(2000);
clrgdram();
displaydot(30,50);
displaydot(30,51);
displaydot(30,52);
displaydot(30,53);
displaydot(30,54);
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If calibration constants erased
// do not load, trap CPU!!
}
BCSCTL1 = CALBC1_8MHZ; // 设定工作频率为8M
DCOCTL = CALDCO_8MHZ; // Set DCO step + modulation */
P2DIR=0x1f;
lcdinit(); //LCD初始化
}
//毫秒级延时
void delay_ms(unsigned int nValue)//delay 1ms at 8M
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1980;
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--)
_NOP();
}
}
//液晶初始化
void lcdinit()
{
RST0;
delay_ms(10);
RST1;
delay_ms(200);
write_com(0x30); //功能设定:基本指令集
delay_ms(5);
write_com(0x0c); //显示状态:整体显示,游标关
delay_ms(5);
write_com(0x01); //清空显示
delay_ms(5);
}
//读一个字节
uchar ReadByte(void)
{
uchar i,temp;
CS1;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCLK1;
SCLK0;
delay_ms(5);
if(P2IN&0x02) temp++;
}
return temp;
}
//发送1字节数据
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID1;
}
else
{
SID0;
}
SCLK0;
SCLK1;
}
}
//写命令
void write_com(unsigned char cmdcode)
{
CS1;
sendbyte(0xf8); //1 1 1 1 RS RW 0 写操作RW=0 11111000写数据 11111010写指令
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay_ms(1);
CS0;
}
//写数据
void write_data(unsigned char Dispdata)
{
CS1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay_ms(1);
CS0;
}
//读一字节数据或状态函数:Read_dos(unsigned char mode)
uchar Read_dos(uchar mode)
{
uchar temp,temp1,temp2;
sendbyte(mode);
delay_ms(5);
temp1=ReadByte();
delay_ms(1);
temp2=ReadByte();
delay_ms(1);
temp2>>=4;
temp2&=0x0f; //屏蔽高四位
temp1&=0xf0; //屏蔽低四位
temp=temp1 | temp2;
return(temp);
}
/****************************************/
void display_strings()
{
unsigned int i;
delay_ms(20);
write_com(0x80); //第1行
for(i=0;i<16;i++)
{
write_data(row1
);
delay_ms(1);
}
write_com(0x90); //第2行
for(i=0;i<16;i++)
{
write_data(row2
);
delay_ms(1);
}
write_com(0x88); //第3行
for(i=0;i<16;i++)
{
write_data(row3
);
delay_ms(1);
}
write_com(0x98); //第4行
for(i=0;i<16;i++)
{
write_data(row4
);
delay_ms(1);
}
}
//清整个GDRAM空间
void clrgdram(void)
{
unsigned char x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
write_com(0x34);
write_com(y+0x80); //行地址
write_com(x+0x80); //列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
//***********************************************************************************
//0,0---------------------127,0
//0,63-------------------127,63坐标
//(打点)打点位置的定位
//根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,
//经过或和移位后再把数据重新写入
//***********************************************************************************
void displaydot(unsigned char x0,unsigned char y0 )//在任意位置画点输入范围x0-127 y 0-63
{
unsigned char x,y,xb,yb,GDRAM_hbit,GDRAM_lbit; // X,Y坐标互换,即普通的X,Y坐标
x=x0/16; //定义列地址的字节位,及在字节中的哪1位
y=y0&0x1f; //计算在0~31当中的哪一行
yb=y0/32; //0为上半屏,1为下半屏
xb=x0&0x0f; //计算在该字节16bit中的哪一位
write_com(0x34); //打开扩展指令集
write_com(0x36); //打开绘图显示
write_com(y+0x80); //写行地址Y坐标
write_com(x+0x80+yb*8); //写列地址X坐标通过8*yb选定上下屏,每行8*16=128
ReadByte(); //当前地址读,第一次虚读
GDRAM_hbit=ReadByte(); //读取当前显示高8位数据
GDRAM_lbit=ReadByte(); //读取当前显示低8位数据
write_com(y+0x80); //写行地址
write_com(x+0x80+yb*8); //写列地址
if(xb<8) //判断其在高8位,还是在低8位
{
write_data(GDRAM_hbit|(0x01<<(7-xb))); //显示GDRAM区高8位数据
write_data(GDRAM_lbit); //显示GDRAM区低8位数据
}
else
{
write_data(GDRAM_hbit);
write_data(GDRAM_lbit|(0x01<<(15-xb)));
}
write_com(0x30);
}
这个程序是我今天调出来的,在msp430LaunchPad上可用,你可以试一下。
加载中...
465055608
4楼-- · 2019-03-25 02:54
在编译的时候就有4个错误,因为是显示汉字的,我就把屏蔽掉了,你回头可以改下,你把地址传给写函数但是你的写函数接受的是uchar的类型,这是一点,二点,你的Read_dos(mode)这个函数没有用到,我估计这个是你的读函数,所以我帮你改了替换了在 displaydot里的readbyte()函数,并且加了mode的含义是11111110(0xfe),但是这样依旧显示不出来,所以我想问下,你那是否编译通过了,在显示屏上是否有线条了,如果有效果的话,能否再发一次你的程序给我,谢谢。顺便说下,如果能加下我的QQ:465055608,这样的话,我们可以更好的交流,谢谢。
加载中...
xuejian
5楼-- · 2019-03-25 08:28
精彩回答 2 元偷偷看……
加载中...
465055608
6楼-- · 2019-03-25 09:23
那这样的话,你的程序的问题更大了,读也是有时序的,你可以看下手册,我估计你是从网上移植的,但是读这个就按并行的写了,你可以试试打这样几个点,
for(i=0;i<5;i++)
{
displaydot(i,0);
}
你可以自己数数,是5个点还是1个点。
加载中...
1
2
3
4
下一页
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#define uchar unsigned char
#define CS1 P2OUT |= BIT0 //串行LCD宏定义
#define CS0 P2OUT &=~BIT0
#define SID1 P2OUT |= BIT1
#define SID0 P2OUT &=~BIT1
#define SCLK1 P2OUT |= BIT2
#define SCLK0 P2OUT &=~BIT2
#define RST1 P2OUT |= BIT3
#define RST0 P2OUT &=~BIT3
//#define PSB0 P2OUT |= BIT4
//#define PSB1 P2OUT &=~BIT4
//函数声明
void InitSys();
void delay_ms(unsigned int);
void display_strings(void);
void displaydot(unsigned char x0,unsigned char y0 );
void lcdinit(void);
void clrgdram(void);
void write_com(unsigned char);
void write_data(unsigned char);
void sendbyte(unsigned char);
uchar ReadByte(void);
uchar Read_dos(uchar mode);
int flag=1;
char row1[]={"液晶显示屏12864 "};
char row2[]={"串行静态显示模式"};
char row3[]={"430LaunchpadBord"};
char row4[]={"只需四个IO口即可"};
char num[]={"0123456789"};
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys(); //初始化
//display_strings(); //写入液晶中静态显示部分数据
//delay_ms(2000);
clrgdram();
displaydot(30,50);
displaydot(30,51);
displaydot(30,52);
displaydot(30,53);
displaydot(30,54);
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If calibration constants erased
// do not load, trap CPU!!
}
BCSCTL1 = CALBC1_8MHZ; // 设定工作频率为8M
DCOCTL = CALDCO_8MHZ; // Set DCO step + modulation */
P2DIR=0x1f;
lcdinit(); //LCD初始化
}
//毫秒级延时
void delay_ms(unsigned int nValue)//delay 1ms at 8M
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1980;
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--)
_NOP();
}
}
//液晶初始化
void lcdinit()
{
RST0;
delay_ms(10);
RST1;
delay_ms(200);
write_com(0x30); //功能设定:基本指令集
delay_ms(5);
write_com(0x0c); //显示状态:整体显示,游标关
delay_ms(5);
write_com(0x01); //清空显示
delay_ms(5);
}
//读一个字节
uchar ReadByte(void)
{
uchar i,temp;
CS1;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCLK1;
SCLK0;
delay_ms(5);
if(P2IN&0x02) temp++;
}
return temp;
}
//发送1字节数据
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID1;
}
else
{
SID0;
}
SCLK0;
SCLK1;
}
}
//写命令
void write_com(unsigned char cmdcode)
{
CS1;
sendbyte(0xf8); //1 1 1 1 RS RW 0 写操作RW=0 11111000写数据 11111010写指令
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay_ms(1);
CS0;
}
//写数据
void write_data(unsigned char Dispdata)
{
CS1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay_ms(1);
CS0;
}
//读一字节数据或状态函数:Read_dos(unsigned char mode)
uchar Read_dos(uchar mode)
{
uchar temp,temp1,temp2;
sendbyte(mode);
delay_ms(5);
temp1=ReadByte();
delay_ms(1);
temp2=ReadByte();
delay_ms(1);
temp2>>=4;
temp2&=0x0f; //屏蔽高四位
temp1&=0xf0; //屏蔽低四位
temp=temp1 | temp2;
return(temp);
}
/****************************************/
void display_strings()
{
unsigned int i;
delay_ms(20);
write_com(0x80); //第1行
for(i=0;i<16;i++)
{
write_data(row1);
delay_ms(1);
}
write_com(0x90); //第2行
for(i=0;i<16;i++)
{
write_data(row2);
delay_ms(1);
}
write_com(0x88); //第3行
for(i=0;i<16;i++)
{
write_data(row3);
delay_ms(1);
}
write_com(0x98); //第4行
for(i=0;i<16;i++)
{
write_data(row4);
delay_ms(1);
}
}
//清整个GDRAM空间
void clrgdram(void)
{
unsigned char x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
write_com(0x34);
write_com(y+0x80); //行地址
write_com(x+0x80); //列地址
write_com(0x30);
write_data(0x00);
write_data(0x00);
}
}
//***********************************************************************************
//0,0---------------------127,0
//0,63-------------------127,63坐标
//(打点)打点位置的定位
//根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,
//经过或和移位后再把数据重新写入
//***********************************************************************************
void displaydot(unsigned char x0,unsigned char y0 )//在任意位置画点输入范围x0-127 y 0-63
{
unsigned char x,y,xb,yb,GDRAM_hbit,GDRAM_lbit; // X,Y坐标互换,即普通的X,Y坐标
x=x0/16; //定义列地址的字节位,及在字节中的哪1位
y=y0&0x1f; //计算在0~31当中的哪一行
yb=y0/32; //0为上半屏,1为下半屏
xb=x0&0x0f; //计算在该字节16bit中的哪一位
write_com(0x34); //打开扩展指令集
write_com(0x36); //打开绘图显示
write_com(y+0x80); //写行地址Y坐标
write_com(x+0x80+yb*8); //写列地址X坐标通过8*yb选定上下屏,每行8*16=128
ReadByte(); //当前地址读,第一次虚读
GDRAM_hbit=ReadByte(); //读取当前显示高8位数据
GDRAM_lbit=ReadByte(); //读取当前显示低8位数据
write_com(y+0x80); //写行地址
write_com(x+0x80+yb*8); //写列地址
if(xb<8) //判断其在高8位,还是在低8位
{
write_data(GDRAM_hbit|(0x01<<(7-xb))); //显示GDRAM区高8位数据
write_data(GDRAM_lbit); //显示GDRAM区低8位数据
}
else
{
write_data(GDRAM_hbit);
write_data(GDRAM_lbit|(0x01<<(15-xb)));
}
write_com(0x30);
}
这个程序是我今天调出来的,在msp430LaunchPad上可用,你可以试一下。
for(i=0;i<5;i++)
{
displaydot(i,0);
}
你可以自己数数,是5个点还是1个点。
一周热门 更多>