这是12864头文件部分 注意我用的是模拟串口 不是串行通信
#include <MSP430g2553.h>
void int_port(void) //管脚初始化
{
P1SEL&=~BIT4; //P1.4模拟SID,设置为i/o口输出方向
P1DIR|=BIT4;
P1OUT&=~BIT4;
P1SEL&=~BIT5; //P1.5模拟SCLK,设置为i/o口输出方向
P1DIR|=BIT5;
P1OUT&=~BIT5;
}
void delay(unsigned int t) //延时函数
{ //粗略延时,满足时序要求
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
void sendbyte(unsigned char zdata) //数据传送函数
{
unsigned char code_seg7;
unsigned char serial_clk;
unsigned char serial_shift;
code_seg7=zdata;
serial_shift=0x80;
for(serial_clk=0; serial_clk<8; serial_clk++)
{
if(code_seg7&serial_shift)
{
P1OUT|=BIT4; //SID为1
}
else
{
P1OUT&=~BIT4; //SID为0
}
P1OUT&=~BIT5; //产生时钟信号下沿
P1OUT|=BIT5; //产生时钟信号上沿
serial_shift=serial_shift>>1; //准备发送下一位数据
}
}
void write_com(unsigned char cmdcode) //写命令函数
{ //串口控制格式(11111AB0)
//A数据方向控制,A=H时读,A=L时写
//B数据类型选择,B=H时为显示数据,B=L时为命令
sendbyte(0xf8); //MCU向LCD发命令
sendbyte(cmdcode & 0xf0); //发高四位数据(数据格式D7D6D5D4_0000)
sendbyte((cmdcode << 4) & 0xf0);//发低四位数据(数据格式D3D2D1D0_0000)
delay(2); //延时等待
}
/*******************************************************************************
向LCD读数据函数 难点在这里这是我写并口方式
*****************************************************************************/
unsigned char LcdReadData()//;写数据子程序
{
unsigned char data;
LcdCheckBusy(); //判断忙标,以确保上一指令/数据模块已经接收处理完
LCD_DATA_DIR_IN; //设置io 为输入 要想LCD 读数据
LCD_E_LOW;
//LCD_RS_HIGE;
LCD_READ; //RW=1 选择读操作
Delay_us(5);
LCD_E_HIGE; //LCD 使能
Delay_us(1);
data = LCD_IN; //往LCD 送数据
Delay_us(100); //延时
LCD_E_LOW; //关使能
Delay_us(10); // 延迟
return (data);
}
void write_data(unsigned char Dispdata)//写数据函数
{
sendbyte(0xfa); //MCU向LCD发数据
sendbyte(Dispdata & 0xf0); //发高四位数据
sendbyte((Dispdata << 4) & 0xf0);//发低四位数据
delay(2);
}
void lcdinit() //LCD初始化
{
delay(20000); //复位等待(内部自带上电复位电路),时间较长
write_com(0x30); //功能设定:基本指令集操作
delay(50); //延时等待
write_com(0x0c); //整体显示,关游标
delay(50);
write_com(0x06); //整体显示,关游标
delay(50);
write_com(0x10); //整体显示,关游标
delay(50);
}
void print_string(unsigned char *s) //发送字符串
{
while(*s > 0) //C语言里字符串末尾自动加“ ”(ASCII码值为0)
{
write_data(*s); //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址
s++;
delay(50);
}
}
//=========================================
//函数功能:显示bmp图像(GDRAM)
//=========================================
void Display_BMP(const unsigned char *bmp)
{
unsigned char i = 0,j = 0;
write_com(0x34); //扩充指令,绘图打开
for(i=0;i<32;i++)
{
write_com(0x80|i);//先送垂直地址
write_com(0x80); //再送水平地址,显示图片的上半部分
for(j=0;j<16;j++)
{
write_data(*bmp);
bmp++;
}
}
for(i=0;i<32;i++)
{
write_com(0x80|i); //先送垂直地址
write_com(0x88); //显示图片的下半部分
for(j=0;j<16;j++)
{
write_data(*bmp);
bmp++;
}
}
write_com(0x36); //基本指令,绘图关闭
}
/******************************************************************************
数据填充函数
设置为扩充指令,关闭绘图模式
连续写两个字节的GDRAM地址,先写垂直地址,后写水平地址
写两个字节数据,先写高8位数据,后写低8位数据
打开绘图模式
设置回基本指令集
*******************************************************************************/
void FillGdram(unsigned char data)
{
unsigned char i;
unsigned char j;
unsigned char k;
unsigned char xAddress = 0x80;
unsigned char yAddress = 0x80;
for( i = 0;i < 2;i++ )
{
for(j = 0;j <32;j++)
{
for(k = 0;k < 16;k++)
{
write_com(0x34);
write_com(yAddress + j);//GDRAM垂直地址Y
write_com(xAddress + k);//GDRAM水平地址X
write_data(data);
write_data(data);
}
}
xAddress = 0x88;
}
write_com(0x36);
write_com(0x30);
}
/****************************************************************************
画点函数(过程:读->修改->写)
x,y坐标区间分别为[0,127]、[0,63](即:0<= x <=127,0<= y <=63)
4个顶点坐标:
(0,0)________________(127,0)
| |
| 12864 |
| LCD |
(0,63)|_______________ |(127,63)
(X, Y )为点坐标; color = 1,该点填充1 ,color = 0 该点填充0
***************************************************************************/
void DrawPoint(unsigned char x,unsigned char y,unsigned char color)
{
unsigned char Row,Tier,Tier_bit;
unsigned char ReadOldH,ReadOldL;
write_com(0x34);
write_com(0x36);//设定为扩展指令,8位数据操作
Tier = x >> 4;
Tier_bit = x & 0x0f;
if(y < 32)
{
Row = y;
}
else
{
Row = y -32;
Tier += 8;
}
write_com(0x80 + Row);
write_com(0x80 + Tier);
LcdReadData(); //预读数操作
ReadOldH = LcdReadData(); //读取当前显示高8位数据
ReadOldL = LcdReadData(); //读取当前显示低8位数据
Delay_us(250);
write_com(0x80 + Row);
write_com(0x80 + Tier);
Delay_us(250);
if(Tier_bit < 8)//判断当前是高8位还是低8位
{
switch(color)
{
case 0: ReadOldH &= (~(0x01 << (7 - Tier_bit)));break;
case 1: ReadOldH |= (0x01 << (7 - Tier_bit)) ;break;
case 2: ReadOldH ^= (0x01 << (7 - Tier_bit)) ;break;
default:break;
}
write_data(ReadOldH);
write_data(ReadOldL);
}
else
{
switch(color)
{
case 0: ReadOldL &= (~(0x01 << (15 - Tier_bit)));break;
case 1: ReadOldL |= (0x01 << (15 - Tier_bit)) ;break;
case 2: ReadOldL ^= (0x01 << (15 - Tier_bit)) ;break;
default:break;
}
write_data(ReadOldH);
write_data(ReadOldL);
}
write_com(0x30);
}
此帖出自
小平头技术问答
一周热门 更多>