主题中讨论的其他器件: MSP430WARE
您好!
我们正在尝试将1.54英寸 EPD 与 MSP430G2553LP 对接。 我们有 IAR 代码。 我在此共享 代码文件以供参考。
//#include "io430.h"
#include "MSP430.h"
#include "stdbool.h"
#include "stdint.h"
#define B (x)(0x01 <<(x))
#define epdcklow P2OUT &=(~B(1))
#define epdckhigh P2OUT |= B(1)
#define epddalow P2OUT &=(~B(2))
#define epdahigh P2OUT |= B(2)
#define epdcslow P1OUT &=(~B(3))
#define epdcshigh P1OUT |= B(3)
#define epddclow P1OUT &=(~B(4))
#define epddchigh P1OUT |= B(4)
#define epdrstlow P1OUT &=(~B(5))
#define epdrsthighP1OUT |= B(5)
#define READ_EPD_BUSY()(P2IN &(B(0))
#define epdbslow P3OUT &= 0xFD
#define epdunnecowhigh P3OUT &= 0x80
#define epdon P2OUT &= 0xbf
#define epdoff P2OUT |= 0x40
#define rfcklow P1OUT &= 0xef
#define rfckhigh P1OUT |= 0x10
#define rfdalow P1OUT &= 0xfb
#define rfdahigh P1OUT |= 0x04
#define rfcslow P1OUT &= 0xf7
#define rfcshigh P1OUT |= 0x08
#define rfon P2OUT &= 0x7f
#define rfoff P2OUT |= 0x80
#define spiromcshigh P3OUT |= 0x01
#define spiromcslow P3OUT &= 0xFE
void InitClk (void);
void InitGpio (void);
void InitEpd (void);
void sendbyte (uint8_t sdbyte);
void epp_send_cmd (int cmd);
void EPD_sendcmddata (int cmd、int data);
空延迟(unsigned int nCount);
void Delaylong (unsigned int n10Count);
extern const unsigned char img1[];
extern const unsigned char img2[];
extern const unsigned char epdinit[];
#define EPD_Y_RAW_Pixels 200
#define EPD_X_RAW_Pixels 200
// const uint8_t GDOControl[]={0x01、(EPD_Y_RAW_Pixels - 1)% 256、
//(EPD_Y_RAW_Pixels - 1)/ 256、0x00};//表示1.54英寸
const uint8_t GDOControl[]={0x01、0xF9、0x00};
const uint8_t EPD_BSSC[]={0x0c、0xd7、0xd6、0x9d};
const uint8_t EPD_SDLP[]={0x3a、0x00};//每个栅极4个虚拟线路
const uint8_t EPD_SGLW[]={0x3b、0x00};//每行2us
const uint8_t EPD_DEMS[]={0x11、0x03};
const uint8_t EPD_SRAMXASE[]={0x44、0x00、0x0F};
const uint8_t EPD_SRAMYASE[]={0x45、0x00、0xf9};
const uint8_t EPD_VCOMVol[]={0x2C、0xA0};
const uint8_t EPD_unknown[]={0x02、0x21、0x83};
// uint8_t EPD_buffer [500];
/*
const uint8_t LUTDefault_FULLE[]={
0x32、//命令
0x50、0xAA、0xAA、0xAA、0xAA、 0xAA、0x55、0x55、0x55、0x55、 0x55、
0xAA、0xAA、0xAA、0xAA、0xAA、 0x11、0x00、0x00、0x00、0x00、 0xFF、
0xFF、0xFF、0xFF、0xFF、0xFF、 0xFF、0xFF、0x01、0x00、0x00、 0x00};
const uint8_t LUTDefault_part[]={
0x32、//命令
0x11、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、
0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、
0x17、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00};
*/
const uint8_t EPD_LUT[]={0x33、0x32、0x66、0x66、0x26、 0x04、0x55、0xAA、
0x08、0x91、0x11、0x88、0x00、 0x00、0x00、0x00、
0x00、0x00、0x19、0x19、0x0a、 0x0A、0x5e、0x1E、
0x1E、0x0a、0x39、0x14、0x00、 0x00、0x00};
void EPD_writeCommandData (const uint8_t * pcd、uint8_t len);
int main (void){
//停止看门狗计时器以防止超时复位
WDTCTL = WDTPW + WDTHOLD;
InitGpio();
InitClk();
InitEpd();
EPD_sendcmddata (0x4e、0x0);
EPD_sendcmddata (0x4f、0x0);
EPD_SEND_cmd (0x24);//写入 RAM
异径管;
epdcslow;
for (unsigned int s = 0;s < 4000;s++){
sendbyte (~img1[s]);
}
异径管;
while (1){
EPD_sendcmddata (0x22、0xc7);
EPD_SEND_cmd (0x20);
while (READ_EPD_BUSY ())
;
Delaylong(100);
}
}
void EPD_WAIT(){
while (READ_EPD_BUSY ())
;
}
void InitEpd (void){
//无符号字符 i;
EPD_SEND_cmd (0x12);
// Delaylong (1);
while (READ_EPD_BUSY ())
;
/*
EPD_writeCommandData (GDOControl、sizeof (GDOControl));
// EPD_writeCommandData (softstart、sizeof (softstart));
EPD_writeCommandData (EPD_SDLP、sizeof (EPD_SDLP);
EPD_writeCommandData (EPD_SGLW、sizeof (EPD_SGLW);
EPD_writeCommandData (EPD_DEMS、sizeof (EPD_DEMS));
EPD_writeCommandData (EPD_SRAMXASE、sizeof (EPD_SRAMXASE));
EPD_writeCommandData (EPD_SRAMYASE、sizeof (EPD_SRAMYASE));
EPD_writeCommandData (EPD_VCOMVol、尺寸(EPD_VCOMVol));
EPD_writeCommandData (EPD_LUT、sizeof (EPD_LUT));
// EPD_writeCommandData (EPD_UNKNOWN、sizeof (EPD_UNKNOWN));
*/
for (uint8_t i = 0;i <= 0x33;i++){
if ((i == 0x0)||(i == 0x3)||(i == 0x5)||(i == 0x7)||(i == 0x9)||
(i ==0xc)||(i ==0xF)||(i ==0x11)||(i ==0x13)||(i == 0x32){
epddclow;
}
epdcslow;
sendbyte(epdinit[i]);
异径管;
Eddchigh;
while (READ_EPD_BUSY ())
;
}
}
uint16_t EPD_linebuffer [((EPD_Y_RAW_Pixels / 16)+ 1)];
const uint8_t *EPD_linebuffer8 =(uint8_t *)(&EPD_linebuffer[0]);
const uint8_t _EPD_Stretch LUT[]={0x02、0x02、0x01、0x11、0x12、 0x12、0x22、0x22、
0x66、0x69、0x69、0x59、0x58、 0x99、0x99、0x88、
0x00、0x00、0x00、0x00、0xF8、 0xB4、0x13、0x51、
0x35、0x51、0x51、0x19、0x01、 0x00}
epp_stretch (uint8_t 字节)
{
uint8_t buf[2];
buf[0]=_EPD_STRETCH_LUT[(byte & 0x0F)];
buf[1]=_EPD_STRETCH_LUT[(字节>> 4)];
返回*((uint16_t *) buf);
}
void InitGpio (void){
// rfcslow;
// rfcklow;
// rfdalow;
// spiromcslow;
// epdunnecowhigh;
// epdbslow;
///
// rfoff;
P1DIR = B (3)| B (4)| B (5);
P2DIR = B (1)| B (2);
P1SEL = 0x00;
P1SEL2 = 0x00;
P2SEL = 0x00;
P2SEL2 = 0x00;
P3SEL = 0x00;
P3SEL2 = 0x00;
Delaylong(1);
*食喉管;
Delaylong(1);
麻醉剂低;
Delaylong(1);
*食喉管;
}
void InitClk (void){
DCOCTL = 0x0000;
BCSCTL1 = CALBC1_16MHZ;//设置范围
DCOCTL = CALDCO_16MHz;
BCSCTL3 |= LFXT1S_2;/* LFXT1的模式2:VLO */
IFG1 &=! (OFIFG);
延迟(512);
BCSCTL1 |= DIVA_0;/* ACLK 分频器3:/8 */
}
void epp_sendcmddata (int cmd、int data){
epddclow;
epdcslow;
sendbyte (cmd);
Eddchigh;
sendbyte (data);
异径管;
}
void epp_send_cmd (int cmd)
{
epddclow;
epdcslow;
sendbyte (cmd);
异径管;
Eddchigh;
}
void sendbyte (uint8_t sdbyte){
亚麻布克洛;
if (sdbyte & 0x80) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x40) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x20) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x10) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x08) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x04) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x02) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
if (sdbyte & 0x01) epdahhigh;else epddalow;
乳头酸盐;
亚麻布克洛;
}
void EPD_writeCommandData (const uint8_t *pcd、uint8_t len){
EPD_WAIT();
epddclow;
epdcslow;
sendbyte (* PCD++);
Eddchigh;
对于(uint8_t i = 0;I < len - 1;I++)
sendbyte (* PCD++);
异径管;
ASM ("NOP");
ASM ("NOP");
}
空延迟(unsigned int nCount){
用于(;nCount !=0;nCount --){
ASM ("NOP");
ASM ("NOP");
ASM ("NOP");
ASM ("NOP");
}
}
void Delaylong (unsigned int n10Count){
无符号字符 I;
while (n10Count --){
对于(I=0;I<10;I++){
延迟(10000);
}
}
}
IAM 无法编译代码。 任何人可以指导我完成该规范并帮助我解决问题。
提前感谢您。