📄 lcd_dispaly.c
字号:
#include <msp430x44x.h>
#include <zimo.c>
// MSP430F449 LCD DISplay
// MSP430F449
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|- ________
// | | | |
// | P2.0|-->| l |
// | . | . | |
// | P2.3| . | C |
// | P2.6| . | |
// | P2.7| . | D |
// | P3.0| . | |
// | . | . | |
// | P3.7|-->|________|
// | |
// 变量定义
unsigned int command; //命令字
unsigned int write_buff; //写命令缓冲
unsigned int width_count; //字符宽度计数器
unsigned int width_char; //每个字符宽度
unsigned int p_count; //页计数器
unsigned int y_count; //列计数器
unsigned int i,j; //计数器变量
unsigned int begin_letter, begin_col; //分别代表所需显示的第一个字母位置,显示开始的列
//子程序定义
void port_ini(void); //端口初始化子程序
void write_command(void); //写命令字子程序
void clear_lcd(void); //清屏子程序
void disp_content(void); //显示所需内容子程序
void display_char(void); //显示子程序
void write_char(void); //写单个字符子程序
void write_strings(void); //写字符串子程序
//端口定义
unsigned char P2_0_RS=0x01; // RS PIN
unsigned char P2_1_RW=0x02; // R/W PIN
unsigned char P2_2_EN=0x04; // EN PIN
unsigned char P2_3_CS1=0x08; // CS1 PIN
unsigned char P2_6_CS2=0x40; // CS2 PIN
unsigned char P2_7_RST=0x80; // RST PIN
unsigned char P3_0_DB0=0x01; // DB0 PIN
unsigned char P3_1_DB1=0x02; // DB1 PIN
unsigned char P3_2_DB2=0x04; // DB2 PIN
unsigned char P3_3_DB3=0x08; // DB3 PIN
unsigned char P3_4_DB4=0x10; // DB4 PIN
unsigned char P3_5_DB5=0x20; // DB5 PIN
unsigned char P3_6_DB6=0x40; // DB6 PIN
unsigned char P3_7_DB7=0x80; // DB7 PIN
// 初始化 ,包括端口,写命令字
void Ini(void)
{
port_ini(); //端口初始化
_NOP();
_NOP();
command=0xc0; // 设定屏幕显示的起始行为0
write_command();
command=0x3f; // 设定屏幕开
write_command();
clear_lcd(); // 清屏
command=0x40; // 设定列地址为0
write_command();
command=0xb8; // 设定第0页显示
write_command();
}
// 主程序 显示disp_content
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗,单步调试时必须
Ini(); //调用初始化程序
loop:
disp_content(); //调用显示Welcome的子程序
goto loop; //循环跳转
}
// 显示disp_content子程序
void disp_content(void)
{
width_char=16;
next_time:
begin_col=2; //显示从第0列开始
for(begin_letter=32;begin_letter!=38;begin_letter++) //如果还没有显示完,继续!
{
p_count=0; //显示从第0页开始
y_count=begin_col;
display_char();
begin_letter++;
begin_col=begin_col+18; //每个字符间隔为18列
}
p_count=1;
begin_col=2;
for(begin_letter=33;begin_letter!=39;begin_letter++)
{
y_count=begin_col;
display_char();
begin_letter++;
begin_col=begin_col+18; //每个字符间隔为18列
}
// begin_col++;
goto next_time;
}
// 端口初始化
void port_ini(void)
{
P3DIR=0xff; //P3口为输出口
P3OUT=0xff;
P2DIR=0xff; //P2口为输出口
P2OUT=P2OUT|P2_3_CS1|P2_6_CS2; //CS1,CS2都选通
P2OUT=P2OUT|P2_7_RST; //液晶复位
P2OUT=P2OUT&~P2_7_RST;
_NOP();
_NOP();
P2OUT=P2OUT|P2_2_EN;
_NOP();
_NOP();
P2OUT=P2OUT&~P2_2_EN; //产生下降沿,使能液晶
_NOP();
_NOP();
P2OUT=P2OUT|P2_7_RST; //液晶正常
_NOP();
_NOP();
}
// 写控制命令字程序
void write_command(void)
{
P3DIR=0xff; //P3口为输出口
P2OUT=P2OUT|P2_3_CS1|P2_6_CS2;
P2OUT=P2OUT&~P2_0_RS&~P2_1_RW; //指令输入,写控制字
P3OUT=command;
P2OUT=P2OUT|P2_2_EN;
P2OUT=P2OUT&~P2_2_EN; //P2.2从高变低,使能液晶显示
}
// LCD 清屏子程序
void clear_lcd(void)
{
p_count=0; //页计数器设为0
y_count=0; //列计数器设为0
next_clear_lcd:
command=0xb8;
command=command+p_count; //设定第p_count页显示
write_command();
write_first:
command=0x40; //设定列地址为0
command=command+y_count; //列地址加上列计数器
write_command();
write_buff=0; //写缓冲为0
write_char();
y_count++; //列计算器加1
if(y_count!=64) //如果列数不到64,继续清屏
goto write_first;
y_count=0; //列计数器重新设为0
p_count++; //页计数器加1
if(p_count!=8) //如果页数不到8,继续每页清屏
goto next_clear_lcd;
}
// 显示字符子程序 入口变量为y_count,p_count, begin_letter,width_char
void display_char(void)
{
width_count=0; //所要显示字符的第0列
command=0xb8; //第0页
command=p_count+command; //页数加上页计数器
write_command();
next_char:
if(width_count==width_char)
goto display_char_end;
if(y_count<64) //如果前64列还没有显示完,继续在前64列显示
goto disp_0_page;
command=0x40; //转到后64列
command=command+y_count-64;
write_command();
P2OUT=P2OUT&~P2_3_CS1;
P2OUT=P2OUT|P2_6_CS2; //选通后64列
goto take_data;
disp_0_page: //前64列
command=0x40;
command=command+y_count; //第0列加上列计算器
write_command();
P2OUT=P2OUT|P2_3_CS1; //选通前64列
P2OUT=P2OUT&~P2_6_CS2;
take_data:
write_buff=code_char[begin_letter][width_count];
write_char();
y_count++;
width_count++;
goto next_char;
display_char_end:
_NOP();
}
//写单个字符子程序 入口变量write_buff
void write_char(void)
{
P2OUT=P2OUT|P2_0_RS; //数据输入
P2OUT=P2OUT&~P2_1_RW; //写入
P3OUT=write_buff; //写缓冲写入P3口
P2OUT=P2OUT|P2_2_EN;
P2OUT=P2OUT&~P2_2_EN; //液晶显示使能
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -