| 
 这次通过板上自带按键  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  
  
 |