📄 lcd320240.c
字号:
#include "c8051f120.h"
#include "LCD320240.h"
#include "flash.h"
#include "fft_xgjis.h"
#include"intrins.h"
#include"math.h"
#define unchar unsigned char
#define unint unsigned int
//#define K_fft 3277 //变换因子
//#define F_fft 20 //分辨率
sbit wr=P7^4;
sbit rd=P7^3;
sbit cs=P7^2;
sbit a0=P7^1;
sbit res=P7^0;
//sbit key=P3^7;
//sbit busyflag=P2^6;
//extern unsigned int K_fft;
//extern int source[2048];
//extern unsigned int N_fft;
//extern unsigned F_fft;
unint addr1 = 8800; //记录上一个坐标值
unint addr2;
//unchar code value1[];
//unchar code value2[];
//unchar code value3[];
/********************************
延时函数
*********************************/
void delay(unint t)
{
unint i;
for(i=0;i<t;i++)
{_nop_();_nop_();}
}
/*******************************
读液晶 函数
输入: 无
输出: unchar型数据
********************************/
unchar RD_LCD(void)
{
unchar LCD_Data ;
P6=0xff;
a0=1 ;
delay(1);
wr=1 ;
delay(1);
rd=0 ;
delay(20);
LCD_Data=P6;
delay(20);
rd=1;
return(LCD_Data);
}
/********************************
写命令函数
输入: 命令控制字
输出: 无
*********************************/
void wr_command(unchar command)
{
//P0=0xff;
P6=command;
a0=1;
delay(1);
rd=1;
delay(1);
wr=0;
delay(40);
wr=1;
}
/*********************************
写数据函数
输入: unchar型 数据
输出: 无
**********************************/
void wr_datas(unchar datas)
{
//P0=0xff;
P6=datas;
a0=0;
delay(1);
rd=1;
delay(1);
wr=0;
delay(40);
wr=1;
}
/**********************************
液晶初始化函数
***********************************/
void LCD_Init()
{
unint i;
unchar code systemset[]={0x34,0x87,0x07,0x28,0x2d,0xf0,0x28,0x00};
unchar code scroll[]={0x00,0x00,0xf0,0x00,0x80,0xf0,0x00,0x00,0x00,0x00};
delay(50);
res=0;
delay(50);
res=1;
delay(50);
cs=0;
wr_command(0x40); //system set
for(i=0;i<8;i++)
{
wr_datas(systemset[i]);
}
wr_command(0x44); //scroll set
for(i=0;i<10;i++)
{
wr_datas(scroll[i]);
}
wr_command(0x5b); //ovlay set
wr_datas(0x0c);
wr_command(0x59); //display on
wr_datas(0x14);
}
/******************************************
清屏 函数
*******************************************/
void clear(unint lay)
{
unint i;
wr_command(0x4c); //set point move direction
wr_command(0x46); //set point address
switch(lay)
{
case 1: wr_datas(0x00);
wr_datas(0x00);
break;
case 2: wr_datas(0x00);
wr_datas(0x80);
break;
}
wr_command(0x42); //mwrite
for(i=0;i<9600;i++)
{
wr_datas(0x00);
}
}
/*******************************************************
文本模式 显示函数
输入: 数据指针, 层数 选择 lay
输出:无
********************************************************/
void display_text(unchar code *text,unint lay)
{
unint i,j,k;
wr_command(0x4c); //set point move direction
wr_command(0x46); //set point address
switch(lay)
{
case 1: wr_datas(0x00);
wr_datas(0x00);
break;
case 2: wr_datas(0x00);
wr_datas(0x80);
break;
}
wr_command(0x42); //mwrite
for(j=0;j<30;j++)
{
for(k=0;k<8;k++)
{
for(i=0;i<40;i++)
{
wr_datas(*(text+k));
}
}
}
}
/****************************************************
图形模式 显示函数
输入: 数据指针, 层数 选择 lay
输出:无
****************************************************/
void display_map(unchar code *map,unint lay)
{
unint i,j;
wr_command(0x4c); //set point move direction
wr_command(0x46); //set point address
switch(lay)
{
case 1: wr_datas(0x00);
wr_datas(0x00);
wr_command(0x42); //mwrite
for(i=0;i<9600;i++)
{
wr_datas(*(map+i));
}
break;
case 2: wr_datas(0x00);
wr_datas(0x80);
wr_command(0x42); //mwrite
for(j=0;j<2;j++)
{
for(i=0;i<4800;i++)
{
wr_datas(*(map+i));
}
}
break;
}
}
/******************************************************
显示卷动函数
*******************************************************/
void roll()
{
unsigned int i,j=0x00,k,sad2,sad2h;
while(1)
{
sad2=0x8000;
for(k=0;k<240;k++)
{
for(i=0;i<8;i++)
{
wr_command(0x5a); //hdot set
wr_datas(i); //P
}
wr_command(0x44); //scroll set
wr_datas(0x00);
wr_datas(0x00);
wr_datas(0xf0);
wr_datas(sad2); //P1
sad2h=sad2>>8;
wr_datas(sad2h); //P2
wr_command(0x5a); //hdot set
wr_datas(0x00);
delay(8000);
sad2=sad2+40;
// if(key==0) goto out;
; }
}
/*out:
wr_command(0x44); //scroll set
wr_datas(0x00);
wr_datas(0x00);
wr_datas(0xf0);
wr_datas(0x00);
wr_datas(0x80); */
}
/*******************************************************************
在一个区域反白 函数
nAddr :首地址;xSize:图像宽度,ySize:图像高度;lay:层
********************************************************************/
void Redisplay_Area(unint addr,unchar xSize,unchar ySize,unchar lay)
{
unchar addrH = 0;
unchar addrL = 0;
unchar datatmp = 0;
unint i,j;
//unchar i,j,cDat ;
//unchar cAddrLow,cAddrHigh ;
if(lay == 2)
addr += 0x8000;
for(i=0;i<ySize;i++)
{
wr_command(0x4c); //set point move direction
wr_command(0x46); //set point address
//addrL = (unchar)(addr&0X00FF);
//addrH = (unchar)((addr&0XFF00)>>8);
wr_datas((unchar)(addr&0X00FF));
wr_datas((unchar)((addr&0XFF00)>>8));
for(j=0;j<xSize/8;j++)
{
wr_command(0x47); //读地址指令
addrL = RD_LCD(); //读地址
addrH = RD_LCD();
wr_command(0x43); //读数据指令
datatmp = RD_LCD(); //读数据
datatmp = ~datatmp;
wr_command(0x46); //写地址指令
wr_datas(addrL); //写地址
wr_datas(addrH);
wr_command(0x42); //写数据指令
wr_datas(datatmp); //写数据
}
addr = addr + 40;
}
}
/****************************************************
在某个点上写数据(实际上是写一个八位数据进去)
data:所要写入的数据;addr:所写入数据的地址;lay:层
******************************************************/
void DisplayPoint(unchar data1,unint addr,unint lay)
{
//unint i;
unchar addrH = 0;
unchar addrL = 0;
if(lay==2) //判断层
addr = addr + 0x8000;
addrL = (unchar)(addr&0X00FF);
addrH = (unchar)((addr&0XFF00)>>8);
wr_command(0x4c); //set point move direction
wr_command(0x46); //set point address
switch(lay)
{
case 1:
wr_datas(addrL);
wr_datas(addrH);
break;
case 2:
wr_datas(addrL);
wr_datas(0x80+addrH);
break;
default:
break;
}
wr_command(0x42); //mwrite 数据写入显示缓冲区
wr_datas(data1);
}
/**************************************************************
Y 轴显示函数
//data1:所要写入的Y轴数据的首地址;addr:所写入数据的地址;lay:层
***************************************************************/
void DisplayPoint_Y(unchar *data1,unint addr,unint lay)
{
unint i;
unchar addrH = 0;
unchar addrL = 0;
if(lay==2) //判断层
addr = addr + 0x8000;
for(i=0;i<192;i++)
{
addrL = (unchar)(addr&0X00FF);
addrH = (unchar)((addr&0XFF00)>>8);
wr_command(0x4c); //set point move direction
wr_command(0x46); //set point address
switch(lay)
{
case 1:
wr_datas(addrL);
wr_datas(addrH);
break;
case 2:
wr_datas(addrL);
wr_datas(0x80+addrH);
break;
default:
break;
}
wr_command(0x42); //mwrite 数据写入显示缓冲区
wr_datas(*(data1+i));
addr=addr+40;
}
}
/***********************************************************
X轴显示函数
//data:所要写入的X轴数据;addr:所写入数据的地址;lay:层
************************************************************/
void DisplayPoint_X(unchar *data1,unint addr,unint lay)
{
unint i,j;
unchar addrH = 0;
unchar addrL = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -