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

📄 lcdtst.c

📁 利用51单片机
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <math.h>
#include <float.h>
#include <hzk.h>               //存放汉字字模,自定义     纵向取模,字节倒续,下同。
#include <ASIIC.h>             //存放ASIIC字模库 无需改动
#include <picture.h>           //存放图像字模库  自定义图像,图片格式 前两个数值为图片的宽度和高度
#define uchar unsigned char
#define uint unsigned int
#define nop  _nop_()

//ds12887相关
#define ds_second XBYTE[0xa000]  //12887秒寄存器
#define ds_secondal XBYTE[0xa001]//12887秒报警值寄存器
#define ds_minute XBYTE[0xa002]  //12887分钟寄存器
#define ds_minuteal XBYTE[0xa003]//12887分钟报警寄存器
#define ds_hour XBYTE[0xa004]    //12887小时寄存器
#define ds_houral XBYTE[0xa005]  //12887时报警寄存器
#define ds_dayweek XBYTE[0xa006] //12887星期寄存器
#define ds_daymonth XBYTE[0xa007]//12887日期寄存器
#define ds_month XBYTE[0xa008]   //12887月寄存器
#define ds_year XBYTE[0xa009]    //12887年寄存器
#define ds_areg XBYTE[0xa00a]    //12887 a寄存器
#define ds_breg XBYTE[0xa00b]    //12887 b寄存器
#define ds_creg XBYTE[0xa00c]    //12887 c寄存器
#define ds_dreg XBYTE[0xa00d]    //12887 d寄存器
//液晶相关
#define lcddir1 XBYTE[0xC002]    //定义液晶1指令寄存器地址
#define lcddir2 XBYTE[0xC004]    //定义液晶2指令寄存器地址
#define lcddir12 XBYTE[0x7F5B]   //液晶1、2指令寄存器地址
#define lcddr1  XBYTE[0xC003]    //定义液晶1数据寄存器地址
#define lcddr2 XBYTE[0xC005]     //定义液晶2数据寄存器地址
#define lcddr12 XBYTE[0x7F5F]   //定义液晶12数据寄存器地址

//7279相关
sbit dat=P1^2; //7279数据线
sbit clk=P1^1; //7279时钟线
sbit cs=P1^0;  //7279选通线
     uchar bdata temp;
     sbit temp_0=temp^0;
     sbit temp_7=temp^7;

//时间调整全局变量
/*uchar data s_sec;
uchar data s_min;
uchar data s_hou;
uchar data s_dat;
uchar data s_mon;
uchar data s_yea;
uchar data s_day;*/

//时间调整时用到的临时变量
uchar data temp1;
uchar data temp2;
uchar data temp3;

//电压寄存器
uchar data voltage1;
uchar data voltage2;
uchar data voltage3;

//标志位
uchar bdata flag;
sbit flag_0 = flag^0; /*0:报警开关已关闭;1:报警开关已打开*/
sbit flag_1 = flag^1; /*0:波特率为9600;1:4800*/
sbit flag_2 = flag^2; //备份flag_1
sbit flag_3 = flag^3; /*下位机发送标志 1: 允许发送 0:禁止发送*/
sbit flag_4 = flag^4; /* 1:main函数写液晶 0:空闲*/
sbit flag_5 = flag^5; /* 1:7135有新数据*/
sbit flag_6 = flag^6; /*1: 收到上位机的报警确认信号。0:未收到报警确认信号*/

uchar data tem_alm; //报警温度
uchar data t_temalm;
uchar data tem; // 温度寄存器
//uchar data bote;
uchar data state_s;//串口状态
/*state_s=0x00:等待状态,接收控制符
  state_s=0x01:调时状态,接收hour
  state_s=0x11:调时状态,接收minute
  state_s=0x21:调时状态,接收second
  state_s=0x02:调日期状态,接收year
  state_s=0x12:调日期状态,接收month
  state_s=0x22:调日期状态,接收date
*/
/* 和上位机的接口命令:
  11H:上位机发送此指令,说明要对下位机进行时间调整。接下来的三个
       字节为时分秒数据。
  22H:上位机发送此指令,说明要对下位机进行日期调整。接下来的三个
       字节为年月日数据。
  33H:上位机发送此指令,说明要对下位机进行星期调整。接下来的一个
       字节为星期数据。
  44H:上位机发送此指令,说明要对下位机进行报警温度调整。接下来的
       一个字节为报警温度数据。
  55H:上位机发送此指令,以使下位机开始传送温度数据。
  66H;上位机发送此指令,以使下位机停止传送温度数据。
  77H: 上位机发送此指令,以确认接受到报警信号。
  FFH: 下位机发送此指令,向上位机温度报警。
*/
uchar data state;
/*state=0:主画面,显示时间和温度及一些标志
  state=1: 一级菜单,1反色。
  state=2: 一级菜单,2反色。
  state=3: 一级菜单,3反色。
  state=4: 一级菜单,4反色。
  state=5: 时间日期星期调整菜单,1反色
  state=6: 时间日期星期调整菜单,2反色
  state=7: 时间日期星期调整菜单,3反色
  state=0x08:设置报警温度,第1位反色
  state=0x18:设置报警温度,第2位反色
  state=9: 设置波特率
  state=0x0a:设置日期,第1位反色
  state=0x1a:设置日期,第2位反色
  state=0x2a:设置日期,第3位反色
  state=0x3a:设置日期,第4位反色
  state=0x4a:设置日期,第5位反色
  state=0x5a:设置日期,第6位反色
  state=0x0b:设置时间,第1位反色
  state=0x1b:设置时间,第2位反色
  state=0x2b:设置时间,第3位反色
  state=0x3b:设置时间,第4位反色
  state=0x4b:设置时间,第5位反色
  state=0x5b:设置时间,第6位反色
*/

//键值
#define OK 0x0a
#define UP 0x0e
#define DOWN 0x0f
#define LEFT 0x0b
#define RIGHT 0x0c
#define CANCEL 0x0d
#define ZERO 0x00
#define ONE  0x01
#define TWO  0x02
#define THREE 0x03
#define FOUR  0x04
#define FIVE  0x05
#define SIX  0x06
#define SEVEN 0x07
#define EIGHT 0x08
#define NINE 0x09

//-------------------------------------------------------------------------
uchar code  number[16]="0123456789abcdef";//查表用
uchar data date[]="00-00-00"; //定义日期格式
uchar data time[]="00:00:00"; //定义时间格式
//-------------------------------------------------------------------------

//+++++++++++++++++++++++++++++++
//7279专用函数
void send_data(uchar data_out)
//****************************
//向7279发送一个字节的数据
//被发送数据放于全局变量data_out中
//****************************

     {
     uchar bit_count;
     uchar data i;
     temp=data_out;
     cs=0;
     for(i=0;i<=25;i++)
         nop;
         for(bit_count=0;bit_count<8;bit_count++)
            {
            dat=temp_7;
            nop;
            nop;
            clk=1;
            for(i=0;i<=6;i++)
            nop;
            clk=0;
            for(i=0;i<=6;i++)
            nop;
            temp<<=1;
            }
     dat=0;
     return;
     }



     uchar receive_data(void)
//********************************
//从7279读入一个字节的数据
//读入的数据存放于全局变量data_in中
//读入的这个数据是原始的扫描码,并非键码
//********************************

     {
     uchar data i;
     uchar data bit_count;
     dat=1;

     for(i=0;i<25;i++)
     nop;
     for(bit_count=0;bit_count<8;bit_count++)
     {
     temp<<=1;
     clk=1;
     for(i=0;i<7;i++)
     nop;
     temp_0=dat;
     clk=0;
     for(i=0;i<6;i++)
     nop;
     }
    cs=1;

     return(temp);
     }
//-------------------------------------
//获取键值
uchar getkey()
{uchar temp;
 send_data(0x15);
 temp=receive_data();
 /*if(temp>=0x00&&temp<=0x03)
     temp=temp;
     else if(temp>=0x08&&temp<=0x0b)
     temp=temp-0x04;
     else if(temp>=0x10&&temp<=0x13)
     temp=temp-0x08;
     else if(temp>=0x18&&temp<=0x1b)
     temp=temp-0x0c;*/
  switch(temp)
    {case 0x00: temp = 7;
                break;
     case 0x01: temp = 4;
                break;
     case 0x02: temp = 5;
                break;
     case 0x03: temp = 6;
                break;
     case 0x08: temp = 1;
                break;
     case 0x09: temp = 2;
                break;
     case 0x0a: temp = 3;
                break;
     case 0x0b: temp = 0x0a;
                break;
     case 0x10: temp = 0x0b;break;
     case 0x11: temp = 0x0c;break;
     case 0x12: temp = 0x0d;break;
     case 0x13: temp = 0x0e;break;
     case 0x18: temp = 0x0f;break;
     case 0x19: temp = 0;
                break;
     case 0x1a: temp = 9;
                break;
     case 0x1b: temp = 8;
                break;
     }

     return(temp);
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
//液晶专用函数

//---------------------
//等待液晶空闲状态
void waitlcd1free(void)
{while(lcddir1&0x80);
 return;
}
void waitlcd2free(void)
{while(lcddir2&0x80);
 return;
}
//----------------------
//写lcd1数据寄存器
void lcd1datw(uchar dat)
{waitlcd1free();
lcddr1=dat;
return;
}
//写lcd2数据寄存器
void lcd2datw(uchar dat)
{waitlcd2free();
lcddr2=dat;
return;
}
//---------------------
//写lcd1指令寄存器
void lcd1cmdw(uchar cmd)
{waitlcd1free();
lcddir1=cmd;
return;
}
//--------------------
//写lcd2命令寄存器
void lcd2cmdw(uchar cmd)
{waitlcd2free();
lcddir2=cmd;
return;
}
//--------------------
//向lcd第page页,第column列写一个字节
//page 0-7   column 0-127
void lcdwr(uchar page,uchar column,uchar byte)
{if(column<64)
 {lcd1cmdw(0xb8|page);
  lcd1cmdw(0x40|column);
  lcd1datw(byte);
  }
 else
 {lcd2cmdw(0xb8|page);
  lcd2cmdw(0x40|column);
  lcd2datw(byte);
  }
 return;
}
//----------------------
//设置起始行 line:0-63
void setstartline(uchar line)
{lcd1cmdw(0xc0|line);
 lcd2cmdw(0xc0|line);
 return;
}
//读出指定页。指定列的数据
//page 0-7,column:0-127
uchar lcdrd(uchar page,uchar column)
{uchar temp;
 if(column<64)
 {lcd1cmdw(0xb8|page);
 lcd1cmdw(0x40|column);
 waitlcd1free();
 temp=lcddr1;
 waitlcd1free();
 temp=lcddr1;
 return(temp);}
 else
 {lcd2cmdw(0xb8|page);
 lcd2cmdw(0x40|column);
 waitlcd2free();
 temp=lcddr2;
 waitlcd2free();
 temp=lcddr2;
 return(temp);}
}

//----------------------
//清屏
void lcdcls()
{uchar page,column;
for(page=0;page<=7;page++)
 {for(column=0;column<=127;column++)
  lcdwr(page,column,0x00);
 }
return;
}
//-----------------------
//开关屏 0:关 1:开
void setonoff(uchar state)
{lcd1cmdw(0x3e|state);
 lcd2cmdw(0x3e|state);

return;
}
//---------------------
void initlcd()
{setonoff(1);
lcdcls();
setstartline(0x00);
return;
}



//--------------------------------------------------------------
//显示8*8点阵
//旋转90度:字模被竖着切分
//page:页(0-7), column: 列(0-127)
//address : 字模区首地址
void Show88(unsigned char page,unsigned char column,unsigned char *address)
{uchar i;
for(i=0;i<8;i++)
 {if(column==127) return;
  lcdwr(page,column,*address);
  column++;
  address++;
 }
 return;
}
//反色显示
void Show88f(unsigned char page,unsigned char column,unsigned char *address)
{uchar i;
 uchar tem;
for(i=0;i<8;i++)
 {if(column==127) return;
  tem = *address;
  tem = tem^0xff;
  lcdwr(page,column,tem);
  column++;
  address++;
 }
 return;
}
//----------------------------------------------------
//显示一个8×16asiic码
//character是asiic码
void showchar(unsigned char page,unsigned char column,unsigned char character)
{
 Show88(page,column,ASCII816[character-0x20]);
 Show88(page+1,column,ASCII816[character-0x20]+8);
}
void showcharf(unsigned char page,unsigned char column,unsigned char character)
{
 Show88f(page,column,ASCII816[character-0x20]);
 Show88f(page+1,column,ASCII816[character-0x20]+8);
}
//----------------------------
//显示一个16×16汉字
void showhz(unsigned char page,unsigned char column,unsigned char hzcode)
{Show88(page,column,HZTable[hzcode]);
Show88(page,column+8,HZTable[hzcode]+8);
Show88(page+1,column,HZTable[hzcode]+16);
Show88(page+1,column+8,HZTable[hzcode]+24);
}
void showhzf(unsigned char page,unsigned char column,unsigned char hzcode)
{Show88f(page,column,HZTable[hzcode]);
Show88f(page,column+8,HZTable[hzcode]+8);
Show88f(page+1,column,HZTable[hzcode]+16);
Show88f(page+1,column+8,HZTable[hzcode]+24);
}
//--------------------------------------------------------------------
//显示一行asiic字符串
//page:起始页号  column起始行号  str长度不超过16
showstr(uchar page,uchar column,uchar *str)
{while(*str)
{showchar(page,column,*str++);
column+=8;}
return;
}
/*-------------------------------------------------------------------------------
函数: void point(unsigned char x,unsigned char y,unsigned char t)
功能: 在(x,y)处打点  t方式:0:亮   1:灭  2:与原来相反
x:0-127 y:0-63
---------------------------------------------------------------------------------*/

void point(uchar x,uchar y,uchar t)
{uchar data page,column,temp;
page=y/8;
column=x;
temp=lcdrd(page,column);
switch(t)
	 {case  0: temp|=(0x01<<(y%8));break;
	  case  1: temp&=!(0x01<<(y%8));break;
	  case  2: temp^=(0x01<<(y%8));break;
	  default:break;
	  }
lcdwr(page,column,temp);
return;
}
//画圆 x 0-127 y 0-64   r 半径, t:方式 0 点亮, 1 灭,   2 与原来相反
void circle(uchar x,uchar y,uchar r,uchar t)
{uchar i,j,m,n;
	for(i=0;i<=127;i++)

⌨️ 快捷键说明

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