这次通过板上自带按键 RB3 和 RB4 完成
按下RB3 数字加一
按下RB4 数字减一
最大为9
最小为1
主函数 main.c
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
//__CONFIG(0xFF32);//??xc8?????????????
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
#define K1 RB3
#define K2 RB4
unsigned char Tempmin = '0'; // 最小问题
unsigned char Tempmax = '1'; // 最大问题
uchar kflag = 0;
uchar ge=1;//????
void delay_1ms(void)
{
unsigned int n;
for(n=0;n<50;n++)
{
NOP();
}
}
void delay_ms(unsigned int time)
{
for(;time>0;time--)
{
delay_1ms();
}
}
void Key()
{
if(K1&&K2) // 按键没有按下
{
kflag = 1;
}
else // 按键按下
{
if(kflag == 1)
{
kflag = 0;
if(K1 == 0)
{
if(++Tempmax >= '9')
Tempmax = '9';
}
if(K2 == 0)
{
if(Tempmax > Tempmin+1)
{
--Tempmax;
}
}
}
}
}
void main()
{
TRISB1=1;
LCD1602_GPIO_Init(); //????1602?????
LCD1602_init(); //1602?????
while(1)
{
DisplayListChar(0,0,"SPEED = ");
// Tempvalue = ReadTemperature();
// Lcd_Display(7,1,Tempvalue); // 显示温度值
DisplayOneChar(8,0,Tempmax); // 最高温度
Key(); // 按键程序
}
}
lcd1602.c
//???pmlab x??????????????gb2312??
/*
lcd1602.c?lcd1602.h?????????????
DisplayListChar(unsigned charx, unsigned char y,unsigned char* str)???????
DisplayOneChar(unsigned charx, unsigned char y,unsigned char str)??????
x???y???ch?????'a'?str??????"i am a string"?
????????????lcd1602.h???#define??????
??lcd1602.c???void LCD1602_GPIO_Init(void)???????
*/
#include <pic.h> //??PIC16F87XA???????
#include "lcd1602.h"
//1602???????
//---------------------------------------
void delay(void)
{
int i;
for (i = 0;i < 200;i++);
}
//---------------------------------------
//???1602?????
//---------------------------------------
void LCD1602_Write_Instruction(unsigned char combuf)
{
Lcd_Date=combuf; //??????RD???DB
RS=0; //???????
// RW=0; //?????
E=0;
delay(); //?????
E=1; //E?????????1602??
asm("NOP"); //????????????????1us
E=0; //???????E???
}
//---------------------------------------
//???1602?????
//---------------------------------------
void LCD1602_Write_data(unsigned char databuf)
{
Lcd_Date=databuf; //??????RD???DB
RS=1; //???????
// RW=0; //?????
E=0;
delay(); //?????
E=1; //E?????????1602??
asm("NOP"); //????????????????1us
E=0; //???????E???
}
//---------------------------------------
//???1602???????
//---------------------------------------
void LCD1602_init(void)
{
LCD1602_Write_Instruction(0x38); //8?????????????5*7????
LCD1602_Write_Instruction(0x08); //?????????
LCD1602_Write_Instruction(0x01); //??
LCD1602_Write_Instruction(0x06); //???????????????????
LCD1602_Write_Instruction(0x0C); //?????????
}
/****************??????????????*************/
void DisplayOneChar(unsigned char X,unsigned char Y,const unsigned char DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //?y?1???????????+0X40
X|=0x80; //???????+0X80
LCD1602_Write_Instruction(X);
LCD1602_Write_data(DData);
}
/***********??????????????***********/
void DisplayListChar(unsigned char X,unsigned char Y,const unsigned char *DData)
{
unsigned char ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16 && DData[ListLength])
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
void LCD1602_GPIO_Init(void)
{
ADCON1=0X07;//??A?????????????????IO
TRISE=0B11111001; //RA5 RA2 RA3??
TRISD=0B00000000; //RD7-RD0??
PORTA=0B00000000; //???RA7-RA0???
PORTD=0B00000000; //???RD7-RD0???
}
lcd1602.h
//???pmlab x??????????????gb2312??
/*
lcd1602.c?lcd1602.h?????????????
DisplayListChar(unsigned charx, unsigned char y,unsigned char* str)???????
DisplayOneChar(unsigned charx, unsigned char y,unsigned char str)??????
x???y???ch?????'a'?str??????"i am a string"?
????????????lcd1602.h???#define??????
??lcd1602.c???void LCD1602_GPIO_Init(void)???????
*/
#ifndef __LCD1602_H
#define __LCD1602_H
//---------------------------------------
//1602????I/O??
#define E RE1 //1602???E???RA3??
//#define RW RW //1602???RW???RA2??
#define RS RE2 //1602???RS???RA5??
#define Lcd_Date PORTD //LCD1602????
void delay(void);
void LCD1602_Write_Instruction(unsigned char combuf);
void LCD1602_Write_data(unsigned char databuf);
void LCD1602_init(void);
void DisplayOneChar(unsigned char X,unsigned char Y,const unsigned char DData);
void DisplayListChar(unsigned char X,unsigned char Y,const unsigned char *DData);
void LCD1602_GPIO_Init(void);
#endif