📄 ts12864.c
字号:
/*****************************************************************
* Copyright (C) 2008, 华中科技大学电工电子科技创新中心
* All Rights Reserved.
*
* 文件名: TS12864A-1图形点阵LCD驱动程序(C8051版)
* 文件描述: 此版本专门用于《智能教学楼能源管理系统》的液晶驱动。
* 资源占用: 8根数据线 5根控制线
* 当前版本: 1.0
* 作者: 梁威魄(lwpo2008@yahoo.com.cn)
* 完成日期: 2008年3月20日 星期四
*****************************************************************/
/*****************************************************************
* 头文件声明
*****************************************************************/
#include "TS12864.h"
/*****************************************************************
函数功能:对LCD的忙状态进行检测,对TS12864A-1来说不是必要
参数说明:空
******************************************************************/
void LcdBusy(void)
{
unsigned char temp;
temp=SFRPAGE;
SFRPAGE= CONFIG_PAGE;
data_ora=0xff; //清除端口上数据
p_rs=0; //进入忙状态
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
p_rw=1; //进入检测忙状态
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
p_e=1;
_nop_(); _nop_(); _nop_();_nop_(); _nop_();
p_bf=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
p_bf=p_res=1;
while(p_bf||p_res==1); //检测忙状态和复位状态
p_e=0;
_nop_(); _nop_();
SFRPAGE=temp;
}
/*****************************************************************
函数功能:写数据。此函数所有写入液晶的函数均使用此函数。
参数说明:command:DATA时写数据,COMM时写指令;data_comm内容
******************************************************************/
void WriteLcd(unsigned command,unsigned data_comm)
{
unsigned char temp;
temp=SFRPAGE;
SFRPAGE= CONFIG_PAGE;
LcdBusy(); //检测忙命令
p_rw=0; //由于是写数据或者指令,所以RW为0;
p_rs=command; //给定写入命令,数据(DATA)或者指令(COMM)
data_ora=data_comm; //给写入内容
p_e=1; //给下降沿
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
p_e=0; //锁存数据
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
SFRPAGE=temp;
}
/*****************************************************************
函数功能:读数据。此函数所有读取液晶的函数均使用此函数。
参数说明:返回值为8位无符号字符
******************************************************************/
/*unsigned char ReadLcd(void)
{
unsigned char temp;
temp=SFRPAGE;
SFRPAGE= CONFIG_PAGE;
unsigned char readData;
LcdBusy ();
p_rw=1; _nop_(); _nop_(); _nop_(); _nop_();
p_rs=1; _nop_(); _nop_(); _nop_(); _nop_();
p_e=1;
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
readData=data_ora; //读取数据
p_e=0;
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
SFRPAGE=temp;
return readData;
}*/
/*****************************************************************
函数功能:设置x,y的位置。从此位置开始显示
参数说明:x(行,取值0~7),y(列,取值0~15)为定位坐标
******************************************************************/
void SetXY(unsigned char x,unsigned char y)
{
unsigned char temp;
temp=SFRPAGE;
SFRPAGE= CONFIG_PAGE;
if (x>=64) //如果显示列数超过液晶左半屏幕
{ //支持的行数
p_csa=0; //则,
p_csb=1; //选择右半屏幕
}
else //否则
{ //就
p_csa=1; //选择左半屏幕
p_csb=0;
}
WriteLcd(COMM,LOCATION_X | x); //设置x的位置
WriteLcd(COMM,LOCATION_Y | y); //设置y的位置
data_ora=0xff; //清除端口上的数据
SFRPAGE=temp;
}
/*****************************************************************
函数功能:数据显示。
参数说明:x(行,取值0~127),y(列,取值0~7)为定位坐标。dd为显示点阵
******************************************************************/
void Display(unsigned char x,unsigned char y,unsigned char dd)
{
unsigned char temp;
temp=SFRPAGE;
SFRPAGE= CONFIG_PAGE;
SetXY(x,y); //设置显示位置
WriteLcd(DATA,dd); //写入数据
data_ora=0xff; //清除端口上的数据
SFRPAGE=temp;
}
/*****************************************************************
函数功能:清屏幕
参数说明:LCD_CLEAR 0x00 涂白屏幕指令;LCD_BLACK 0xFF 涂黑屏幕指令
******************************************************************/
void ClearLcd(unsigned char state)
{
unsigned char i,j;
for(j=0;j<128;j++) //进行列数选择
{
for (i=0;i<8;i++) //进行行数选择
{
Display(j,i,state); //将选择的点清除。
}
}
}
/*****************************************************************
函数功能:画矩形,可以用来显示进度条
参数说明:x:y:矩形起始坐标;row:line:矩形结束坐标;state表示显示状态
******************************************************************/
/*void Rect(unsigned char x,unsigned char y,unsigned char row,unsigned char line,unsigned char state)
{
unsigned char i,j;
for(i=x;i<row;i++)
{
for(j=y;j<line;j++)
{
Display(i,j,state);
}
}
}*/
/*****************************************************************
函数功能:显示任意一点
参数说明:x:y:点阵坐标x:0~128;y:0~64
******************************************************************/
/*void ShowDot(unsigned char x,unsigned char y)
{
unsigned char page,ram,dot=0x01;
page=y/8;
SetXY(x,page);
y%=8;
ram=ReadLcd();
ram=ReadLcd(); //datasheet要求读两次
while(y)
{
dot<<=1;
y--;
}
ram ^=dot;
Display(x,page,ram);
}*/
/*****************************************************************
函数功能:显示初始化.
参数说明:空
******************************************************************/
#pragma disable //加入此命令,使LcdInit()执行时,禁止中断
void LcdInit(void)
{
p_reset=0;_nop_(); _nop_();
p_reset=1;_nop_(); _nop_();
p_csa=p_csb=1; //左半边和右半边一起设定
WriteLcd(COMM,LCD_ON); //开显示
}
/*****************************************************************
函数功能:显示单个数字
参数说明:x,y:点阵坐标:x:0~15;y:0~3.
*****************************************************************/
void DisplayChar(unsigned char x,unsigned char y,unsigned char n,unsigned char state)
{
unsigned char i;
SetXY(8*x,2*y);
if(state!=LCD_BLACK)
{
for(i=0;i<8;i++)
{
Display(8*x+i,2*y,asc[(n-32)*16+i]);
Display(8*x+i,2*y+1,asc[(n-32)*16+i+8]);
}
}
else
{
for(i=0;i<8;i++)
{
Display(8*x+i,2*y,255-asc[(n-32)*16+i]);
Display(8*x+i,2*y+1,255-asc[(n-32)*16+i+8]);
}
}
}
/*************************************************
函数功能:整数变量转换成液晶显示程序
整数范围:-32768~+32767
参数:num:要显示的变量; y为行,x为列;均从0开始
显示形式:x指定的位置为该数最高位的位置,负号紧贴数字显示
*************************************************/
void DisplayInt(unsigned char x,unsigned char y,signed int num,unsigned char state)
{
unsigned a[6];
unsigned i=1,j;
x-=2;
if(num<0)
{
num=-num;
a[0]='-'; //负号
}
else
a[0]=' '; //什么都不显示
a[1]=num/10000;num%=10000;
a[2]=num/1000;num%=1000;
a[3]=num/100;num%=100;
a[4]=num/10;num%=10;
a[5]=num;
while(a[i]==0&&i<=5)++i;
j=i-1; //j为负号的位
while(i<=5){DisplayChar(x+i,y,a[i]+48,state);++i;}
if(j==5)DisplayChar(x+5,y,48,state); //全0的情况
if(a[0]=='-')DisplayChar(x+j,y,'-',state); //负数的情况
}
/*****************************************************************
函数功能:提取单个汉字显示
参数说明:x:y:点阵坐标x:0~7;y:0~3。n第n个汉字
******************************************************************/
void DisplaySingleChinese(unsigned char x,unsigned char y,unsigned char n,
unsigned char code *chArray,unsigned char state)
{
unsigned char i;
SetXY(16*x,2*y);
if(state!=LCD_BLACK)
{
for(i=0;i<16;i++)
{
Display(16*x+i,2*y,chArray[n*32+i]);
Display(16*x+i,2*y+1,chArray[n*32+i+16]);
}
}
else
{
for(i=0;i<16;i++)
{
Display(16*x+i,2*y,255-chArray[n*32+i]);
Display(16*x+i,2*y+1,255-chArray[n*32+i+16]);
}
}
}
/*****************************************************************
函数功能:显示汉字
参数说明:x:y:点阵坐标x:0~8;y:0~3。n:共n个汉字
******************************************************************/
void DisplayString(unsigned char x,unsigned char y,unsigned char n,
unsigned char code *chArray,unsigned char state)
{
unsigned char i;
for(i=0;i<n;i++)
{
if(x>7)
{
if(y<3)
{
x=0;
y++;
}
}
DisplaySingleChinese(x,y,i,chArray,state);
x++;
}
}
/*****************************************************************
函数功能:延时
参数说明:传输输入参数。具体时间需计算所用晶振频率
******************************************************************/
void delayX10ms(unsigned char count)
{
unsigned char i,j,k;
for (i=0;i<count;i++)
for(j=0;j<50;j++)
for(k=0;k<80;k++);
}
/*****************************************************************
函数功能:翻屏
参数说明:time:翻屏时间
******************************************************************/
/*void RollScr(unsigned time)
{
unsigned char i;
p_csa=p_csb=1; //左右两边一起选定
for(i=0;i<64;i++)
{
WriteLcd(COMM,0xc0+i); //设置起始行
delayX10ms(time); //延时
}
WriteLcd(COMM,0xc0); //设置起始行
}*/
/*****************************************************************
函数功能:显示图像
参数说明:*img指向图像数组;state用来取反图像颜色,一般不用。
******************************************************************/
void DisplayImage(unsigned char *img,unsigned char state)
{
unsigned char i,j;
if(state==0xFF)
{
for(j=0;j<128;j++)
{
for(i=0;i<8;i++)
{
delayX10ms(1);
Display(j,i,255-img[i*128+j]);
}
}
}
else
{
for(j=0;j<128;j++)
{
for(i=0;i<8;i++)
{
Display(j,i,img[i*128+j]);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -