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

📄 lcd.c

📁 192*64_stn_ks108_液晶程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************
  连线图
  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 + -