您好!
从几天以来、我正在使用 MSP430F5529和一个 ili9341屏幕处理一个屏幕项目。
我已经带了一名员工(来自 Arduino、在 MSP 上找不到)、并对其进行调整以了解如何使用屏幕。 (不希望任何库用于速度和空间目的)
几次尝试后、我可以用颜色填充屏幕、但无法在特殊位置绘制简单的线条或矩形。
当我逐步运行程序时、所有指令命令都可以工作、并且在屏幕上、我有所有必须执行的程序。
在调试模式和运行模式之间:没有代码更改其它 compil 选项。
我尝试更改所有导线、但没有更改。
非常感谢您的帮助。
//此应用程序不依赖于任何库,它用于 ILI9341
//此程序是清除屏幕显示黑色、白色、红色、绿色、蓝色的演示。
//仅使用分线板并将这些硬件 SPI 线连接到 LCD 时,
// SDA 引脚和 SCK 引脚由系统定义,无法修改。
//如果您不需要控制 LED 引脚,则可以将其设置为3.3V 并将引脚定义设置为-1。
//其他引脚可由您自己定义,例如
//引脚用法如下:
// CS DC/DC RS 复位 SDI/MOSI SCK LED VCC GND
// GND//
请记住设置引脚以适合您的显示模块!
#include
#define FPROC 25000000
//
P3.0:MOSI
P3.1:MISO
P3.2:CLK
*/
#define RSUP P6OUT|=BIT0 // DC/DC RS
#define RSDOWN P6OUT&&=~BIT0
#define LEDUP P6OUT|=BIT1
#define LEDDOWN P6OUT&=~BIT1
#define CUP P6OUT|=BIT2
#define CSDOWN P6OUT&=~BIT2
#define RESETUP P6OUT|=BIT3
#define RESETDOWN P6OUT&&=~BIT3
unsigned long oldrand = 5468;
void SetVcoreUp (unsigned int level)
{
//打开 PMM 寄存器以写入
PMMCTL0_H = PMMPW_H;
//设置 VMS/SVM 高侧新电平
SVSMHCTL = SVSMSH0 + SVSMHRSHRS0 + SVSHE + SVSM0 *
//将 SVM 低电平设置为新电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
时间((((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLMRYIFG)
= 0;//将 PMMCL0设置为新电平
//如果
((PMMIFG & SVMLIFG))、则等待达到新的电平
while (((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;
}
/
{unsigned int 字体
unsigned long nn = oldrand;
oldran =(unsigned int)((859*nn)%6823);
返回 oldrand % n;
}
void delay (unsigned int i){
while (I-)
__DELAY_CYCLS (FPROC/1000);// 1000 for 1MHz
}
// envoyer sur le SPI la donn é e
void LCD_WLAG_Bus (unsigned char d)
{
while (UCB0STAT 和 BIT0){}// si la communication n'est pas finie on attend
UCB0TXBUF = d;
}
//指令
无效 LCD_Write_COM (无符号字符 VH)
{
RSDOWN;//LCD_RS=0;
LCD_WAVE_Bus (VH);
}
//指令无效 LCD_Write_Data
(无符号字符 VH)
{
RS_1、
unsigned int
Address 1、LCD_1、insigned int (1
LCD_Write_COM (0x2a);
LCD_Write_Data (x1>>8);
LCD_Write_Data (x1);
LCD_Write_Data (x2>>8);
LCD_Write_Data (x2);
LCD_Write_COM (0x2b);
LCD_Write_Data (Y1>>8);
LCD_Write_Data (Y1);
LCD_Write_Data (Y2>>8);
LCD_Write_Data (Y2);
LCD_Write_COM (0x2C);
}
void Draw 像素(unsigned char cr、unsigned char cv、unsigned char cb){
LCD_Write_Data (CR);
LCD_Write_Data (CV);
LCD_Write_Data (CB);
}
void SPI_Init (void)
{
UCB0CTL0 = BIT7 | BIT5 | BIT3;//主设备+ MSbfirst +前单活性剂+ CLK 初始值0
UCB0CTL1 = BIT7 | BIT6;// SMCLK
P3SEL |= 0x07;// ON 利用 LE SPI (CLK、MOSI 等 MISO)
}
void LCD_Init (void)
{
RESETUP;
延迟(5);
RESETDOWN;
延迟(15);
RESETUP;
延迟(15);
CSDOWN;//CS
LCD_Write_COM (0xCB);
LCD_Write_Data (0x39);
LCD_Write_Data (0x2C);
LCD_Write_Data (0x00);
LCD_Write_Data (0x34);
LCD_Write_Data (0x02);
LCD_Write_COM (0xCF);
LCD_Write_Data (0x00);
LCD_Write_Data (0XC1);
LCD_Write_Data (0X30);
LCD_Write_COM (0xE8);
LCD_Write_Data (0x85);
LCD_Write_Data (0x00);
LCD_Write_Data (0x78);
LCD_Write_COM (0xEA);
LCD_Write_Data (0x00);
LCD_Write_Data (0x00);
LCD_Write_COM (0xED);
LCD_Write_Data (0x64);
LCD_Write_Data (0x03);
LCD_Write_Data (0x12);
LCD_Write_Data (0x81);
LCD_Write_COM (0xF7);
LCD_Write_Data (0x20);
LCD_Write_COM (0xC0);//电源控制
LCD_Write_Data (0x23);// 23 VRH[5:0]
LCD_Write_COM (0xC1);//电源控制
LCD_Write_Data (0x10);//SAP[2:0];BT[3:0]
LCD_Write_COM (0xC5);//VCM 控制
LCD_Write_Data (0x3E);//对比度
LCD_Write_Data (0x28);
LCD_Write_COM (0xC7);//VCM control2
LCD_Write_Data (0x86);//-
LCD_Write_COM (0x36);//存储器访问控制
LCD_Write_Data (0x48);// 48 (28 ->模式付款、48 ->模式纵向)
LCD_Write_COM (0x3A);//像素格式设置
LCD_Write_Data (0x66);// 55
LCD_Write_COM (0xB1);
LCD_Write_Data (0x00);
LCD_Write_Data (0x18);// 18
LCD_Write_COM (0xB6);//显示函数控制
LCD_Write_Data (0x08);
LCD_Write_Data (0x82);// 82
LCD_Write_Data (0x27);
LCD_Write_COM (0x11);//退出睡眠
延迟(120);
LCD_Write_COM (0x29);//显示打开
LCD_Write_COM (0x2C);
csup;
}
void H_line (unsigned int x、unsigned int y、unsigned int l、unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned int i;
CSDOWN;
LCD_Write_COM (0x02c);//write_memory_start
address_set (x、y、l+x、y);
for (i=1;i<=l;i++)
{
Draw 像素(CR、CV、CB);
}
csup;
}
void V_line (unsigned int x、unsigned int y、unsigned int l、unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned int i;
CSDOWN;
LCD_Write_Com (0x02c);//write_memory_start
Address_set (x、y、x、x、l+y);
for (i = 1;i = 1;i +
i)
Draw _pixel (CR、CV、CB);
}
CSUP;
}
void Rect (unsigned int x、unsigned int y、unsigned int w、unsigned int h、unsigned char cr、unsigned char cv、unsigned char cb)
{
H_line (x、y、w、cr、cv、cv、 CB);
H_line (x、y+h、w、cr、 cv、cb);
V_line (x、y、h、 CR、CV、CB);
V_LINE (x+w、y、 h、cr、cv、cb);
}
void Rectf (unsigned int x、unsigned int y、unsigned int w、unsigned int h、unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned i;
for (i=0;unsigned <h;i++) {
H_line (x、y、w、cr、cv、 (b);
H_line (x、y+I、w、cr、cv、 cb);
}
}void LCD_clear (unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned int ii、mm;
CSDOWN;
Address_set (0、0、240、
i++);for (ii = 0;ii < 240;ii +)
对于(mm=0;mm<320;MM++)
{
Draw 像素(CR、CV、CB);
}
Csup;
}
void LCD_Arc ()
{
无符号 int ii、mm;
unsigned char CB = 0、CV = 0、CR = 0;
CSDOWN;
address_set (0、0、240、320);
对于(ii = 0;ii < 320;ii +){
如果(ii<80) CR=3*(ii%80);
否则,如果(ii<160)CR=3*(80-(ii-80)%80);
否则,如果(ii<240) CB=3*(ii-160)%80);
否则 CB=3*(80-(ii-240)%80);
对于(mm=0;MM<240;MM++)
{
CV = MM%240;
Draw 像素(CR、CV、CB);
}
}
Csup;
}
void LCD_Carre ()
{
unsigned int ii;
CSDOWN;
address_set (10、10、20、20);
对于(ii = 0;ii < 100;ii +){
Draw 像素(0xff、0xff、0xff);
}
Csup;
}
//**
* main.c
*/
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
SetVcoreUp(1);
SetVcoreUp(2);
SetVcoreUp(3);
UCSCTL3 |= SELREF_2; //设置 DCO FLL 基准= REFO (32 768)
_bis_SR_register (SCG0); //禁用 FLL 控制环路
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //选择 DCO 范围25MHz 操作
UCSCTL2 = FLLD_0 +(FPROC/32768 - 1); //将 DCO 乘法器设置为25MHz (487覆铜16MHz)(761覆铜25MHz)
//(N + 1)* FLLRef = Fdco
//(761 + 1)* 32768 = 25MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0); //启用 FLL 控制环路,然后通过写 SPI 控制寄存器(UCSSELx)选择时钟源
UCSCTL4 |= SE拉美 经济体系3; // P1.0上的 MCLK/1024简要说明
UCSCTL5 |= DIVPA_5 | DIV_5;
P1DIR |= BIT0;
P1SEL |= BIT0;
SPI_Init();
P6DIR |= 0x0F;// bit0 à 3 en sortie
RSUP;
LEDUP;
Csup;
RESETUP;
LCD_Init();
while (1){
LCD_CLEAR (0xff、0xff、0xff);
延迟(1000);
LCD_CLEAR (0xff、0x00、0x00);
延迟(1000);
LCD_CLEAR (0x00、0xff、0x00);
延迟(1000);
LCD_CLEAR (0x00、0x00、0xff);
延迟(1000);
LCD_Arc ();
延迟(3000);
LCD_Carre ();
延迟(5000);
LCD_CLEAR (0x00、0x00、0x00);
rect (10、10、100、50、random (256)、random (256)、random (256));
/*for (i=0;i<100;i++)
{
rect (random (239)、random (319)、random (239)、random (319)、random (256)、random (256)));// x、y、宽度、高亮度、颜色上的矩形
}*/
延迟(5000);
}
_bis_SR_register (LPM4_bits);
}