#include "LCD12864.h"
void Send_Byte(uint8 byte) {
while (!(UCA0IFG & UCTXIFG))
;
UCA0TXBUF = byte;
}
void Send_Cmd(uint8 cmd) {
Send_Byte(0xF8); //发送指令
Send_Byte(cmd & 0xF0); //第二字节
Send_Byte((cmd << 4) & 0xF0); //第三字节
__delay_cycles(72 * F_MCLK); //延时72us
}
void Send_Dat(uint8 data) {
Send_Byte(0xFA); //发送数据
Send_Byte(data & 0xF0); //第二字节
Send_Byte((data << 4) & 0xF0); //第三字节
__delay_cycles(72 * F_MCLK); //延时72us
}
/*******************************************
功 能:清空显示RAM
*******************************************/
void Clear_DDRAM(void) {
Send_Cmd(0x30);
Send_Cmd(0x01);
}
/*******************************************
功 能:清空绘图RAM
*******************************************/
void Clear_GDRAM(void) {
uint8 i, j, k;
Send_Cmd(0x34); //打开扩展指令集
i = 0x80;
for (j = 0; j < 32; j++) {
Send_Cmd(i++);
Send_Cmd(0x80);
for (k = 0; k < 16; k++) {
Send_Dat(0x00);
}
}
i = 0x80;
for (j = 0; j < 32; j++) {
Send_Cmd(i++);
Send_Cmd(0x88);
for (k = 0; k < 16; k++) {
Send_Dat(0x00);
}
}
Send_Cmd(0x30); //回到基本指令集
}
void Ini_LCD12864(void) {
//12864 CS片选脚接高电平!
P3SEL |= BIT3; //P3.3数据输出SIMO
P2SEL |= BIT7; //P2.7时钟CLK
UCA0CTL1 |= UCSWRST; //使能复位状态
UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;//首边沿改变,高电平不活动,高位在前,8位数据,主模式,三线SPI,同步模式
UCA0CTL1 |= UCSSEL_2; //SMCLK
UCA0BR0 = 0;
UCA0BR1 = 0; //UCxxBR0 + UCxxBR1 × 256
UCA0MCTL = 0;
UCA0CTL1 &= ~UCSWRST; //释放复位状态
Send_Cmd(0x30); //功能设置:一次送8位数据,基本指令集
Send_Cmd(0x02); //DDRAM地址归位
Send_Cmd(0x0C); //显示设定:开显示,不显示光标,不做当前显示位反白闪动
Send_Cmd(0x01); //清屏,将DDRAM的位址计数器调整为"00H"
__delay_cycles(1400L * F_MCLK); //1.4ms延时等待清屏完成
Send_Cmd(0x06); //功能设置:点设定:显示字符/光标从左到右移位,DDRAM地址加1
Clear_GDRAM();
}
/*******************************************
功 能:发送数字
参 数:addr:显示首地址 num:待显示数字
integer:整数部分长度 decimal:小数部分长度(一个地址对应两个数字)
*******************************************/
void Disp_Num(uint8 addr, double num, uint8 integer, uint8 decimal) {
uint8 stack[16], buffer[16];
uint8 length = 0, tmp, index = 0;
enum STATE {
POS, OPOS, NEG, ONEG
} flag; //状态:整数不为零的正数,整数为零的正数,整数不为零的负数,整数为零的负数
long value;
if (num < 0) {
num *= -1;
if ((long) num)
flag = NEG;
else {
flag = ONEG;
num += 1; //整数为零时加1作整数非零处理
}
} else {
if ((long) num)
flag = POS;
else {
flag = OPOS;
num += 1; //整数为零时加1作整数非零处理
}
}
/***小数转化为整数***/
tmp = decimal;
while (tmp--)
num *= 10;
value = (long) num;
/***取出value每一位数字入栈***/
do {
stack[length] = '0' + (value % 10);
value /= 10;
length++;
} while (value);
/***整数部分补空格及符号***/
tmp = integer + decimal - length;
while (tmp--)
buffer[index++] = ' ';
if (flag > OPOS)
buffer[index - 1] = '-';
/***写整数部分***/
tmp = length - decimal;
while (tmp--)
buffer[index++] = stack[--length];
if ((flag == OPOS) || (flag == ONEG))
buffer[index - 1] = '0'; //整数为零的数还原整数部分为0
buffer[index++] = '.';
/***写小数部分***/
while (decimal--)
buffer[index++] = stack[--length];
buffer[index] = '\0';
Disp_Str(addr, buffer);
}
/*******************************************
功 能:发送字符串
参 数:addr:显示首地址 *pt:待显示字符串(一个地址对应一个汉字或两个字母)
*******************************************/
void Disp_Str(uint8 addr, uint8 *pt) {
Send_Cmd(addr);
while ((*pt) != '\0')
Send_Dat(*(pt++));
}
/*******************************************
12864屏幕DDRAM地址
0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87
0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97
0x88 0x89 0x8A 0X8B 0X8C 0X8D 0X8E 0X8F
0x98 0X99 0X9A 0X9B 0X9C 0X9D 0X9E 0X9F
*******************************************/
SPI总线驱动12864(含注释)
需积分: 15 12 浏览量
2017-03-10
11:21:51
上传
评论 2
收藏 2KB RAR 举报
纸言片羽
- 粉丝: 2
- 资源: 6
最新资源
- 细胞的奇迹:吃出来的免疫力(美亚畅销书!作者的TED演讲播放量超300万次!《谷物大脑》作者、《三联生活周刊》推荐!吃下对的食物,改善你的... (Z-Library).azw3
- 智能手机产品拆解,使用mindmaster打开
- 11111111111111
- 统信系统ARM64依赖openssl-1.0.2版本的libssl.so.10和libcrypto.so.10文件
- 奥比中光python sdk
- 冯超楠17.py
- OCR识别-基于视觉注意力机制Attention实现的OCR识别算法-附项目源码-优质项目实战.zip
- Java 使用蒙特卡洛方法估算PI的近似值(源代码)
- main.cpp
- 电子木鱼小程序源码电子木鱼小程序源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈