就是数据输入口 并行输入需要8个口,然后一般端口都是直接用一组PX0~PX7的,可是5529并没有完整的一组端口PX0~PX7
然后在单片机给12864写数据的那里我不懂该怎么改。我的开发板5529的端口是这样。
目前我用的是P7.0 P7.1 P7.2 P7.3 P7.5 和 P6.4 P6.6 P6.7 自己也改了下 可是显示的数据并不完整,于是我就搞不懂了
【程序里的图片代码我删掉了 因为太长了】
程序如下:
#include <msp430f5529.h>
#include <in430.h>
#include <stdint.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define LCD_DataIn P7DIR=0x00,P6DIR&=~(BIT4+BIT6+BIT7) //数据口方向设置为输入
#define LCD_DataOut P7DIR=0xff,P6DIR|=(BIT4+BIT6+BIT7) //数据口方向设置为输出
#define LCD2MCU_Data (P7IN&0x2f)|(P6IN&0xD0)
#define LCD_CMDOut P2DIR|=(BIT0+BIT1+BIT3) //P2口的低三位设置为输出
#define LCD_RS_H P2OUT|=BIT0 //P2.0
#define LCD_RS_L P2OUT&=~BIT0 //P2.0
#define LCD_RW_H P2OUT|=BIT1 //P2.1
#define LCD_RW_L P2OUT&=~BIT1 //P2.1
#define LCD_EN_H P2OUT|=BIT3 //P2.3
#define LCD_EN_L P2OUT&=~BIT3 //P2.3
#define PSBOut P4DIR|=BIT4 //P4.4
#define RSTOut P4DIR|=BIT5 //P4.5
#define PSB_H P4OUT|=BIT4 //P4.4
#define RST_H P4OUT|=BIT5 //P4.5
#define CPU_F ((double)16000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
uint i=0;
/***********************************************************
*名 称: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 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_RW_L;
// MCU2LCD_Data = cmd;
P7OUT=(cmd&0x2f);
// P2OUT=((cmd&0xc0)>>2);
if(cmd&0x10)
P6OUT|=BIT4;
else
P6OUT&=~BIT4;
if(cmd&0x40)
P6OUT|=BIT6;
else
P6OUT&=~BIT6;
if(cmd&0x80)
P6OUT|=BIT7;
else
P6OUT&=~BIT7;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/***********************************************************
*名 称:LCD_Write_Byte()
*功 能:向LCD12864写入一个字节数据
*入口参数:byte:待写入的字符,无符号形式
*出口参数:无
*范 例:LCD_Write_Byte('F') //写入字符'F'
***********************************************************/
void Write_Data(uchar dat)
{
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_RS_H;
LCD_RW_L;
// MCU2LCD_Data = dat;
P7OUT=(dat&0x2f);
// P2OUT=((dat&0xc0)>>2);
if(dat&0x10)
P6OUT|=BIT4;
else
P6OUT&=~BIT4;
if(dat&0x40)
P6OUT|=BIT6;
else
P6OUT&=~BIT6;
if(dat&0x80)
P6OUT|=BIT7;
else
P6OUT&=~BIT7;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
void lcd_dis(const uchar *ptr)
{
uchar i,j;
// lcd_com(0x34);
for(i=0;i<32;i++)
{
Write_Cmd(0x80+i); //先写入水平坐标值
Write_Cmd(0x80); //写入垂直坐标值
for(j=16;j>0;j--) //再写入两个8位元的数据
Write_Cmd(*ptr++);
delay_ms(10);
}
for(i=0;i<32;i++)
{
Write_Cmd(0x80+i);
Write_Cmd(0x88);
for(j=16;j>0;j--)
Write_Data(*ptr++);
delay_ms(10);
}
}
void T_display(uchar *p) //图片数据提取函数
{
uchar x,y,a,b,c;
//write_com(0x34); //关闭绘图功能
x=0x88;//设置水平坐标X
y=0x80;//设置垂直坐标Y
for(c=0;c<2;c++)
{
for(a=0;a<32;a++)
{
Write_Cmd(y+a);
Write_Cmd(x);
for(b=0;b<16;b++)
Write_Data(*p++); //写入8位数据
}
x=0x80;//转换半屏
}
//write_com(0x36); //打开绘图功能
//write_com(0x30);
}
/***********************************************************
*名 称: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 0:pos=0x80+y;break;
case 1:pos=0x90+y;break;
case 2:pos=0x88+y;break;
case 3:pos=0x98+y;break;
default:pos=0x80+y;
}
Write_Cmd(pos);
}
/*******************************************
函数名称:Clear_GDRAM
功 能:清除液晶GDRAM中的随机数据
参 数:无
返回值 :无
********************************************/
void Clear_GDRAM(void)
{
uchar i,j,k;
Write_Cmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(0x00);
}
}
Write_Cmd(0x30); //回到基本指令集
}
/*******************************************
函数名称:Draw_PM
功 能:在整个液晶屏幕上画图
参 数:无
返回值 :无
********************************************/
/*void Draw_PM(const uchar *ptr)
{
uchar i,j,k;
Write_Cmd(0x34); //打开扩展指令集
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x80);
for(k = 0;k < 16;k++)
{
Write_Data(*ptr++);
}
}
i = 0x80;
for(j = 0;j < 32;j++)
{
Write_Cmd(i++);
Write_Cmd(0x88);
for(k = 0;k < 16;k++)
{
Write_Data(*ptr++);
}
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集
}*/
/*******************************************
函数名称:Draw_TX
功 能:显示一个16*16大小的图形
参 数:Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
绘图的坐标X以字节为单位,Y以位为单位
初始坐标 0x80,0x80
绘图时需要将YX的坐标连续写入RAM,写入期间绘图必须关闭
返回值 :无
********************************************/
void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp)
{
uchar j;
uchar k=0;
Write_Cmd(0x01); //清屏,只能清除DDRAM
Write_Cmd(0x34); //使用扩展指令集,关闭绘图显示
for(j=0;j<16;j++)
{
Write_Cmd(Yaddr++); //Y地址
Write_Cmd(Xaddr); //X地址
Write_Data(dp[k++]);
Write_Data(dp[k++]);
}
Write_Cmd(0x36); //打开绘图显示
Write_Cmd(0x30); //回到基本指令集模式
}
/****************************************************/
//LCD12864初始化
void LCD_init(void)
{
PSB_H;
delay_ms(200);
RST_H;
delay_ms(200);
Write_Cmd(0x30);//功能设定
delay_ms(200);
Write_Cmd(0x0C);//整体显示ON
delay_ms(200);
Write_Cmd(0x01);//清除显示
delay_ms(200);
Write_Cmd(0x02);//地址归为
delay_ms(200);
Write_Cmd(0x80);//设定显示的起始地址
}
void IO_init(void)
{
P2SEL&=~(BIT0 + BIT1 + BIT3);//P2.0,P2.1,P2.2 为I/O端口
P2DIR = BIT0 + BIT1 + BIT3;
P4SEL&=~(BIT4 + BIT5);
P4DIR = BIT4 + BIT5;
}
void DCO_12M()
{
UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_5; // Select DCO range 24MHz operation
UCSCTL2 = FLLD_1 + 374; // Set DCO Multiplier for 12MHz
// (N + 1) * FLLRef = Fdco
// (374 + 1) * 32768 = 12MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // Enable the FLL control loop
// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 12 MHz / 32,768 Hz = 375000 = MCLK cycles for DCO to settle
__delay_cycles(375000);
// Loop until XT1,XT2 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
IO_init();
DCO_12M();
LCD_init();//LCD初始化
while(1)
{
Write_Cmd(0x36);
lcd_dis(tiBug);
delay_ms(200);
lcd_dis(tiBug1);
delay_ms(200);
lcd_dis(tiBug2);
delay_ms(200);
lcd_dis(tiBug3);
delay_ms(200);
lcd_dis(tiBug4);
}
}
此帖出自
小平头技术问答
一周热门 更多>