📄 lcd.c
字号:
/***********************************************************
连线图
LCM--89V51RD2
DB0--P0.0 DB1--P0.1 DB2--P0.2 DB3--P0.3 DB4--P0.4
DB5--P0.5 DB6--P0.6 DB7--P0.7 E--P2.7 R/W--P2.6
RS--P2.5 CSB--P2.4 CSA--P2.3 RSTB--P2.2 EA--VDD
晶振频率为12MHz
***********************************************************/
#include <reg51f.h>
#include <math.h>
#include <intrins.h>
#include <ziku.c>
/*******************液晶显示器接口引脚定义*********************/
sbit Elcm = P2^7; //
sbit CSB = P2^4; //
sbit CSA = P2^3; //
sbit RS = P2^5; //
sbit RW = P2^6; //
sbit PWM_OUT= P1^3; //PWM输出端口引脚
sfr Datalcm = 0x80; //数据口
/******************常用操作命令和参数定义**********************/
#define DISPON 0x3f //开显示
#define DISPOFF 0x3e //关显示
#define DISPFIRST 0xc0 //显示起始行
#define SETX 0x40 //X定位设定指令(页)
#define SETY 0xb8 //Y定位设定指令(列)
#define LCDBUSY 0x80 //LCM忙判断位
/********************显示分区边界位置**************************/
#define MODL 0x00 //左区
#define MODM 0x40 //左区和中区分界
#define MODR 0x80 //中区和右区分界
#define LCMLIMIT 0xc0 //显示区的右边界
/*********************全局变量定义*****************************/
unsigned char cbyte,col,row,bb=0,
TT=0,TT1=40,TT2=20,qq1=3,qq2=1,minute=0;
unsigned int click=0,
PWM_HIGH=0x4000, //波形为高电平的周期数
PWM_LOW=0x4000; //波形为低电平的周期数
unsigned char data keypoint=0;
bit xy,startflag=0,endflag=0,sure=0; //画线方向标志:1水平
/***********************函数列表*******************************/
void Lcminit(void); //液晶模块初始化
void Delay(unsigned char); //延时
void LcdbusyL(void); //测忙,左区
void LcdbusyM(void); //测忙,中区
void LcdbusyR(void); //测忙,右区
void Putcdot(unsigned char *); //全角字符输出
void Wrdata(unsigned char); //数据输出给LCM
void Lcmcls(void); //LCM全屏幕清零
void Wtcom(void); //公用busy等待
void Locatexy(void); //光标定位
void WrcmdL(unsigned char); //左区命令输出
void WrcmdM(unsigned char); //中区命令输出
void WrcmdR(unsigned char); //右区命令输出
void Rollscreen(unsigned char); //屏幕向上滚动演示
void Point(void); //画点
void Linehv(unsigned char); //横竖方向画线
void Rddata(void); //从液晶片上读数据
void Screen(unsigned char *);
void Num(unsigned char *); //大数字,右屏
void Keyjudge(void); //键盘扫描
void Keymanage(void); //键盘管理
void port3key_int1(void); //INT1中断
void port3key_int0(void); //INT0中断
void PCA_ISR(void); //PCA中断
void time2(void); //定时器2中断
/**********************字库说明*******************************/
extern unsigned char code SHI[],JIAN[],BO[],XING[],QIANG[],DU[],PING[],LV[],//磁疗时间波形强度频率16×1
Big[],Big_Null[], //大数字0-9,32×6
A1[],A2[],A3[],A4[],A5[],A6[],A7[],A8[],A9[], //欢迎使用磁疗32×30
num[], //小数字0-9,16×1
FENG[],ZHONG[],HE[],ZI[],FANG[],AN[],YIERSAN[], //分钟,赫兹,方案16×1
XH[], //信号强度波形
SIGNAL0[],SIGNAL1[],SIGNAL2[],SIGNAL3[],SIGNAL4[],SIGNAL5[],SIGNAL6[],//左屏信号闪烁图
BLANK[];
/**********************演示主程序******************************/
void main(void)
{
unsigned char x=0;
WDTC=0;
AUXR=0;
T2MOD=0;
T2CON=0x00; //16位自动重装模式,内部定时器fosc/6
RCAP2L=0xa0; //计数初值:5536
RCAP2H=0x15;
CH=0; //PCA计数器清零
CL=0;
CMOD=0x00; //PCA输入为fosc/6,禁止CF中断
CCAP0L=(0xff&PWM_HIGH); //初始化PCA比较值
CCAP0H=(0xff&(PWM_HIGH>>8));
CCAPM0=0x4d; //比较器信号输出送到CEX0,16位高速输出,使能CCF0中断
CCON=0x00; //清楚所有PCA中断标志,
P3=0x0d; //发全0列扫描码,行线输入
IP=0x65; //设置中断优先级,T2,PCA高优先级
TR2=0; //禁止T2
col=0;
row=0;
cbyte=0;
Delay(40); //延时40毫秒,等待外围设备准备好
Lcminit(); //液晶初始化,包括全屏幕清屏
col=32; //第一屏
row=0;
Screen(A1);
col=64;
row=0;
Screen(A2);
col=96;
row=0;
Screen(A3);
col=128;
row=0;
Screen(A4);
col=0;
row=4;
Screen(A5);
col=32;
row=4;
Screen(A4);
col=64;
row=4;
Screen(A6);
col=96;
row=4;
Screen(A7);
col=128;
row=4;
Screen(A8);
col=160;
row=4;
Screen(A9);
Delay(1000);
do
{
Rollscreen(x); //定位新的显示起始行
x++;
Delay(40); //延时,控制滚动速度
}
while(x<64);
Delay(1000);
Lcminit(); //第二屏
col=32; //左区
row=0;
Putcdot(SHI);
col=48;
row=0;
Putcdot(JIAN);
col=32;
row=2;
Putcdot(QIANG);
col=48;
row=2;
Putcdot(DU);
col=32;
row=4;
Putcdot(BO);
col=48;
row=4;
Putcdot(XING);
col=32;
row=6;
Putcdot(PING);
col=48;
row=6;
Putcdot(LV);
col=64; //中区
row=0;
Putcdot(&num[32*4]);
col=80;
row=0;
Putcdot(&num[0]);
col=96;
row=0;
Putcdot(FENG);
col=112;
row=0;
Putcdot(ZHONG);
col=80;
row=2;
Putcdot(&XH[0]);
col=96;
row=2;
Putcdot(&XH[32]);
col=112;
row=2;
Putcdot(&XH[64]);
col=80;
row=4;
Putcdot(FANG);
col=96;
row=4;
Putcdot(AN);
col=112;
row=4;
Putcdot(YIERSAN);
col=64;
row=6;
Putcdot(&num[32*2]);
col=80;
row=6;
Putcdot(&num[0]);
col=96;
row=6;
Putcdot(HE);
col=112;
row=6;
Putcdot(ZI);
col=128; //右区
row=0;
Num(Big_Null);
col=160;
row=0;
Num(Big_Null);
IE=0x85; //INT1,INT0,CPU
while(1);
}
/**************画线,只提供x,y方向,不提供斜线***********/
void Linehv(unsigned char length)
{
unsigned char xs,ys;
if(xy)
{
ys=col;
for(xs=0;xs<length;xs++)
{
col=ys+xs;
Point();
}
}
else
{
xs=row;
for(ys=0;ys<length;ys++)
{
row=xs+ys;
Point();
}
}
}
/**********************画点******************************/
void Point(void)
{
unsigned char x1,y1,x,y;
x1=col;
y1=row;
row=y1>>3; //取Y方向分页地址
Rddata();
y=y1&0x07; //字节内位置计算
x=0x01;
x=x<<y; //移入所画点
Wrdata(cbyte|x); //画上屏幕
col=x1;
row=y1;
}
/************************数字32*64************************/
void Num(unsigned char *a)
{
unsigned char i,bakerx,bakery;
bakerx=col; //暂存x,y坐标,已备下半个字符使用
bakery=row;
for(i=0;i<32;i++)
{
Wrdata(*(a++)); //写输出一字节
col++;
}
col=bakerx; //列对齐
row=bakery+1;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+2;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+3;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx; //列对齐
row=bakery+4;
for(i=0;i<32;i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -