资料: 这是我改写的程序源码,可是研究了几天,不过写的话几个小时。
应用背景: 我的预期任务:用PIC与一个温度控制仪,可以图形化显示的界面,可以存储一些数据。
为了完成任务,我看了一本液晶的书,最近我改写了一个C51上的程序,用于驱动T6963控制的LCD,控制方式为间接的。我想打算移植到PIC16F上, 不过有点小问题。
展望:有人感兴趣,可以和我一起做,我的联系方式:QQ524782116。 谢谢,希望有你的参与。
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
//#include "absacc.h"//////设定显示地址函数 //
#include "reg52.h"
#include<yj.h>
//uchar readstata; //间接方式;
//#define Com_add XBYTE[0x0100] //数据口 // p2.6// ce and dat/com
//#define Dat_add XBYTE[0x0000] //数据口 // p2.6//
// T6963C 命令定义
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM 偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式逻辑或
#define LC_MOD_XOR 0x81 // 显示方式逻辑异或
#define LC_MOD_AND 0x82 // 显示方式逻辑与
#define LC_MOD_TCH 0x83 // 显示方式文本特征
#define LC_DIS_SW 0x90 // 显示开关D0=1/0:光标闪烁启用/禁用
// D1=1/0:光标显示启用/禁用
// D2=1/0:文本显示启用/禁用
// D3=1/0:图形显示启用/禁用
#define LC_CUR_SHP 0xA0 // 光标形状选择0xA0-0xA7表示光标占的行数
#define LC_AUT_WR 0xB0 // 自动写设置
#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0 // 数据一次写地址加1
#define LC_INC_RD 0xC1 // 数据一次读地址加1
#define LC_DEC_WR 0xC2 // 数据一次写地址减1
#define LC_DEC_RD 0xC3 // 数据一次读地址减1
#define LC_NOC_WR 0xC4 // 数据一次写地址不变
#define LC_NOC_RD 0xC5 // 数据一次读地址不变
#define LC_SCN_RD 0xE0 // 屏读
#define LC_SCN_CP 0xE8 // 屏拷贝
#define LC_BIT_OP 0xF0 // 位操作
#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ENQ 0x05
#define BS 0x08
#define CR 0x0D
#define LF 0x0A
#define DLE 0x10
#define ETB 0x17
#define SPACE 0x20
#define COMMA 0x2C
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0
void delay(uint m)
{
uint i,j;
for(i=0;i<m;i++)
{
for (j=0;j<m;j++);
}
}
void main(void) // 测试用
{
LCMInit();
/*
while(1)
{
}
}
*/
while(1)
{
delay(10);
cls(0); //清屏
// DisplayBMP(&nBitmapDot);
delay(10);
cls(0);
/*
showhzline(0,3,"创 实验室");
showhzline(0,5,"新");
showhzline(1,3,"波形发生器");
showhzline(3,0,"菜单");
delay(10);
cls(0);
showhzline(0,0,"频率");
ShowSine();
delay(10);
cls(0); //清屏
showascii86(2,0,"1234567890ABCDEFGHIJKLMNOP");
showascii58(0,0,"abcdefghijklmnopABCDEFGHIJKLMNOP");
showascii58(2,1,"1234567890");
showascii58(3,2,"~!@#$%^&*()_+");
*/
delay(10);
cls(0); //清屏
// showascii58(0,0,"f=100Hz");showhzline(0,5,"占空比");showascii58(0,11,":0.34");
fangbo(0,60,0.34);
delay(10);
cls(0);
// showhzline(0,0,"三角波"); showascii58(0,7,"f=100Hz");
triangle();
delay(10);
delay(10);
/**/
}
}
包含的文件:
//**************非总线方式************//
//RT6963基于C8051F020,外部晶振11059200Hz
//#include <zm.h>
//#include <xuexiao.h>
//#include <hz.h>
#include <math.h>
#include <string.h>//
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式:逻辑“或”
#define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
#define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
#define LC_MOD_TCH 0x83 // 显示方式:文本特征
#define LC_DIS_SW 0x90 // 显示开关:D0=1/0:光标闪烁启用/禁用;
// D1=1/0:光标显示启用/禁用;
// D2=1/0:文本显示启用/禁用;
// D3=1/0:图形显示启用/禁用;
#define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
#define LC_AUT_WR 0xB0 // 自动写设置
#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0 // 数据一次写,地址加1
#define LC_INC_RD 0xC1 // 数据一次读,地址加1
#define LC_DEC_WR 0xC2 // 数据一次写,地址减1
#define LC_DEC_RD 0xC3 // 数据一次读,地址减1
#define LC_NOC_WR 0xC4 // 数据一次写,地址不变
#define LC_NOC_RD 0xC5 // 数据一次读,地址不变
#define LC_SCN_RD 0xE0 // 屏读
#define LC_SCN_CP 0xE8 // 屏拷贝
#define LC_BIT_OP 0xF0 // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除
#define RowCharNum 8
#define ColCharNum 16
/***********************************************************************8*****************
引脚定义
*******************************************************************************************
#define dataport P3 //P3为数据口
sbit rst="P2"^4; //液晶复位低电平有效
sbit cd="P2"^6; //高电平:命令 低电平:数据
sbit ce="P2"^5; //片选使能
sbit wr="P0"^7; //写使能
sbit rd="P0"^6; //读使能
*/
#define dataport P1 //P3为数据口
sbit rst="P3"^1; //液晶复位低电平有效
sbit cd="P3"^2; //高电平:命令 低电平:数据
sbit rd="P3"^3; //读使能
sbit wr="P3"^4; //写使能
sbit ce="P3"^5; //片选使能//
//////////////////////////////////////////////////////////////////////////////////////////////
void Del(unsigned int) ; //延时程序,高速单片机必需
uchar CurCol,CurRow;
uchar uCol,uRow;//
uchar a,b;//文本指针
//******************************************************************************************
//检查数据,命令读写是否准备好
//*******************************************************************************************
/*************************************************************************************
File Name: CheckStatus
Function: 查忙,判断数据指令是否可读写
Author:
Date:
Explain
*******************************************************************************/
void CheckStatus(void)
{
uchar dat;
do{
cd="1";
Del(1); //此延时相当重要
ce="0";
dataport="0xff";
wr="1";
rd="0";
Del(1);
rd="1";
Del(1); //此延时相当重要
dat="dataport";
dat="0x03"&dat;//STA0,STA1是否准备好
} while(dat!=0x03);
}
/**********************************************************
//*函数名称: WriteData()
//*入口参数: 要写入的数据
//*出口参数: 无
//*功能说明: 向t6963写入数据
**********************************************************/
void WriteData(uchar dat)
{
CheckStatus();
ce=0;cd=0;Del(1); wr="0"; dataport="dat";Del(1);wr=1;
}
/**********************************************************
//*函数名称: WriteCmd()
//*入口参数: 要写入的命令
//*出口参数: 无
//*功能说明: 向t6963写入命令
**********************************************************/
void WriteCmd(uchar dat)
{
CheckStatus();
ce = 0;cd = 1;
Del(2);
wr = 0;Del(1);dataport = dat;Del(1); wr =1;
}
void WriteOneData(uchar commd,uchar dat)
{
WriteData(dat);
WriteCmd(commd);
}
void WriteTwoData(uchar commd,uchar dat1,uchar dat2)
{
WriteData(dat1);
WriteData(dat2);
WriteCmd(commd);
}
void CheckAutoWrite(void)
{
uchar dat;
do{
dataport="0xff";
cd="1";
ce=0;
rd="0";
Del(4);
dat=dataport;
rd="1";
dat="0x08"&dat;//STA3是否准备好
}while(dat==0x00);
}
void Del(unsigned int j)
{
while(j--);
}
//设定显示地址函数
void LocateXY(uchar x,uchar y)
{
uint temp;
temp= 128/8*y + x;
WriteTwoData(0x24,temp&0xff,temp/256);
}
//显示一副图片函数
void DisplayBMP(uchar *puts)
{
uchar i,j;
uint X="0";
LocateXY(0,0);
WriteCmd(0xB0); //进入自动写
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
CheckStatus();
WriteData(~puts[i*16+j]);
}
}
WriteCmd(0xB2); //退出自动写
}
void showhz(uchar row,uchar col,uchar *p)
{
unsigned char i;
unsigned int StartAddr;
while(col>14)
{
col="col-16";
row="row"+1;
}
if (col<0) col="0";
if (row>3) return;
StartAddr=(row<<8)+col; //定位起始行(括号中相当于lin*ColumnChar*16)
for(i=0;i<16;i++)
{
WriteTwoData(0x24,(unsigned char)(StartAddr),(unsigned char)(StartAddr>>8));
Del(2);
WriteOneData(0xc0,*p++);
Del(2);
WriteOneData(0xc4,*p++);
Del(2);
StartAddr="StartAddr" + ColCharNum;
}
}
/*********************************************************************************
//功能说明:显示8*16ASCII码
//入口参数:行,列地址,显示的字符串
//
*****************************************************************************************
void showascii86(uchar row,uchar col,uchar puts[])
{
uchar i,j,len;
uchar dat,byte;
unsigned int StartAddr;
len = strlen (puts);
for(j=0;j<len;j++)
{
byte = puts[j];
while(col>15)
{
col=col-16;
row=row+1;
}
if (row>3) return;
StartAddr=(row<<8)+col;
for (i=0;i<16;i++)
{
dat="ASCII86"[(byte-32)*16+i];
WriteTwoData(0x24,(uchar)(StartAddr),(uchar)(StartAddr>>8));
WriteOneData(0xc4,dat);
StartAddr="StartAddr"+ColCharNum;
}
col+=1;
}
}
*/
/*********************************************************************************
//功能说明:显示5*8ASCII码
//入口参数:行,列地址,显示的字符串
//
*****************************************************************************************
void showascii58(uchar row,uchar col,uchar puts[])
{
uchar i,j,len;
uchar dat,byte;
unsigned int StartAddr;
len = strlen (puts);
for(j=0;j<len;j++)
{
byte = puts[j];
while(col>15)
{
col=col-16;
row=row+1;
}
if (row>7) return;
StartAddr=(row<<7)+col;
for (i=0;i<8;i++)
{
dat="ASCII58"[(byte-32)*8+i];
WriteTwoData(0x24,(uchar)(StartAddr),(uchar)(StartAddr>>8));
WriteOneData(0xc4,dat);
StartAddr="StartAddr"+ColCharNum;
}
col+=1;
}
}
*/
void point(unsigned char bitdata)
{
if(bitdata==0)
bitdata=0xf0+(0x7-(uCol & 0x7));
else
bitdata=0xf8+(0x7-(uCol & 0x7));
WriteCmd(bitdata);
}
void pointxy(uchar x,uchar y,uchar k)
{
uchar dat;
uint pos;
pos=x/8+y*16;
WriteTwoData(0x24,pos&0xff,(pos>>8));
dat=x-x/8*8;
if (k==0) dat="0xf8"+(0x07-(dat&0x07));
else dat="0xf0"+(0x07-(dat&0x07));
WriteCmd(dat);
}
void ShowSine()
{
uchar hz[]={0,1,2,3,4,5}; //汉字索引
uchar x,y;
float xf,yf;
for (xf=0;xf<6.28;xf+=0.02)
{
yf=sin(xf);
x=xf*20;
y=yf*32+32;
pointxy(x,y,0);
}
}
void cls(uchar dat)
{
uint i;
WriteTwoData(LC_ADD_POS,0x00,0x00); // 置地址指针
WriteCmd(LC_AUT_WR);
// 自动写
for(i=0;i<16*64;i++)
{
WriteData(dat); // 写数据
}
WriteCmd(LC_AUT_OVR); // 自动写结束
WriteTwoData(LC_ADD_POS,0x00,0x00); // 重置地址指针
CurRow = 0; // 置地址指针存储变量
CurCol = 0;
}
/*******************************************************************************************************
//函数名:LCMInit
//功能说明:初始化液晶
*********************************************************************************************************/
void LCMInit(void)
{
rst=0;
Del(5);
rst=1;
ce =0;
Del(50);
WriteTwoData(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
WriteTwoData(LC_GRH_WID,0x10,0x00); // 图形显示区宽度
WriteCmd(0xA7); // 光标形状
WriteCmd(0x80); // 显示方式设置
WriteCmd(0x98); // 显示开关设置
cls(0x00);
}
/**********************************
//= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
//= 功 能: 划线函数
//= 参 数: 坐标1,坐标2,显示点或清除点
//= 返 回 值: 无
/**********************************/
void line( unsigned char x1,unsigned char y1, unsigned char x2,unsigned char y2, bit Mode)
{
unsigned char x,y;
float k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=((float)y2-y1) / ((float)x2-x1) ;
b="y1-k"*x1;
if( x1 <= x2 )
{
for(x=x1;x<=x2;x++)
{
y=(uchar)(k*x+b);
pointxy(x, y, Mode);
}
}
else
{
for(x=x2;x<=x1;x++)
{
y=(uchar)(k*x+b);
pointxy(x, y, Mode);
}
}
}
else // abs(y1-y2) > abs(x1-x2) |K|>1
{
k=((float)x2-x1) / ((float)y2-y1) ;
b="x1-k"*y1;
if( y1 <= y2 )
{
for(y=y1;y<=y2;y++)
{
x=(uchar)(k*y+b);
pointxy( x , y,Mode );
}
}
else
{
for(y=y2;y<=y1;y++)
{
x=(uchar)(k*y+b);
pointxy( x , y,Mode );
}
}
}
}
/********************************************************************************************
//函数名:triangle
//功能说明:画三角波
//无出入口参数
*********************************************************************************************/
void triangle(void)
{
line(0,60,25,35,0);
line(25,35,50,60,0);
line(50,60,75,35,0);
line(75,35,100,60,0);
line(100,60,125,35,0);
}
/*******************************************************************************************
//函数名称;fangbo
//入口参数:图形起始坐标 x,y,占空比z
//
//
//
*********************************************************************************************/
void fangbo(uchar x,uchar y,float z)
{
uchar i,n;
float j,k;
j=20*z/(1-z);
k=127/(j+20);
for(n=0;n<k-1;n++)
{
for(i=0;i<20;i++) //横轴
{
pointxy(x++,y,0);
}
for(i=0;i<35;i++) //纵轴
{pointxy(x,y--,0);}
for(i=0;i<j;i++)
{ //横轴
pointxy(x++,y,0);
}
for(i=0;i<35;i++)
{pointxy(x,y++,0);} //纵轴
}
}
/**************************************************************************************************
//函数名:showhzline
//入口参数:坐标行,列,要显示的汉字字符串
**********************************************************************************************
void showhzline(uchar row,uchar col,signed char puts[])
{
uchar len,i,j;
len = strlen (puts); //判断字符串长度
for(j=0;j<len;j++) //外层循环 次数为len的一半
{
for(i=0;i<30;i++) //内层循环 按汉字索引写字
{ //判断是否与索引一致
if(GB_16.Index[0]==puts[j]&&GB_16.Index[1]==puts[j+1]) {showhz(row,col,&GB_16.Msk);break;}//一致即写出汉字,跳出循环
}
col+=1;
}
}
*/
文章评论(0条评论)
登录后参与讨论