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

📄 lcd.c

📁 s12温度控制程序,包括模糊控制和LCD程序
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include "all_head.h"
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/******所占用I/O资源*******/
// PORTA_BIT3  --->  LCD_E
// PORTA_BIT4  --->  LCD_RW
// PORTA_BIT5  --->  LCD_RS
// PTM         --->  LCD:DB0-DB7 -->PTM
/******所占用I/O资源*******/

extern int DisplayValue[8];
extern uchar FreqSetValue;

/**********界面测试函数************/
 void DisplayTab(void) {
  
  TabHead();
  DisplayCh(5,145);
  DisplayCh(2,100);
  DisplayCh(6,154);
 }  
 
/**********实时显示表格************/ 
/*每个通道都在一个固定的位置,不能改变,主要由DisplayCh()的写法决定的*/
 void Display3Tab(char ch) {         //ch = 0-7
 
  char ch1,ch2;
  ch1 = ch+1;         
  ch2 = ch+2;
  if(ch1>7) ch1 = ch1-8;
  if(ch2>7) ch2 = ch2-8;
  TabHead();
  DisplayCh(ch,DisplayValue[ch]+1);     //显示当前通道的反馈值,+1是为了消除编译警告
  DisplayCh(ch1,DisplayValue[ch1]+1);   //显示下一通道的反馈值,+1是为了消除编译警告
  DisplayCh(ch2,DisplayValue[ch2]+1);   //显示下下一通道的反馈值,+1是为了消除编译警告

 }
 
/**********实时显示画面************/
/*画面可以移动,每个通道显示的位置不固定,可以由键盘控制上下移动*/ 
 void DisplayPicture(char ch){
  
  char ch1,ch2;
  ch1 = ch+1;
  ch2 = ch+2;
  if(ch1>7) ch1 = ch1-8;
  if(ch2>7) ch2 = ch2-8;
  TabHead();                   //表头
  
  SetDisAdd(0x90);             //设定字符入口地址
  WriteData(0x30+ch);           //通道号
  Replace();                   //对齐
  WriteValue(DisplayValue[ch]+1);        //反馈值
  
  SetDisAdd(0x88);             //设定字符入口地址
  WriteData(0x30+ch1); 
  Replace();
  WriteValue(DisplayValue[ch1]+1); 
  
  SetDisAdd(0x98);             //设定字符入口地址
  WriteData(0x30+ch2); 
  Replace();
  WriteValue(DisplayValue[ch2]+1); 
          
 }
  
/*重复代码函数*/
 void Replace(void)   //用于代替DisplayPicture()代码中的重复部分
 {
  WriteData(0x7c);              //表格符
  WriteValue(FreqSetValue);     //设定值
  order();                     //对齐
 
 }
/**********界面表头函数***********/
 void TabHead(void){
 
  SetDisAdd(0x80);             //设定字符入口地址
  WriteData(0x20);              //空格
  WriteData(0x7c);              //表格符
  WriteChineseLCD(0xc9,0xe8);  //"设"
  WriteChineseLCD(0xb6,0xa8);  //"定"
  WriteChineseLCD(0xa1,0xe6);  //" C"
  WriteData(0x20);              //空格
  WriteData(0x7c);              //表格符
  WriteChineseLCD(0xb5,0xb1);  //"当"
  WriteChineseLCD(0xc7,0xb0);  //"前"
  WriteChineseLCD(0xa1,0xe6);  //" C" 
  
 }
 

/************显示指定通道的当前值*************/

 void DisplayCh(uchar ch,uchar feedback) {
  switch(ch) {
    case 0:
    case 3:
    case 6:
       SetDisAdd(0x90);             //设定字符入口地址
       WriteData(0x30+ch);           //通道号
       WriteData(0x7c);              //表格符
       WriteValue(FreqSetValue);             //设定值
       order();                     //对齐
       WriteValue(feedback);        //反馈值
       break;
       
    case 1:
    case 4:
    case 7:
       SetDisAdd(0x88);             //设定字符入口地址
       WriteData(0x30+ch); 
       WriteData(0x7c);
       WriteValue(FreqSetValue);
       order();
       WriteValue(feedback);
       break;
       
    case 2:
    case 5:
       SetDisAdd(0x98);             //设定字符入口地址
       WriteData(0x30+ch); 
       WriteData(0x7c);
       WriteValue(FreqSetValue);
       order();
       WriteValue(feedback);
       break;
     default:
       SetDisAdd(0x90);             //设定字符入口地址
       WriteData(0x45);              //"E"
       WriteData(0x72);              //"r"
       WriteData(0x72);              //"r"
       WriteData(0x6f);              //"o"
       WriteData(0x72);              //"r"
       break;
  }
 }

/***********对齐函数************/
 void order(void) {
  WriteData(0x20);
  WriteData(0x20);
  WriteData(0x20);
  WriteData(0x20);
  WriteData(0x7c);
 }
 
/**********延时函数************/ 
 void delay(unsigned int time) 
{
  unsigned int i;
  while(time--) 
  {   
  for(i=1;i<5000;i++);
  }
}

/**********LCD初始化************/
void LCD_Ini(void) {       //延时一定要够
  E_LCD = 1;
  delay(20);               //上电等待>40ms
  WriteCommand(0x30);      //功能设定,选择8位数据,基本指令操作
  delay(2);                //>100us
  WriteCommand(0x30);      //功能设定
  delay(2);                //>37us
  WriteCommand(0x0c);      //显示状态,整体显示开,游标关,不允许游标位置反白
  delay(2);                //>100us
  WriteCommand(0x01);      //清屏
  delay(10);               //>10ms
  WriteCommand(0x06);      //DDARM的地址计数器(AC)加上,根据手册例程而来
 
}

/**********设定显示入口地址************/
void SetDisAdd(char address) {
  WriteCommand(address);
  
}

/**********显示中文字符************/
void WriteChineseLCD(char high_address,char low_address) {
 
  WriteData(high_address);
  WriteData(low_address);
  
}

void WriteData(char data) {
  
  CheckBusy();
  DDRM = 0xff;
  RS = 1;
  RW = 0;
  DATABUF = data;
  E_LCD = 1;
  E_LCD = 0;
  CheckBusy();    //
}

/*
void WriteASC(char data){

  CheckBusy();
  DDRM = 0xff;
  RS = 1;
  RW = 0;
  DATABUF = data;
  E_LCD = 1;
  E_LCD = 0;
  CheckBusy();
}
*/

/*********以ASC码的形式输出一个三位数的值**********/
void WriteValue(uchar value) {
  char bw,sw,gw;
  bw = value/100;
  sw = (value/10)%10+1;    //+1消除编译警告
  gw = value%10+1;         //+1消除编译警告
  WriteData(0x30+bw);       //输出百位
  WriteData(0x30+sw-1);     //输出十位
  WriteData(0x30+gw-1);     //输出个位
  
}

void WriteCommand(char command) {
  
  CheckBusy();
  DDRM = 0xff;
  RS = 0;
  RW = 0;
  DATABUF = command;
  E_LCD = 1;
  E_LCD = 0;
  //CheckBusy();     //
}

/**********检查忙标志BF************/
void CheckBusy(void) {
 char data;
 RS = 0;
 RW = 1;
 do
 {
   DDRM = 0x00;
   E_LCD = 1;
   data = DATABUF;         //读出BF标志的值,
   //E_LCD = 0;
   data = data&0x80;
 }while(data!=0x00);

}






⌨️ 快捷键说明

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