📄 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 + -