📄 main.c
字号:
#include <pic16f877A.h>
/*单片机与LCD1602连接数据线定义*/
#define Uchar unsigned char
#define Uint unsigned int
#define LCD_DATA PORTD
#define TRIS_LCD_DATA TRISD
#define LCD_BUSY RD7
#define BZ RC3
#define TRISBZ TRISC3
#define NOP() asm("nop")
#define LCD_RS RC0 /* PORT for RS */
#define TRIS_LCD_RS TRISC0 /* TRIS for RS */
#define LCD_RW RC1 /* PORT for RW */
#define TRIS_LCD_RW TRISC1 /* TRIS for RW */
#define LCD_EN RC2 /* PORT for EN */
#define TRIS_LCD_EN TRISC2 /* TRIS for EN */
/*-------------------1602液晶命令定义-------------------*/
/*初始化命令*/
#define DISP_CLR 0x01 /*清显示,光标复位到第一行首(地址00H)*/
#define CUR_HOME 0x02 /*光标复位,光标返回到第一行首*/
/*光标和显示模式设置*/
#define CUR_AUTO_R 0b00000110 /*设置光标在文字插入后自动右移*/
#define CUR_AUTO_L 0b00000100 /*设置光标在文字插入后自动左移*/
#define DISP_AUTO_R 0b00000111 /*设置显示在文字插入后自动右移*/
#define DISP_AUTO_L 0x00000101 /*设置显示在文字插入后自动左移*/
/*显示开关控制*/
#define DISP_ON 0b00001111 /*显示开*/
#define DISP_OFF 0b00001011 /*显示关*/
#define CUR_ON 0b00001111 /*光标开*/
#define CUR_OFF 0b00001101 /*光标关*/
#define BLINK_ON 0b00001111 /*光标闪烁开*/
#define BLINK_OFF 0b00001110 /*光标闪烁关*/
/*光标或显示移位*/
#define CUR_SHIFT_L 0b00010000 /*光标左移*/
#define CUR_SHIFT_R 0b00010100 /*光标右移*/
#define DISP_SHIFT_L 0b00011000 /*显示左移*/
#define DISP_SHIFT_R 0b00011100 /*显示右移*/
/*工作模式设置*/
#define LCD_MODE_STD 0x38 /*1602标准工作模式:8位数据传送,2行显示,字符点阵5*7*/
/*字符发生器RAM地址设置*/
#define SET_ADDR_CGRAM 0x40 /*设置CGRAM地址*/
/*数据存储器地址设置*/
#define SET_ADDR_DDRAM 0x80 /*设置DDRAM地址*/
/*自定义字符*/
#define USER_CHAR1 0x00/*自定义字符1:年*/
#define USER_CHAR2 0x01/*自定义字符2:月*/
#define USER_CHAR3 0x02/*自定义字符3:日*/
#define USER_CHAR4 0x03/*自定义字符4:¥*/
#define USER_CHAR5 0x04/*自定义字符5:元*/
#define USER_CHAR6 0x05/*自定义字符6:℃*/
#define USER_CHAR7 0x06/*自定义字符7:↑*/
#define USER_CHAR8 0x07/*自定义字符8:小喇叭图标*/
Uchar cdis1[ ] = {"Key Number: "};
Uchar cdis2[ ] = {"In Dc: v"};
Uint ADData=0x00;
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void Delay(Uint t)
{
Uchar k;
while(t--)
{
for(k=0; k<125; k++)
{
NOP();
}
}
}
/********************************************************/
void DelayB(Uchar x) //x*0.14MS
{
Uchar i;
while(x--)
{
for (i=0; i<6; i++)
{
NOP();
}
}
}
/*蜂名器*/
void Beep()
{
Uint i;
TRISBZ=0;
for(i=0;i<1000;i++)
{
BZ=!BZ;
DelayB(1);
}
}
void wait_until_LCDready() /*检测忙标志,忙则等待*/
{
TRIS_LCD_RS=0;
TRIS_LCD_RW=0;
TRIS_LCD_EN=0; /*单片机的LCD数据口设置为全输出*/
LCD_EN=0;/*此句必须加,否则后面RS RW输出电平后,液晶屏出现光标复位的现象*/
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;/*读状态的时候,E始终保持高电平即可*/
NOP();
NOP();
NOP();
NOP();
TRIS_LCD_DATA=0x0ff;/*设置单片机LCD数据引脚全为输入*/
while(LCD_BUSY==1);/*LCD忙,则原地等待*/
LCD_EN=0;
}
void LCD_wrcmd(Uchar cmd)/*写入控制命令*/
{
NOP();/****/
wait_until_LCDready();
NOP();/****/
TRIS_LCD_RS=0;
TRIS_LCD_RW=0;
TRIS_LCD_EN=0;/*单片机的LCD数据口设置为全输出*/
NOP();/****/
LCD_EN=0;
NOP();/****/
LCD_RS=0;
NOP();/****/
LCD_RW=0;
NOP();/****/
TRIS_LCD_DATA=0x00;/*设置单片机LCD数据引脚全为输出*/
NOP();/****/
NOP();/****/
NOP();/****/
LCD_DATA=cmd;
NOP();/****/
LCD_EN=1;
NOP();;/****/
NOP();
LCD_EN=0;
NOP();/****/
}
void LCD_wrchar(Uchar data)/*写入要显示的字符*/
{
NOP();/****/
wait_until_LCDready();
NOP();/****/
TRIS_LCD_RS=0;
TRIS_LCD_RW=0;
TRIS_LCD_EN=0; /*单片机的LCD数据口设置为全输出*/
NOP();/****/
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
NOP();/****/
TRIS_LCD_DATA=0x00;/*设置单片机LCD数据引脚全为输出*/
NOP();/****/
NOP();/****/
NOP();/****/
LCD_DATA=data;
NOP();/****/
NOP();/****/
NOP();/****/
NOP();/****/
LCD_EN=1;
NOP();/****/
NOP();
NOP();/****/
NOP();/****/
LCD_EN=0;
NOP();/****/
}
void LCD_setxy(char x,char y) /*设定显示位置,行x=1/2,列y=1~16的任意整数*/
{
char temp;
if(x==1)
{
temp=0x80+y-1;
LCD_wrcmd(temp);
}
else
{
temp=0xC0+y-1;
LCD_wrcmd(temp);
}
}
void LCD_Init()
{
TRIS_LCD_RW=0;/*设置单片机LCD控制引脚全为输出*/
TRIS_LCD_RS=0;
TRIS_LCD_EN=0;
LCD_wrcmd(0x38);/*LCD标准工作模式:8位数据传送,2行显示,字符点阵5*7*/
Delay(5);/*延时5ms*/
LCD_wrcmd(0x0c);/*显示开,关光标 */
Delay(5);
LCD_wrcmd(0x06);/*移动光标 */
Delay(5);
LCD_wrcmd(0x01);/*清除LCD的显示内容*/
Delay(50);
}
void AD_Init()
{
ADCON0=0x41; /* 选择A/D通道为RA0,打开A/D转换器,在工作状态,A/D转换时间为8Tosc*/
ADCON1=0x82; /* 转换结果右移,及ADRESH的寄存器的高6位为0,RA0为模拟输入,vdd为Vref+*/
//PIE1=0x00;
//PIE2=0x00;
ADIE=1; /* A/D转换中断允许*/
PEIE=1; /* 外围中断允许*/
GIE=1 ; /* 允许全局中断*/
TRISA0=1; /* 允许RA0输入*/
ADGO=1; //启动A/D转换
}
void DIS_AD(Uint advalues)
{
Uchar m;
Uint n;
advalues=(advalues*50)/1023;
m=advalues/10;
n=advalues%10;
LCD_setxy(2,8);
LCD_wrchar(0x30+m);
LCD_wrchar(0x2e);
LCD_wrchar(0x30+n);
if(advalues>=25)
{
Beep();
}
}
void main()
{
Uchar m;
LCD_Init();
AD_Init();
LCD_setxy(1,1); //设置显示位置为第一行的第1个字符
m =0;
while(cdis1[m] != '\0')
{ //显示字符
LCD_wrchar(cdis1[m]);
m++;
}
LCD_setxy(2,1); //设置显示位置为第二行的第1个字符
m =0;
while(cdis2[m] != '\0')
{ //显示字符
LCD_wrchar(cdis2[m]);
m++;
}
m=0;
Beep();
while(1)
{
LCD_setxy(1,13); //设置显示位置为第一行的第1个字符
m ++;
if(m>=10)
{
m=0;
}
LCD_wrchar(0x30+m);
DIS_AD(ADData);
Delay(100);
}
}
void interrupt adint(void)
{
ADIF=0; //清除中断标志
ADData=ADRESH;
ADData<<=8;
ADData|=ADRESL;
ADGO=1; //启动下一次A/D转换
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -