📄 main.c
字号:
#include <msp430x16x.h>
typedef unsigned char uchar;
typedef unsigned int uint ;
typedef unsigned long ulong;
#define LCD_CS_SEL P3OUT
#define LCD_CS_DIR P3DIR
#define LCD_CS_OUT P3OUT
#define LCD_CS_PIN 0x20 //00100000 p3.5
#define LCD_CLK_SEL P3OUT
#define LCD_CLK_DIR P3DIR
#define LCD_CLK_OUT P3OUT
#define LCD_CLK_PIN 0x80 //p3.7
#define LCD_SID_SEL P3OUT
#define LCD_SID_DIR P3DIR
#define LCD_SID_OUT P3OUT
#define LCD_SID_IN P3IN
#define LCD_SID_PIN 0x40 //p3.6
#define LCD_RESET_SEL P4OUT
#define LCD_RESET_DIR P4DIR
#define LCD_RESET_OUT P4OUT
#define LCD_RESET_PIN 0x00 //p4.0
void delay_us(ulong n);
void busy_delay();
void io_initial();
void lcd_initial();
void lcd_clear();
void lcd_gra_clear();
void lcd_locat(uchar x,uchar y);
void write_command(uchar command);
void write_data(uchar data);
void delay_us(ulong n)
{
ulong i;
for(i=0;i<n;i++);
}
void busy_delay()
{
delay_us(1000);
}
void io_initial() //初始化端口
{
LCD_CS_SEL &= ~LCD_CS_PIN; //CS
LCD_CS_OUT |= LCD_CS_PIN;
LCD_CS_DIR |= LCD_CS_PIN;
LCD_CLK_SEL &= ~LCD_CLK_PIN; //CLK
LCD_CLK_OUT &= ~LCD_CLK_PIN;
LCD_CLK_DIR |= LCD_CLK_PIN;
LCD_SID_SEL &= ~LCD_SID_PIN; //SID
LCD_SID_OUT |= LCD_SID_PIN;
LCD_SID_DIR |= LCD_SID_PIN;
LCD_RESET_SEL &= ~LCD_RESET_PIN; //RESET
LCD_RESET_OUT |= LCD_RESET_PIN;
LCD_RESET_DIR |= LCD_RESET_PIN;
}
void write_command(uchar command)
{
uchar command_tem,i;
busy_delay(); //延时,等忙
command_tem=command;
LCD_CS_OUT |= LCD_CS_PIN; //cs=1
LCD_SID_OUT |= LCD_SID_PIN; //data=1;
for(i=0;i<5;i++) //发5个连续1 '11111'
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
for(i=0;i<3;i++) //再发RW,RS,0, RS=RW=0 即000 write command
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
/*上面是发送一个完整的启动数据'11111000'*/
for(i=0;i<4;i++) //发送高4位,用的command
{
if(command&0x80) //如果x的msb是1
LCD_SID_OUT |= LCD_SID_PIN; //则data=1;
else
LCD_SID_OUT &= ~LCD_SID_PIN; //否则data=0;
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
command=command << 1; //左移一位
}
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
for(i=0;i<4;i++) //发送4个0;
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
for(i=0;i<4;i++) //发送低4位,用的command_tem
{
if(command_tem&0x08) //msb=1?
LCD_SID_OUT |= LCD_SID_PIN; //data=1;
else
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
command_tem = command_tem << 1; //左移
}
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
for(i=0;i<4;i++) //发送4个0;
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
LCD_CS_OUT |= LCD_CS_PIN; //i think it should be cs=0 ???
delay_us(100);
}
void write_data(uchar data)
{
uchar data_tem,i;
busy_delay();
data_tem = data;
LCD_CS_OUT |= LCD_CS_PIN; //cs=1
LCD_SID_OUT |= LCD_SID_PIN; //data=1;
for(i=0;i<5;i++) //发5个连续1 '11111'
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_SID_OUT &= ~LCD_SID_PIN; //RW=0,write
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_SID_OUT |= LCD_SID_PIN; //RS=1, select data mode
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_SID_OUT &= ~LCD_SID_PIN; //deat=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
/*上面是发送一个完整的启动数据'11111010'*/
for(i=0;i<4;i++) //发送高4位
{
if(data&0x80) //1
LCD_SID_OUT |= LCD_SID_PIN; //data=1;
else
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
data = data << 1;
}
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
for(i=0;i<4;i++) //发送4个0;
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
for(i=0;i<4;i++) //发送低4位
{
if(data_tem&0x08) //1
LCD_SID_OUT |= LCD_SID_PIN; //data=1;
else
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
data_tem = data_tem << 1;
}
LCD_SID_OUT &= ~LCD_SID_PIN; //data=0;
for(i=0;i<4;i++) //发送4个0;
{
LCD_CLK_OUT &= ~LCD_CLK_PIN; //clk=0
LCD_CLK_OUT |= LCD_CLK_PIN; //clk=1,上升沿写入
}
LCD_CS_OUT |= LCD_CS_PIN; //i think it should be cs=0 ???
delay_us(100);
}
void lcd_initial() //lcd initial
{
LCD_RESET_OUT &= ~LCD_RESET_PIN; //复位
delay_us(40000); //复位延时
LCD_RESET_OUT |= LCD_RESET_PIN; //rst=1
delay_us(40000);
write_command(0x30); //30:设定8位数据基本功能
delay_us(6000);
//write_command(0x30);
//delay_us(200);
//write_command(0x30);
//write_command(0x30); //写这么多次啊?
write_command(0x0c); //设显示状态,开显示,无游标
delay_us(100);
write_command(0x01); //清显示
delay_us(2000);
write_command(0x06); //设定进入点//??????
}
void lcd_clear()
{
write_command(0x01); // 01:清除显示
//write_command(0x34); // 34:设定8位数据扩展功能 ???
//write_command(0x30); // 30:设定8位数据基本功能
}
/*void lcd_gra_clear()
{
uchar hang,lie;
write_command(0x34);
write_command(0x36);
write_command(0x80);
for(lie=0;lie<32;lie++)
{
write_command(0x80+lie);
for(hang=0;hang<16;hang++)
{
//write_command(0x80+hang);
write_data(0x00);
write_data(0x00);
}
}
write_command(0x32);// 保持开图
}*/
void lcd_locat(uchar x,uchar y)
{
switch(x)
{
case 1: write_command(0x7f + y);break;
case 2: write_command(0x8f + y);break;
case 3: write_command(0x87 + y);break;
case 4: write_command(0x97 + y);break;
default:break;
}
}
void mo_shi(void)
{
lcd_locat(1,1);
write_data(0xC4);
write_data(0xA3);
write_data(0xCA);
write_data(0xBD);
write_data(0xA1);
write_data(0xC3);
}
void zi_dong(void)
{
write_data(0xD7);
write_data(0xD4);
write_data(0xB6);
write_data(0xAF);
}
void yao_kong(void)
{
write_data(0xD2);
write_data(0xA3);
write_data(0xBF);
write_data(0xD8);
}
void direc(void)
{
lcd_locat(2,1);
write_data(0xB7);
write_data(0xBD);
write_data(0xCF);
write_data(0xF2);
write_data(0xA1);
write_data(0xC3);
}
void zuo_you(void)
{
write_data(0xD7);
write_data(0xF3);
write_data(0xD3);
write_data(0xD2);
write_data(0xA1);
write_data(0xFB);
write_data(0xA1);
write_data(0xFA);
}
void zuo(void)
{
write_data(0xD7);
write_data(0xF3);
write_data(0xA1);
write_data(0xFB);
}
void you(void)
{
write_data(0xD3);
write_data(0xD2);
write_data(0xA1);
write_data(0xFA);
}
void up_down(void)
{
write_data(0xC9);
write_data(0xCF);
write_data(0xCF);
write_data(0xC2);
write_data(0xA1);
write_data(0xFC);
write_data(0xA1);
write_data(0xFD);
}
void up(void)
{
write_data(0xC9);
write_data(0xCF);
write_data(0xA1);
write_data(0xFC);
}
void down(void)
{
write_data(0xCF);
write_data(0xC2);
write_data(0xA1);
write_data(0xFD);
}
void xie_shang(void)
{
write_data(0xD0);
write_data(0xB1);
write_data(0xC9);
write_data(0xCF);
write_data(0x2F);
write_data(' ');
write_data(0x18);
}
void xie_xia(void)
{
write_data(0xD0);
write_data(0xB1);
write_data(0xCF);
write_data(0xC2);
write_data(0x2F);
write_data(' ');
write_data(0x19);
}
void designer(void)
{
//Designer:
lcd_locat(3,1);
write_data('D');
write_data('e');
write_data('s');
write_data('i');
write_data('g');
write_data('n');
write_data('e');
write_data('r');
write_data(0xA1);
write_data(0xC3);
write_data(0xCB);
write_data(0xD5);
write_data(0xD6);
write_data(0xDE);
//苏洲费文超孙日明
lcd_locat(4,1);
write_data(0xB7);
write_data(0xD1);
write_data(0xCE);
write_data(0xC4);
write_data(0xB3);
write_data(0xAC);
write_data(0xA1);
write_data(0xA2);
write_data(0xCB);
write_data(0xEF);
write_data(0xC8);
write_data(0xD5);
write_data(0xC3);
write_data(0xF7);
}
void moshi_11(void)
{
//模式:自动
mo_shi();
zi_dong();
//方向:左右
direc();
zuo_you();
//Designer:
designer();
}
void moshi_12(void)
{
//模式:自动
mo_shi();
zi_dong();
//方向:上下
direc();
up_down();
//Designer:
designer();
}
void moshi_13(void)
{
//模式:自动
mo_shi();
zi_dong();
//方向:左上
direc();
xie_shang();
//Designer:
designer();
}
void moshi_14(void)
{
//模式:自动
mo_shi();
zi_dong();
//方向:斜下
direc();
xie_xia();
//Designer:
designer();
}
void moshi_21(void)
{
//模式:遥控
mo_shi();
yao_kong();
//方向:左
direc();
zuo();
//Designer:
designer();
}
void moshi_22(void)
{
//模式:遥控
mo_shi();
yao_kong();
//方向:右
direc();
you();
//Designer:
designer();
}
void moshi_23(void)
{
//模式:遥控
mo_shi();
yao_kong();
//方向:上
direc();
up();
//Designer:
designer();
}
void moshi_24(void)
{
//模式:遥控
mo_shi();
yao_kong();
//方向:下
direc();
down();
//Designer:
designer();
}
void moshi_25(void)
{
//模式:遥控
mo_shi();
yao_kong();
//方向:斜上
direc();
xie_shang();
//Designer:
designer();
}
void moshi_26(void)
{
//模式:遥控
mo_shi();
yao_kong();
//方向:斜下
direc();
xie_xia();
//Designer:
designer();
}
void main()
{
do
{
IFG1 &= ~OFIFG;
delay_us(333);
}while(IFG1&OFIFG);
WDTCTL = WDTPW+WDTHOLD;
io_initial();
lcd_initial();
lcd_clear();
moshi_11();
_BIS_SR(LPM3_bits + GIE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -