⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cm160128.c

📁 keil c51编写的LCD 12864像素LCD显示屏程序,,通过调用函数,显示grom字库中的7千多个简体中文和字符
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include "character.h"
/* 地址定义 */
#define d_add XBYTE[0x8000]
#define c_add XBYTE[0x8100]
/* 常数定义 */
//#define para1 0x20;
unsigned char code para1 = 0x20;
#define uchar unsigned char
#define uint unsigned int
unsigned char data dat1 = 0x30; //LCD显示用变量
unsigned char data dat2 = 0x31;
unsigned char data com = 0x32;
unsigned char data code_1 = 0x33;
unsigned char data attr = 0x34;
unsigned char data O_Y = 0x35;
unsigned char data O_X = 0x36;
//-------------register------------------------
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit ACC0 = ACC^0;
sbit ACC1 = ACC^1;
/* 定义标志位 */
sbit Acc_0=ACC^0;
sbit Acc_1=ACC^1;
sbit Acc_2=ACC^2;
sbit Acc_3=ACC^3;
uchar num=0;
bit s=0;
bit bStart = 0;//开机测试位
uchar x=0;
uchar y=0;
char code RATE = -123;
unsigned char data STR6[6]={0,0,0,0,0,0};
unsigned int unVolt;
int intTestVolt[2] = {0,100};
unsigned char countVolt = 0;
unsigned char countSuccess = 0;
//parameters, used in SCOM
int intSmpVal = 0x0800;  //模数转换值
unsigned char ucMW2 = 1; //放大倍数
unsigned char ucSmpT = 1;//采样时间
unsigned char ucVolt = 0;//负高压
int intTmpSmpVal = 0x0800;//临时存储模数转换值
unsigned char ucTmpVolt = 0;//临时保存负高压
unsigned int unLCDRefresh = 0;//液晶屏刷新
bit bUpdateSV1 = 0;//接收采样值低4位成功标记位
bit bUpdateSV2 = 0;//接收采样值中间4位成功标记位
bit bUpdateSV = 0; //接收采样值成功标记位
bit bUpdateMW = 0; //接收量程成功标记位
bit bUpdateSmpT = 0;//接收采样时间成功标记位
bit bUpdateVolt1 = 0;//接收负高压低4位成功标记位
bit bUpdateVolt = 0; //接收负高压成功标记位
//-------------------------------------------------------------------
//void delay_ms();
void INIT_1();//液晶初始化函数
void CLEAR();//LCD清屏函数
void CGRAM();//在LCD中建立字符库函数
void CCW2_PR();//写16*16字符函数
void CCW3_PR();//写24*48字符函数
void CW2_PR();
void PR1();
void PR11();
void PR12();
void ST01();
void ST3();
void DISHAZIT(uchar x,uchar y,uchar d);
void DISHAZIT2(uchar x,uchar y,uchar d);
void DISDASC(uchar x,uchar y,uchar d);
void delay_ms(int ms);
//--------------------------------------------
/**************************/
/* 初始化函数 */
/**************************/
INT_1()
{
    dat1=0x00; /*设文本显示区域首地址*/
    dat2=0x00;
	com=0x40;
	PR1();

	dat1=para1; /*设文本显示区域宽度*/
	dat2=0x00;
	com=0x41;
	PR1();

	dat1=0x00; /*设图形显示区域首地址*/
	dat2=0x08;
	com=0x42;
	PR1();
	dat1=para1; /*设图形显示区域宽度*/
	dat2=0x00;
	com=0x43;
	PR1();

	com=0xa0; /*光标形状设置*/
	PR12();

	com=0x80; /*显示方式设置逻辑"或"合成*/
	PR12();

	com=0x9c; /*显示开关设置 开文本和图形显示*/
	PR12();
}
/***************************/
/* 清显示子程序 */
/***************************/
void CLEAR()
{
	unsigned char i,j;
	dat1=0x00;
	dat2=0x00;
	com=0x24;
	PR1();
	com=0xb0;
	PR12();
	for(i=0;i<205;i++)
	{
		for(j=0;j<=40;j++)
		{
			ST3();
			d_add=0x00;
		}
	}
	com=0xb2;
	PR12();
}/**************************/
/* CGRAM函数 */
/**************************/
void CGRAM()
{
	unsigned int i;

	dat1=0x03;
	dat2=0x00;
	com=0x22; /* 设置CGRAM偏置地址 */
	PR1();
	dat1=0x00;
	dat2=0x1c;
	com=0x24; /* 设置存储器地址指针 */
	PR1();
	com=0xb0; /* 设置自动写方式 */
	PR12();
	for(i=0;i<320;i++)
	{
		ST3();
		d_add=CGTAB[i];
	}
	com=0xb2; /* 设置自动写结束方式 */
	PR12();
}

/********************************/
/* 汉字写入(文本方式)函数 */
/********************************/
CCWD_PR() /* */
{
	unsigned int i,j;

	i=para1;
	j=i*O_Y+O_X;

	dat1=j%256;
	dat2=j/256;
	com=0x24; /* 设置显示地址 */
	PR1();
	dat2=code_1; /* 写入左上半部汉字代码 */
	com=0xc0;
	PR11();

	j=j+i;
	dat1=j%256; /* 显示RAM地址修正 */
	dat2=j/256;
	com=0x24;
	PR1();

	dat2=code_1+0x01; /* 写入左下半部汉字代码 */
	com=0xc0;
	PR11();
}

void CCW2_PR()
{
	unsigned int i,j,count1;

	i=para1;
	j=i*O_Y+O_X+0x0800;
	for(count1=0;count1<16;count1++)
	{
		dat1=j%256;
		dat2=j/256;
		com=0x24;
		PR1();

		dat2=CCTAB[code_1][count1]; /* 写入汉字左侧代码 */
		com=0xc0;
		PR11();

		dat2=CCTAB[code_1][count1+16]; /* 写入汉字右侧代码 */
		PR11();
		j=j+i;
	}
}
void CCW3_PR()//写24*48字符函数(显示采样值)
{
	unsigned int i,j,count1;

	i=para1;
	j=i*O_Y+O_X+0x0800;
	for(count1=0;count1<48;count1++)
	{
		dat1=j%256;
		dat2=j/256;
		com=0x24;
		PR1();

		dat2=CCTAB2[code_1][count1]; /* 写入汉字左侧代码 */
		com=0xc0;
		PR11();
                dat2=CCTAB2[code_1][count1+48]; /* 写入汉字中间代码 */
		PR11();
		dat2=CCTAB2[code_1][count1+96]; /* 写入汉字右侧代码 */
		PR11();
		j=j+i;
	}
}
void CCW4_PR()//写160*128字符函数
{
	unsigned int i,j,count1;
        unsigned char h = 0;
	i=para1;
	j=i*O_Y+O_X+0x0800;
	for(count1=0;count1<128;count1++)
	{
		dat1=j%256;
		dat2=j/256;
		com=0x24;
		PR1();

		dat2=welcome[code_1][count1];
		com=0xc0;
		PR11();

                for(h = 1; h < 20; h++)
                {
                     dat2=welcome[code_1][count1+128*h];
		     PR11();
                }
		j=j+i;
	}
}

/****************************/
/* 写指令和写数据函数 */
/****************************/
void PR1() /* 双字节参数指令写入入口 */
{
	ST01();
	d_add=dat1; /* 取第一参数单元数据 */
	PR11();
}
void PR11() /* 单字节参数指令写入入口 */
{
	ST01();
	d_add=dat2; /* 取第二参数单元数据 */
	PR12();
}
void PR12() /* 无参数指令写入入口 */
{
	ST01();
	c_add=com; /* 写入指令代码 */
}
/************************************************/
/* 判状态位S1,S0 函数(读写指令和读写数据状态) */
/************************************************/
void ST01()
{
	do
	{
		ACC=c_add;
	}
	while(Acc_0==0,Acc_1==0);
}

/************************************/
/* 判状态位S3函数(数据自动写状态) */
/************************************/
void ST3()
{
	do
	{
		ACC=c_add;
	}
	while(Acc_3==0);
}

void DISHAZIT(uchar x,uchar y,uchar d) /*汉字写入(图文方式)*/
{
	code_1=d;
	O_X=x;
	O_Y=y;
	CCW2_PR();
}
void DISHAZIT2(uchar x,uchar y,uchar d) /*汉字写入(图文方式)*/
{
	code_1=d;
	O_X=x;
	O_Y=y;
	CCW3_PR();
}

void DISDASC(uchar x,uchar y,uchar d) //汉字写入(文本方式)
{
	code_1=d;
	O_X=x;
	O_Y=y;
	CCWD_PR();
}
//显示欢迎界面
void ShowWelcome(void) /*汉字写入(图文方式)*/
{
	code_1=0;
	O_X=0;
	O_Y=0;
	CCW4_PR();
}
//显示"仪器正在预热"
void ShowHeat(void)
{
        DISHAZIT(2,8*7,0x0e);
        DISHAZIT(4,8*7,0x0f);
        DISHAZIT(6,8*7,0x10);
        DISHAZIT(8,8*7,0x11);
        DISHAZIT(10,8*7,0x12);
        DISHAZIT(12,8*7,0x13);
}
//显示"采样时间"
void ShowSample(void)
{
        DISHAZIT(1,8*9,0x00);
        DISHAZIT(3,8*9,0x01);
        DISHAZIT(5,8*9,0x02);
        DISHAZIT(7,8*9,0x03);
        DISHAZIT(9,8*9,0x04);
}
//显示"放大倍数"
void ShowEXG(void)
{
        DISHAZIT(1,8*11,0x07);
        DISHAZIT(3,8*11,0x08);
        DISHAZIT(5,8*11,0x09);
        DISHAZIT(7,8*11,0x0a);
        DISHAZIT(9,8*11,0x04);
}
//显示"负高压"
void ShowMIN(void)
{
        DISHAZIT(1,8*13,0x0b);
        DISHAZIT(4,8*13,0x0c);
        DISHAZIT(7,8*13,0x0d);
        DISHAZIT(9,8*13,0x04);
}
//显示采样数据
void DispSampleVoltage(int unintData)
{
        unintData = (0x0800 - unintData)*1.2207;//

        switch(ucMW2)
        {
              case 1://放大倍数为1
              case 0x09:

                    STR6[0] = 0x0a;
                    if(unintData > 0)
                    {
                         STR6[1] = 0x0a;
                    }
                    else if(unintData < 0)
                    {
                         STR6[1] = 0x0c;
                    }
                    else
                    {
                         STR6[1] = 0x0a;
                    }

                    unintData = abs(unintData);
                    STR6[5] = unintData%10;
                    unintData /= 10;
                    STR6[4] = unintData%10;
                    unintData /= 10;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -