📄 12864驱动.h
字号:
/********************************************
* 硬件连接 :LCD12864 M16 *
* RESET _________ M16:PA1 *
* PSB ___________ M16:PA3 *
* CLK ___________ M16:PA7 *
* SID ___________ M16:PA6 *
* CS ____________ M16:PA5 *
********************************************/
#include <iom16v.h>
#include <macros.h>
#include "延时.h"
//宏定义:定义各种操作的管脚
//使用前应由主程序配置其输入、输出
//LCD控制端口
#define lcd_kz PORTA
//串行时钟端:PA7输出
#define clk 2
#define set_lcd_clk lcd_kz|=(1<<clk) //置高
#define clr_lcd_clk lcd_kz&=(~(1<<clk)) //清0
//片选控制端CS操作:PA5输出
#define cs 0
#define set_lcd_cs lcd_kz|=1
#define clr_lcd_cs lcd_kz&=(~(1<<cs)) //清0
//串行数据输入端SID操作:PA6输出
#define sid 1
#define clr_lcd_sid lcd_kz&=(~(1<<sid)) //清0
#define set_lcd_sid lcd_kz|=(1<<sid) //置位
//8/4位选择控制PSB操作:PA3输出
#define psb 7
#define clr_lcd_psb PORTC&=(~(1<<psb)) //清0:4位
#define set_lcd_psb PORTC|=(1<<psb) //置位:8位
//复位端RST操作:PA1输出
#define rst 5
#define clr_lcd_rst PORTC&=(~(1<<rst)) //清0
#define set_lcd_rst PORTC|=(1<<rst) //置位
//宏定义:定义无符号数据的简写
#define uchar unsigned char
#define uint unsigned int
/************************************
* 模拟串口专用延时函数 *
************************************/
void delay(void)
{
NOP();
NOP();
NOP();
NOP();
}
/*****************************************
* 写指定位数到12864的函数 *
* 入口参数:n写入位数,data写入数据 *
* 说 明:将data的高n位写入 *
*****************************************/
void wr_bit(uchar n,uchar data)
{
for(;n;n--) //写入位数
{
if(data&0x80) //判断应写入1或0
{set_lcd_sid;}
else
{clr_lcd_sid;}
data=data<<1; //左移一位,准备写入下一位
delay();
set_lcd_clk; //产生上升沿,写入
delay();
clr_lcd_clk;
}
}
/*****************************************
* 写指令或数据到12864函数 *
*入口参数:a=1写显示数据,a=0写指令数据 *
* b需写入的数据 *
*时 序:按手册时序进行 *
*****************************************/
void wr_12864(uchar a,uchar b)
{
clr_lcd_clk;
wr_bit(5,0xFF); //写入五个1
wr_bit(1,0x00); //写入R/W=0,写入数据
if(a==0) //根据a值写入RS值
wr_bit(1,0x00); //如果a为1,写指令(RS=0)
else
wr_bit(1,0x80); //如果a不为1,写数据(RS=1)
wr_bit(1,0x00); //写入一个0
wr_bit(4,b); //写入数据的高4位
wr_bit(4,0x00); //写入4个0
wr_bit(4,(b<<4)); //写入数据的低4位
wr_bit(4,0x00); //写入4个0
set_lcd_sid; //非数据传送状态数据端置高
}
/*****************************************
* LCD12864初始化函数 *
*****************************************/
void lcd12864_init(void)
{
clr_lcd_psb; //串行工作方式
delay_ms(50);
clr_lcd_rst; //复位
delay_ms(100);
set_lcd_rst;
delay_ms(200);
set_lcd_cs; //片选高电平有效
wr_12864(0,0x30); //设置数据方式:8位
delay_us(200);
wr_12864(0,0x30); //设置数据方式:8位
delay_us(80);
wr_12864(0,0x0C); //开显示
delay_us(80);
wr_12864(0,0x40); //开显示
delay_us(200);
wr_12864(0,0x01); //清屏
delay_ms(200);
}
/************************************
* LCD12864显示字符串函数 *
************************************/
//入口:待显示的字符串
void lcd(char *s)
{
while(*s)
{
wr_12864(1,*s);
s++;
}
}
/************************************
* LCD12864显示定位函数 *
* 入 口:h定位的行数,V列数 *
************************************/
void locate(uchar h,uchar v)
{
switch(h)
{
case 1:
wr_12864(0,(0x80+v-1)); //写第一行V列地址
break;
case 2:
wr_12864(0,(0x90+v-1)); //写第二行V列地址
break;
case 3:
wr_12864(0,(0x88+v-1)); //写第三行V列地址
break;
case 4:
wr_12864(0,(0x98+v-1)); //写第四行V列地址
break;
default:break;
}
}
/************************************
* LCD12864显示清屏函数 *
************************************/
void cls(void)
{
delay_us(200);
wr_12864(0,0x01); //清屏
delay_ms(20);
}
/********************************
* 显示公司广告语函数 *
********************************/
void guanggao(void)
{
locate(1,3);
lcd("欢迎使用");
locate(2,1);
lcd("转向轮参数测试仪");
locate(3,2);
lcd("--Vision 1.0");
locate(4,1);
lcd("机电学院04电气");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -