📄 lcd_driver.c
字号:
/***********************************************
*LCD调试程序*
Lcd_Driver.c 160128 T6963C
***********************************************/
/*头文件*/
#include <C8051F000.h>
#include <absacc.h>
#include <intrins.h>
/*typedef*/
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
#define LCD_DataPort P2
// LCD128*64 I/O 信号管脚
sbit CD = P0^7; // 指令\数据 选择 高选择指令,低选择数据
sbit CE = P0^3; // 片选信号,低电平有效
sbit RD = P0^4; // 读选择 ,低电平有效
sbit WR = P1^0; // 写信号,低有效
//横向取模,字节不倒序
const unsigned char code cctab[128]={
/*-- 文字: 电 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x00,
/*-- 文字: 压 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x3F,0xFE,0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x88,0x2F,0xFC,0x20,0x80,
0x20,0xA0,0x20,0x90,0x20,0x98,0x40,0x90,0x40,0x80,0xBF,0xFE,0x00,0x00,0x00,0x00,
/*-- 文字: 测 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,
0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04,
/*-- 文字: 试 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,
0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00,
};
/******************初始化子程序****************/
/*时钟初始化*/
void SYSCLK_Init (void)
{
//晶振配置,采用内部晶振,默认为16MHz,八分频为2MHz
//允许时钟丢失监测器
// OSCICN = 0x94;
// OSCXCN = 0x00;
//外部晶振
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
/*端口初始化*/
void PORT_Init (void)
{
//交叉开关使能,但没有进行外围设备配置
XBR0 = 0x00;
XBR1 = 0x00;
XBR2 = 0x40;
//均配置为开漏输出
PRT0CF |= 0x00;
PRT1CF |= 0x00;
PRT2CF |= 0x00;
PRT3CF |= 0x00;
}
/*****************LCD子程序***********************/
//读取LCD状态字
uchar readstate(void)
{
uchar lcd_state;
LCD_DataPort=0xff; // 读取总线端口物理电平
CD=1;
_nop_();
RD=0;
_nop_();
lcd_state=LCD_DataPort;
_nop_();
_nop_();
RD=1;
return lcd_state;
/*
DDRA=0x00;
DDRC|=(1<<3);
DDRE|=(1<<6);
PORTC|=(1<<3); // C/D=1
PORTE&=~(1<<6); // /RD=0
lcd_state=PINA&0xff; // 读取引脚A物理电平
NOP();
NOP();
PORTE|=(1<<6); // /RD=1
return lcd_state;
*/
}
//判断指令(数据)读写状态
void st01(void)
{
while((readstate()&0x03)!=3)
;
}
//判断数据自动读状态
void st2(void)
{
while((readstate()&0x04)!=4)
;
}
//判断数据自动写状态
void st3(void)
{
while((readstate()&0x08)!=8)
;
}
//指令写入函数
void writecode(uchar comd0)
{
st01();
LCD_DataPort=comd0;
WR=0; // /WR=0
_nop_();
_nop_();
WR=1; // /WR=1
/* st01();
DDRA=0xff; //A口方向为输出
PORTA=comd0; //送数据到A口寄存器
DDRE|=(1<<7);
PORTE&=~(1<<7); // /WR=0
NOP();
PORTE|=(1<<7); // /WR=1
*/
}
//数据写入函数
void writedata(uchar onedata)
{
st01(); //状态判断
CD=0; //C/D=0,数据通道
_nop_();
LCD_DataPort=onedata;
WR=0; // /WR=0
_nop_();
_nop_();
WR=1; // /WR=1
/*
st01();
DDRC|=(1<<3);
PORTC&=~(1<<3); // C/D=0,数据通道
DDRA=0xff; //A口方向为输出
PORTA=onedata; //送数据到A口寄存器
DDRE|=(1<<7);
PORTE&=~(1<<7); // /WR=0
NOP();
PORTE|=(1<<7); // /WR=1
*/
}
//数据自动写入函数
void writeauto(uchar onedata)
{
st3(); //状态判断
CD=0; //C/D=0,数据通道
_nop_();
LCD_DataPort=onedata;
WR=0; // /WR=0
_nop_();
_nop_();
WR=1; // /WR=1
/*
st3();
DDRC|=(1<<3);
PORTC&=~(1<<3); // C/D=0,数据通道
DDRA=0xff; //A口方向为输出
PORTA=onedata; //送数据到A口寄存器
DDRE|=(1<<7);
PORTE&=~(1<<7); // /WR=0
NOP();
PORTE|=(1<<7); // /WR=1
*/
}
//一字节参数指令写入函数
void oneparameter(uchar onep1,uchar comd1)
{
writedata(onep1);
writecode(comd1);
}
//两字节参数指令写入函数
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{
writedata(twop1);
writedata(twop2);
writecode(comd2);
}
/***********************************************************
液晶初始化,清屏
***********************************************************/
//内置T6963C控制器液晶初始化函数
void lcd_init(void)
{
twoparameter(0x00,0x00,0x40); //文本显示区域首地址0x0000
twoparameter(0x20,0x00,0x41); //文本显示区域宽度32字节
twoparameter(0x00,0x08,0x42); //图形显示区域首地址0x0800
twoparameter(0x20,0x00,0x43); //图形显示区域宽度32字节
writecode(0xa7); //光标形状
writecode(0x80); //显示方式设置(使用内部CGROM,逻辑或合成)
writecode(0x9c); //显示开关(开文本和图形显示方式,禁止光标显示和闪烁)
}
//清除屏幕(清所有8K存储空间)
void lcd_clear(void)
{
uint cl_count;
twoparameter(0x00,0x00,0x24); //设置显示存储器首地址
writecode(0xb0); //设置自动写状态
for(cl_count=8192;cl_count>0;cl_count--)
writeauto(0x00);
writecode(0xb2); //关闭自动写状态
}
/********************************************************
西文字符,汉字,点阵显示函数
********************************************************/
//西文字符写入函数
//x_asc:0~19; y_asc:0~15
void writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
{
uint address;
address=y_asc*32+x_asc;
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
oneparameter(code_asc,0xc4); //装入字符代码,写入数据,地址不变
}
//汉字写入函数
//x_hz:0~19; y_hz:0~127
void writehz(uchar x_hz,uchar y_hz,uchar code_hz)
{
uchar i_hz;
uint address,addr_hz;
address=y_hz*32+x_hz+0x0800; //计算显示存储器地址
addr_hz=code_hz*32; //计算汉字字模地址(cctab的下标)
for(i_hz=0;i_hz<16;i_hz++) //计数值16
{
twoparameter((uchar)(address),(uchar)(address>>8),0x24); //设置显示存储器地址
oneparameter(cctab[addr_hz++],0xc0); //写入汉字字模左部
oneparameter((cctab[addr_hz++]),0xc0);//写入汉字字模右部
address+=32; //修改显示存储器地址,显示下一列(共16列)
}
}
//写数字
void writenum(uchar x_asc,uchar y_asc,uchar code_asc)
{
code_asc+=0x10;
writeasc(x_asc,y_asc,code_asc);
}
//写字母
void writeabc(uchar x_asc,uchar y_asc,uchar code_asc)
{
code_asc-=0x20;
writeasc(x_asc,y_asc,code_asc);
}
/*********************主程序*******************/
void main(void)
{
WDTCN = 0xDE; //禁止看门狗
WDTCN = 0xAD;
SYSCLK_Init(); //初始化时钟
PORT_Init(); //初始化端口
CE=0;
lcd_init();
lcd_clear();
// writeasc(2,2,'2');
while(1)
{
// writeasc(0,0,'0');
writehz(1,30,0);
writehz(1,46,1);
writehz(1,62,2);
writehz(1,78,3);
// writenum(1,10,9);
writenum(1,1,1);
writenum(2,1,2);
writenum(3,1,3);
writenum(4,1,4);
writenum(5,1,5);
writenum(6,1,6);
writenum(7,1,7);
writenum(8,1,8);
writenum(9,1,9);
writeabc(0,2,'a');
writeabc(1,2,'b');
writeabc(2,2,'c');
writeabc(3,2,'d');
writeabc(4,2,'e');
writeabc(5,2,'f');
writeabc(6,2,'g');
writeabc(7,2,'h');
writeabc(8,2,'i');
writeabc(9,2,'j');
writeabc(10,2,'k');
writeabc(11,2,'l');
writeabc(12,2,'m');
writeabc(13,2,'n');
writeabc(14,2,'p');
writeabc(15,2,'q');
/* writeasc(13,0,10);
writeasc(13,1,10);
writeasc(13,2,10);
writeasc(13,3,10);
writeasc(13,4,10);
writeasc(13,5,10);
writeasc(13,6,10);
writeasc(13,7,10);
writeasc(13,8,10);
writeasc(13,9,10);
writeasc(13,10,10);
writeasc(13,11,10);
writeasc(13,12,10);
writeasc(13,13,10);
writeasc(13,14,10);
writeasc(13,15,11);
// writeasc(13,16,10);
// writeasc(13,0,10);
writeasc(0,0,0x10);
writeasc(1,0,0x10);
writeasc(2,0,0x10);
writeasc(3,0,0x10);
writeasc(4,0,0x10);
writeasc(5,0,0x10);
writeasc(6,0,0x10);
writeasc(7,0,0x10);
writeasc(8,0,0x10);
writeasc(9,0,0x10);
writeasc(10,0,0x10);
writeasc(11,0,0x10);
writeasc(12,0,0x10);
writeasc(13,0,0x10);
writeasc(14,0,0x10);
writeasc(15,0,0x10);
writeasc(16,0,0x10);
writeasc(17,0,0x10);
writeasc(18,0,0x10);
writeasc(19,0,0x11);
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -