📄 yejing.c
字号:
/* ****************************************************************
** 功能描述: 液晶显示程序;用A/D采样电压值,并将其显示在液晶上
*************************************************************** */
#include "pic18.h" /* 所有PIC18系列的头文件 */
const char shu[160]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, //"0"
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, //"1"
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, //"2"
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, //"3"
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, //"4"
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, //"5"
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, //"6"
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, //"7"
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, //"8"
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,}; //"9"
const char d[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,} ; //小数点
const char mao[16]={0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,}; //"冒号"
const char dian[32]={0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00,}; //"电"
const char ya[32]={0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,0x42,0x42,0x42,0x62,0x42,0x02,0x00,
0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x21,0x2E,0x24,0x20,0x20,0x00,}; //"压"
char *ARRAY;
char ppp[34];
char i;
unsigned int Adresult=0; /* AD转换计算结果 */
unsigned long int Ad_Sample_result=0; /* AD转换采样结果 */
unsigned char AD_Flag=0; /* AD转换完成标志,=1有新的AD数据转换完成 */
/* **************************************************************
** 函 数 名: AD_Initial()
** 功能描述:A/D转化初始化子程序
****************************************************************** */
void AD_Initial()
{
INTCON=0X00; /* 禁止总中断和外围中断 */
ADCON0=0x51; /* 选择A/D通道为RA2,A/D转换器在工作状态,且使A/D转换时钟为8tosc */
ADCON1=0X82; /* 转换结果右移,及ADRESH寄存器的高6位为"0"且把RA2(AN2)设置 */
ADIF=0; /* 清除A/D转换标志 */
ADIE=1; /* A/D转换中断允许 */
ADIP=1; /* AD中断高优先级 */
IPEN=1; /* 使能中断优先级 */
TRISA=TRISA |0x04; /* 设置RA2(AN2通道)为输入方式 */
}
/* **************************************************************
** 函 数 名: YJ_initial()
** 功能描述:液晶显示初始化子程序
****************************************************************** */
void YJ_initial()
{
CMCON=0x07; /* 关比较器 */
ADCON1=0X07; /* 设置数字输入输出口 */
INTCON=0X00; /* 禁止总中断和外围中断 */
WDTCON=0; /* 清看门狗 */
TRISE=TRISE&0XF8; /* 设置RE0,RE1,RE2为输出 */
TRISB=TRISB&0XFE; /* 设置RB0为输出 */
TRISA=TRISA&0XF7; /* 设置RA3为输出 */
}
/* **************************************************************
** 函 数 名: Deal_AD()
** 功能描述:AD转换完成后处理数据子程序
****************************************************************** */
void Deal_AD()
{
unsigned temp;
Ad_Sample_result=ADRESL+(ADRESH<<8); /* 读取并存储A/D转换结果(10位,高6位为0) */
AD_Flag=0; /* AD转换完成标志清0 */
Adresult=(Ad_Sample_result*50)>>10;
/*将AD采样结果转换为以两位数表示的值,即放大10倍,乘以满该度值5V,除以满刻度转换值10位(1024)*/
temp=Adresult;
Adresult=(((temp/10)<<4)&0xf0)+(Adresult % 10);
/*转换为带一位小数的BCD码实际值如25表示2.5V,在实验板上将J13跳针插上,2通道采样口输入0-5V的直流电压*/
}
/* ****************************************************************
** 函 数 名: interrupt HI_ISR()
** 功能描述: 高优先级中断子程序:AD转换完成中断
*************************************************************** */
void interrupt HI_ISR()
{
if(ADIF==1) //AD转换完成
{
ADIF=0; //清除中断标志
AD_Flag=1; //置AD转换完成标志
}
}
/* ****************************************************************
** 函 数 名: DELAY()
** 功能描述: 软件延时子程序
*************************************************************** */
void DELAY()
{
unsigned int i;
for(i = 11535; i>0;i--)
i=i;
}
/* ****************************************************************
** 函 数 名: LCDSTA1(int E)
** 功能描述: 读液晶显示器状态子程序,行参E代表液晶的边,用来查询液晶边是否处于空闲状态
*************************************************************** */
void LCDSTA1(int E)
{
int E1FLAG;
TRISD=0XFF; /* 设置D口为输入 */
while(1)
{
if(E==1)
{
PORTA=PORTA|0X08; /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。*/
PORTE=(PORTE|0X01)&0XF9;/* RE0/RW=1,RE1/DI=0,设置为读状态 */
}
else
{
PORTA=PORTA&0XF7; /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
PORTE=(PORTE|0X05)&0XFD;/* RE0/RW=1,RE1/DI=0,设置为读状态*/
}
PORTB=PORTB|0X01; /* RB0/E=1 */
E1FLAG=PORTD&0X80; /* 取DB7的值 */
PORTB=PORTB&0XFE; /* RB0/E=0,先将E设置为1,让数据被读出,该指令用来查询液晶显示模块内部控制器的状态;
之后又将E设置为0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
if(E1FLAG==0X0000) break; /* 如果RD7=0,则处于正常工作状态,退出循环 */
}
}
/* ****************************************************************
** 函 数 名: TRANS1(int TRANS,int E)
** 功能描述: 对液晶显示器发指令子程序,行参E代表处理的液晶的边,可以设置行和页。当RE0/RW=0,RE1/DI=0时,DB7=1,DB6=1,
设置了对应液晶屏最上一行的显示RAM 的行号;DB7=1,DB6=0, 设置页值。
*************************************************************** */
void TRANS1(int TRANS,int E)
{
TRISD=0X00; /* RD为输出 */
if(E==1) /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。*/
{
PORTA=PORTA|0X08;
PORTE=PORTE&0XF8; /* RE0/RW=0,RE1/DI=0 */
}
else /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
{
PORTA=PORTA&0xF7;
PORTE=(PORTE|0X04)&0XFC; /* RE0/RW=0,RE1/DI=0 */
}
PORTD=TRANS; /* 将所需要的行值或页值赋值给D口 */
PORTB=PORTB|0X01; /* RB0/E=1,让数据被读出 */
PORTB=PORTB&0XFE; /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
}
/* ****************************************************************
** 函 数 名: WRITE1(char WRITE,int CLMADD,int E)
** 功能描述: 对液晶显示器写数据子程序
*************************************************************** */
void WRITE1(char WRITE,int CLMADD,int E)
{
TRANS1(CLMADD,E); /* 设置列地址 */
TRISD=0X00; /* RD为输出 */
if(E==1) /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。RE0/RW=0,RE1/DI=1,写数据指令 */
{
PORTA=PORTA|0X08;
PORTE=(PORTE|0X02)&0xFA;
}
else /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。RE0/RW=0,RE1/DI=1,写数据指令 */
{
PORTA=PORTA&0xF7;
PORTE=(PORTE|0X06)&0xFE;
}
PORTD=WRITE; /* 将要写入数据赋值 */
PORTB=PORTB|0X01; /* RB0/E=1,让数据被读出 */
PORTB=PORTB&0XFE; /* RB0/E=0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */
}
/* ****************************************************************
** 函 数 名: DISP1(int E)
** 功能描述: 开E边显示子程序,用于检查液晶显示是否被打开
*************************************************************** */
void DISP1(int E)
{
int E1FLAG;
while(1)
{
TRANS1(0X03F,E); /* 送出控制命令,LED显示RAM中的内容 */
LCDSTA1(E); /* 判断液晶是否为空闲状态 */
TRISD=0XFF; /* 设置D口为输入 */
if(E==1) /* 设置RE2/CSA=0,RA3/CSB=1,即片选1。 */
{
PORTA=PORTA|0X08;
PORTE=(PORTE|0X01)&0xF9;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
}
else /* 设置RE2/CSA=1,RA3/CSB=0,即片选2。*/
{
PORTA=PORTA&0xF7;
PORTE=(PORTE|0X05)&0xFD;/* RE0/RW=1,RE1/DI=0,用来查询液晶显示模块内部控制器的状态*/
}
PORTB=PORTB|0X01; /* RB0/E=1,让数据被读出 */
E1FLAG=PORTD&0X20; /* 取RD5的值 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -