#include "12864.h"
//uchar key;
//*************************************************************************
//放到主函数里初始化,在Display(); 里写入12864画面上不动的汉字或字符
//1.显示字符或汉字调用这个函数 DisplayCgrom(uchar addr,uchar *hz);
//举例 DisplayCgrom(0x81,"工频参数测量");
// DisplayCgrom(0x90,"U=");
//2.显示数字调用这些函数,特殊的没有再自己添加
//Dispaly_three_point1_number(uchar addr,uint num_display); // 1.25格式
//Dispaly_four_point1_number(uchar addr,uint num_display); // 2.345格式
//Dispaly_three_point2_number(uchar addr,uint num_display); // 32.5格式
//Dispaly_four_point2_number(uchar addr,uint num_display); // 17.56格式
//Dispaly_four_point3_number(uchar addr,uint num_display); // 234.5格式
//Dispaly_six_point2_number(uchar addr,uint num_display);
//Display_two_number(uchar addr,uint num_display); // 435
//Display_three_number(uchar addr,uint num_display); // 435
//Display_four_number(uchar addr,uint num_display); // 4356
//Display_five_number(uchar addr,uint num_display); // 7445
//举例 Dispaly_four_point1_number(0x8a,result[0]);
/*************************************************************************
LCD_init(); //液晶参数初始化设置
LCD_clear(); //清屏
Display(); //默认不动的参数显示
**************************************************************************/
uchar num[]={"0123456789 :.-"};
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{
P5DIR = 0xFF;
P3DIR|= BIT0 + BIT1 + BIT2;
}
/*------------------检查忙位-----------------------------*/
void chk_busy()
{ RS_CLR;
RW_SET;
EN_SET;
P5DIR=0x00;
while(P5IN&0x80);
EN_CLR;
P5DIR=0xff;
}
//***********************************************************************
// 显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{ chk_busy();
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com;
EN_CLR;
}
//***********************************************************************
// 显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{ chk_busy();
RS_SET;
RW_CLR;
EN_SET;
DataPort = data;
EN_CLR;
}
//***********************************************************************
// 显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01);
}
void Dispaly_three_point1_number(uchar addr,uint num_display) // 1.25格式
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[12]); //"."
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Dispaly_four_point1_number(uchar addr,uint num_display) // 2.345格式
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/1000%10]);
LCD_write_data(num[12]); //"."
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Dispaly_three_point2_number(uchar addr,uint num_display) // 32.5格式
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[12]); //"."
LCD_write_data(num[num_display%10]);
}
void Dispaly_four_point2_number(uchar addr,uint num_display) // 17.56格式
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/1000%10]);
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[12]); //"."
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Dispaly_four_point3_number(uchar addr,uint num_display) // 234.5格式
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/1000%10]);
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[12]); //"."
LCD_write_data(num[num_display%10]);
}
void Dispaly_six_point2_number(uchar addr,ulong num_display) // 234.5格式
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/100000%10]);
LCD_write_data(num[num_display/10000%10]);
LCD_write_data(num[12]); //"."
LCD_write_data(num[num_display/1000%10]);
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Display_two_number(uchar addr,uint num_display)
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Display_three_number(uchar addr,uint num_display)
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Display_four_number(uchar addr,uint num_display)
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/1000%10]);
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
void Display_five_number(uchar addr,uint num_display)
{
LCD_write_com(addr); //显示位置
LCD_write_data(num[num_display/10000%10]);
LCD_write_data(num[num_display/1000%10]);
LCD_write_data(num[num_display/100%10]);
LCD_write_data(num[num_display/10%10]);
LCD_write_data(num[num_display%10]);
}
//***********************************************************************
//函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字
//***********************************************************************
void DisplayCgrom(uchar addr,uchar *hz)
{
LCD_write_com(addr);
while(*hz != '\0')
{
LCD_write_data(*hz);
hz++;
}
}
//****************************************************************
//函数名称:Display()显示测试结果
//****************************************************************
void Display(void)
{
DisplayCgrom(0x81,"生产环境监测");
DisplayCgrom(0x90,"温湿度实时显示");
}
//***********************************************************************
// 显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
Port_init();
LCD_write_com(FUN_MODE); //显示模式设置
LCD_write_com(FUN_MODE); //显示模式设置
LCD_write_com(DISPLAY_ON); //显示开
LCD_write_com(CLEAR_SCREEN); //清屏
LCD_write_com(CURSE_ADD);
}
//***********************************************************************
//以下是绘图功能函数的定义
//***********************************************************************
//***********************************************************************
//清整个GDRAM空间
//***********************************************************************
void clrgdram()
{
unsigned char x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{ LCD_write_com(0x34);
LCD_write_com(y+0x80); //行地址
LCD_write_com(x+0x80); //列地址
LCD_write_com(0x30);
LCD_write_data(0x00);
LCD_write_data(0x00);
}
}
//***********************************************************************
//读GDRAM一个字节信息
//***********************************************************************
uchar LCD_ReadByte(void)
{
uchar value;
chk_busy();
RS_SET;
RW_SET;
EN_CLR;
EN_SET;
P5DIR=0x00;
value=P5IN;
EN_CLR;
P5DIR=0xff;
return value;
}
//***********************************************************************
//画点函数mode=0,清除点;mode=1,点亮指定点;mode=2,当前点的状态取反;
//***********************************************************************
void Draw_point(uchar x,uchar y,uchar mode)
{
uchar ReadOldH,ReadOldL;
LCD_write_com(0x34); //扩充指令集
LCD_write_com(0x36); //绘图显示开
LCD_write_com(y-(y/32)*32+0x80); //列地址
LCD_write_com(x/16+(y/32)*8+0x80); //行地址
LCD_ReadByte();
ReadOldH=LCD_ReadByte();
ReadOldL=LCD_ReadByte();
LCD_write_com(y-(y/32)*32+0x80); //列地址
LCD_write_com(x/16+(y/32)*8+0x80); //行地址
switch(x%16/8%2)
{
case 0:
switch(mode)
{
case 0: ReadOldH&=~(0x80>>(x%16%8));break;
case 1: ReadOldH|=0x80>>(x%16%8);break;
case 2: ReadOldH^=0x80>>(x%16%8);break;
}
LCD_write_data(ReadOldH);
LCD_write_data(ReadOldL);
break;
case 1:
switch(mode)
{
case 0: ReadOldL&=~(0x80>>(x%16%8));break;
case 1: ReadOldL|=0x80>>(x%16%8);break;
case 2: ReadOldL^=0x80>>(x%16%8);break;
}
LCD_write_data(ReadOldH);
LCD_write_data(ReadOldL);
break;
}
LCD_write_com(0x30);
}
/*
void point(uchar X,uchar Y,uchar Color)
{
uchar Tier,Tier_bit;
uchar ReadOldH,ReadOldL;
uchar Row;
LCD_write_com(0x34);
LCD_write_com(0x36);
Tier=X>>4; //Tier/=16;
Tier_bit=X&0x0f; //Tier%=16;
if(Y<32)
Row=Y;
else
{
Row=Y-32;
Tier+=8;
}
LCD_write_com(Row+0x80); //行地址
LCD_write_com(Tier+0x80); //列地址
LCD_ReadByte();
ReadOldH=LCD_ReadByte();
ReadOldL=LCD_ReadByte();
LCD_write_com(Row+0x80);
LCD_write_com(Tier+0x80);
if(Tier_bit<8)
{
switch(Color)
{
case 0:ReadOldH&=(~(0x01<<(7-Tier_bit)));break;
case 1:ReadOldH|=(0x01<<(7-Tier_bit));break;
case 2:ReadOldH^=(0x01<<(7-Tier_bit));break;
default:break;
}
LCD_write_data(ReadOldH);
LCD_write_data(ReadOldL);
}
else
{
switch(Color)
{
case 0:ReadOldL&=(~(0x01<<(15-Tier_bit)));break;
case 1:ReadOldL|=(0x01<<(15-Tier_bit));break;
case 2:ReadOldL^=(0x01<<(15-Tier_bit));break;
default:break;
}
LCD_write_data(ReadOldH);
LCD_write_data(ReadOldL);
}
LCD_write_com(0x30);
}
*/
//***********************************************************************
//显示正弦函数图像
//***********************************************************************
void Display_sin_function(float T,uchar A)
{
float x,y;
uchar x1,y1;
float k;
k=2*10/T;
for(x=0;x<127;x+=1)
{
delay_ms(50);
y=sin(0.314*x*k);
x1=(uchar)(x);
y1=(uchar)(31-(A*y+0.5));
Draw_point(x1,y1,1);
}
}
void Display_coordinate(uchar x,uchar y) //set coordinate origin
{
uchar i,j;
for(j=0;j<64;j++)
Draw_point(x,j,1);
for(i=0;i<128;i++)
{ Draw_point(i,y,1);}
}
|