📄 main.c
字号:
/*****************************************************************************
* 文件名称:
* main.c
* 文件说明:
* 根据键盘的控制,移动字符串"Hello"或者"华东师范大学",行列键盘的"7"用
* 于字符串左移,"8"用于字符串下移,"9"用于字符串右移,"5"
* 用于字符串上移。按键每按一下向各自的方向移动一个点阵的
* 位置。
********************************************************************************/
#define MSP430F449_H 0
#include <msp430x44x.h>
#ifndef LCD_IN_USE
#include "lcd.c"
#endif
#ifndef KEY_BOARD
#include "keyboard12.c"
#endif
/*******************************************************************************/
#define TOP 0 // 竖直方向零点
#define BOTTOM 64 // 竖直方向坐标最大值
#define LEFT 0 // 水平方向坐标最小值
#define RIGHT 128 // 水平方向坐标最大值
#define EN_WIDTH 40 // Hello 字符串的长度
#define CH_WIDTH 96 // 中文字符串的长度
#define OP_CHINESE 1 // 选择显示中文字符
#define OP_ENGLISH 2 // 选择显示英文字符
void drawStr(unsigned char x,unsigned char y);
void op_Select(char OP);
unsigned char showData[]={//16*8点阵的“Hello”
0x08,0x20,0xF8,0x3F,0x08,0x21,0x00,0x01,
0x00,0x01,0x08,0x21,0xF8,0x3F,0x08,0x20,//H (0)
0x00,0x00,0x00,0x1F,0x80,0x22,0x80,0x22,
0x80,0x22,0x80,0x22,0x00,0x13,0x00,0x00,//e (1)
0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,
0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,//l (2)
0x00,0x00,0x08,0x20,0x08,0x20,0xF8,0x3F,
0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,//l (3)
0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,
0x80,0x20,0x80,0x20,0x00,0x1F,0x00,0x00,//o (4)
};
unsigned char showData_1[]={ //16*16点点阵的"华东师大"
0x20,0x00,0x10,0x04,0x08,0x04,0xFC,0x05,
0x03,0x04,0x02,0x04,0x10,0x04,0x10,0xFF,
0x7F,0x04,0x88,0x04,0x88,0x04,0x84,0x04,
0x86,0x04,0xE4,0x04,0x00,0x04,0x00,0x00,//华 (0)
0x00,0x00,0x04,0x00,0x04,0x20,0xC4,0x18,
0xB4,0x0E,0x8C,0x04,0x87,0x20,0x84,0x40,
0xF4,0xFF,0x84,0x00,0x84,0x02,0x84,0x04,
0x84,0x18,0x04,0x30,0x00,0x00,0x00,0x00,//东 (1)
0x00,0x40,0xFC,0x27,0x00,0x10,0x00,0x0E,
0xFF,0x01,0x00,0x00,0xF2,0x0F,0x12,0x00,
0x12,0x00,0x12,0x00,0xFE,0xFF,0x12,0x00,
0x12,0x04,0x12,0x08,0xF2,0x07,0x00,0x00,//师 (2)
0x44,0x08,0x94,0x09,0xA4,0xF8,0x64,0x04,
0x04,0x03,0x0F,0x00,0x04,0x00,0xE4,0x3F,
0x24,0x40,0x2C,0x40,0x2F,0x42,0x24,0x46,
0xE4,0x43,0x04,0x70,0x04,0x00,0x00,0x00,//范 (3)
0x20,0x00,0x20,0x80,0x20,0x40,0x20,0x20,
0x20,0x10,0x20,0x0C,0xA0,0x03,0x7F,0x00,
0xA0,0x01,0x20,0x06,0x20,0x08,0x20,0x30,
0x20,0x60,0x20,0xC0,0x20,0x40,0x00,0x00,//大 (4)
0x40,0x00,0x30,0x02,0x10,0x02,0x12,0x02,
0x5C,0x02,0x54,0x02,0x50,0x42,0x51,0x82,
0x5E,0x7F,0xD4,0x02,0x50,0x02,0x18,0x02,
0x57,0x02,0x32,0x02,0x10,0x02,0x00,0x00 //学 (5)
};
/*******************************************************************************
* 用于取得一个字节的低N位的数组
*********************************************************************************/
const unsigned char mapTbl[]=
{
0x01,0x03,0x07,0x0f,
0x1f,0x3f,0x7f,0xff
};
unsigned char px, // 显示字符串的X位置
py, // 显示字符串的Y位置
width; // 字符串的宽度
unsigned char * showBuf; // 显示数据缓冲区
/*********************************************************************************
* main函数
***********************************************************************************/
void main()
{
WDTCTL = WDTHOLD + WDTPW; // 关闭看门狗
init_LCD(); // 初始化点阵LCD
init_Keyboard(); // 初始化键盘
op_Select(OP_ENGLISH); // 选择显示字符类型
drawStr(px,py); //显示字符串
while(1)
{
key_Event(); //检测按键事件
if(key_Flag== 0x01) //有按键
{
key_Flag=0x00; //清除按键标识
if(key_val==0x05) //上移
{
if(px>TOP) //如果可以上移
{
clear_Rect(px/8,0,3,64); //清除chip1可能有数据的三个区域
clear_Rect(px/8,64,3,64); //清除chip2可能有数据的三个区域
drawStr(px-1,py); //显示字符
px = px-1;
}
}else if (key_val==0x07) //左移
{
if(py>LEFT) //如果可以左移
{
clear_Rect(px/8,0,3,64);
clear_Rect(px/8,64,3,64);
drawStr(px,py-1);
py=py-1;
}
}else if (key_val==0x08) //下移
{
if(px<BOTTOM-16) //如果可以下移
{
clear_Rect(px/8,0,3,64);
clear_Rect(px/8,64,3,64);
drawStr(px+1,py);
px = px+1;
}
}else if (key_val==0x09) //右移
{
if (py<RIGHT - CH_WIDTH) //如果可以右移
{
clear_Rect(px/8,0,3,64);
clear_Rect(px/8,64,3,64);
drawStr(px,py+1);
py = py+1;
}
}
}
}
}
/******************************************************************************
* 在指定的位置显示字符串"Hello" 或者 "华东师范大学"
* x是行坐标,y是列坐标,0=<x<=RIGHT - 字符串长度
* 0=<y<=BOTTOM-字符串高度
********************************************************************************/
void drawStr(unsigned char x,unsigned char y)
{
unsigned char tmpv,t1,t2,t3;
if((x&0x07)==0x00) //如果刚好位于某一页的开始
{
for(tmpv=y;tmpv<y+width;tmpv++)
{
move_To(x/8,tmpv); //移动到指定页
write_Data(showBuf[2*(tmpv-y)]); //填写数据
move_To(x/8+1,tmpv); //由于显示的字符是16*N点阵,占用两页,现在移动到下页
write_Data(showBuf[2*(tmpv-y)+1]); //填写数据
}
}else{
t1 = (x&0x07);
for(tmpv=y;tmpv<y+width;tmpv++)
{
/* 实验使用的点阵LCD是逆向显示的,关于逆向显示的含义请参看实验中的实验说明 */
move_To(x/8,tmpv); //移动位置
t2 = showBuf[2*(tmpv-y)]; //取得要显示的数据
t2 = t2 & mapTbl[8-t1]; //获取数据的低(8-t1)位
t2= t2<<t1; //左移t1位
write_Data(t2); //填写数据
move_To(x/8+1,tmpv); //移动
t2 = showBuf[2*(tmpv-y)]; //取得数据
t2= t2>>(8-t1); //右移(8-t1)
t3 = showBuf[2*(tmpv-y)+1];
t3 = t3 & mapTbl[8-t1]; //取得低(8-t1)位
t3=t3<<t1; //右移t1位
t2=(t2+t3); //组合成要显示的数据
write_Data(t2); //显示数据
move_To(x/8+2,tmpv); //移动到下一页
t2 = showBuf[2*(tmpv-y)+1];
t2=t2>>(8-t1); //右移(8-t1)位
write_Data(t2); //填写数据
}
}
}
/********************************************************************************
*
* 根据选择的是显示中文还是英文,设置不同的显示变量
*
********************************************************************************/
void op_Select(char OP)
{
if(OP==OP_CHINESE)
{
width = CH_WIDTH; // 设定字符串长度
px=24; // 初始化显示位置,X坐标
py=16; // Y坐标
showBuf = showData_1;
}
else if (OP==OP_ENGLISH)
{
width = EN_WIDTH; // 设定字符串长度
px=24; // 初始化显示位置,X坐标
py=40; // Y坐标
showBuf = showData;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -