×
单片机 > 单片机程序设计 > 详情

字符型液晶1602检测独立键盘

发布时间:2020-08-26 发布时间:
|
文件名:define.h

描述:定义宏

#define uchar unsigned char
#define uint unsigned int
#define flase 0
#define true 1
#define RS 5
#define RW 6
#define EN 7 

 
//文件名:key.h
//描述:声明关于键盘的函数
 

#include"define.h"
uchar get_key0(void);
uchar get_key1(void);
uchar get_key2(void);
uchar get_key3(void);

 
//文件名:key.c
//描述:定义关于键盘的函数
 

#include
#include
#include"define.h"
#inclued"key.h"


//函数名:get_key0
//输入:无
//输出:有按键动作:true;无按键动作:flase
//描述:按键状态的检测

uchar get_key0(void)
{
    static uchar key_flag=0;
    if(key_flag==0)
    {
        if((PIND&0X01)==0X00)
        {
            key_flag=1;
        }
    }
    else if(key_flag==1)
    {
        if((PIND&0X01)==0X01)
        {
            key_flag=0;
            return(true);
        }
    }
    return(flase);
}

uchar get_key1(void)
{
    static uchar key_flag=0;
    if(key_flag==0)
    {
        if((PIND&0X02)==0X00)
        {
            key_flag=1;
        }
    }
    else if(key_flag==1)
    {
        if((PIND&0X02)==0X02)
        {
            key_flag=0;
            return(true);
        }
    }
    return(flase);
}
            
uchar get_key2(void)
{
    static uchar key_flag=0;
    if(key_flag==0)
    {
        if((PIND&0X04)==0X00)
        {
            key_flag=1;
        }
    }
    else if(key_flag==1)
    {
        if((PIND&0X04)==0X04)
        {
            key_flag=0;
            return(true);
        }
    }
    return(flase);
}

uchar get_key3(void)
{
    static uchar key_flag=0;
    if(key_flag==0)
    {
        if((PIND&0X08)==0X00)
        {
            key_flag=1;
        }
    }
    else if(key_flag==1)
    {
        if((PIND&0X08)==0X08)
        {
            key_flag=0;
            return(true);
        }
    }
    return(flase);
}

 


//文件名:LCD.h
//描述:声明关于液晶1602的函数
 

#include"define.h"
void LCD_Reset(void);
void LCD_Show_Char(unsigned char x,uchar y,uchar data);
void LCD_Show_String(uchar x,uchar y,uchar * ptr);

 
//文件名:LCD.c
//描述:定义1602的底层驱动函数和上层应用函数

#include
#include
#include"define.h"
#include"LCD.h"

#define RS_0 PORTA &=~BIT(RS)
#define RS_1 PORTA|=BIT(RS)
#define RW_0 PORTA&=~BIT(RW)
#define RW_1 PORTA|=BIT(RW)
#define EN_0 PORTA&=~BIT(EN)
#define EN_1 PORTA|=BIT(EN)

void Set_Data(uchar data);
void LCD_Write_Command(uchar command,uchar state);
void LCD_Write_Data(uchar data,uchar state);
uchar LCD_Read_Data(uchar state);
uchar LCD_Busy(void);
void delay_ms(uint ms);

//函数名;Set_Data
//输入:数据data
//输出:无
//描述:送数据data至B口


void Set_Data(uchar data)
{
    PORTB=data;
}

//函数名;LCD_Busy
//输入:无
//输出:0=LCD空闲;0X80=LCD忙碌
//描述:LCD忙碌检测函数

uchar LCD_Busy(void)
{
    uchar state;
    DDRB=0X00;
    EN_0;
    RS_0;
    RW_1;
    EN_1;
    NOP();
    state=PINB;
    EN_0;
    DDRB=0XFF;
    return(state&0X80);
}
    
//函数名;LCD_Write_Command
//输入:LCD写入指令command,state=1时检测LCD是否忙碌
//输出:无
//描述:向LCD控制寄存器写入指令

void LCD_Write_Command(uchar command ,uchar state)
{
    if(state==1)
    {
        while(LCD_Busy()!=0X00){;}
    }
    EN_0;
    RS_0;
    RW_0;
    Set_Data(command);
    EN_1;
    NOP();
    NOP();
    EN_0;
}
    
//函数名;LCD_Write_Data
//输入:LCD写入数据data,state=1时检测LCD是否忙碌
//输出:无
//描述:向LCD数据寄存器写入数据
 
void LCD_Write_Data(uchar data,uchar state)
{
    if(state==1)
    {
        while(LCD_Busy()!=0X00){;}
    }
    EN_0;
    RS_1;
    RW_0;
    Set_Data(data);
    EN_1;
    NOP();
    NOP();
    EN_0;
}

//函数名;LCD_Read_Data
//输入:state=1时检测LCD是否忙碌
//输出:读出的数据
//描述:读LCD数据寄存器的数据  


uchar LCD_Read_Data(uchar state)
{
    uchar data;
    if(state==1)
    {
        while(LCD_Busy()!=0X00){;}
    }
    DDRB=0X00;
    EN_0;
    RS_1;
    RW_1;
    EN_1;
    data=PINB;
    NOP();
    NOP();
    EN_0;
    DDRB=0XFF;
    return(data);
   

//函数名;LCD_Reset
//输入:无
//输出:无
//描述:LCD软复位
  
void LCD_Reset(void)
{
    delay_ms(15);
    LCD_Write_Command(0X38,0);
    delay_ms(5);
    LCD_Write_Command(0X38,0);
    delay_ms(5);
    LCD_Write_Command(0X38,0);
    LCD_Write_Command(0X38,1);
    LCD_Write_Command(0X08,1);
    LCD_Write_Command(0X01,1);    
    LCD_Write_Command(0X06,1);
    LCD_Write_Command(0X0c,1);
}

//函数名;LCD_Show_Char
//输入:x-LCD行(0--1);y-LCD列(0--15);data-显示的字符
//输出:无
//描述:在LCD的特定位置显示一个字符

void LCD_Show_Char(uchar x,uchar y,uchar data)
{
    uchar address;
    if((x<2)&&(y<16))
    {
        address=0x40*x+y;
        LCD_Write_Command(0X80|address,1);
        LCD_Write_Data(data,1);
    }
}

//函数名;LCD_Show_String
//输入:x-LCD行(0--1);y-LCD列(0--15);ptr-字符串首地址
//输出:无
//描述:在LCD的特定位置连续显示一个字符串

void LCD_Show_String(uchar x,uchar y,uchar* ptr)
{
    uchar x_address=x;
    uchar y_address=y;
    while(*ptr!='\0')
    {
        LCD_Show_Char(x_address,y_address,*ptr++);
        y_address++;
        if((x_address==0)&&(y_address>=16))
        {
            x_address=1;
            y_address=0;
        }
        else if((x_address==1)&&(y_address>=16))
        {
            return;
        }
    }
}

//函数名;delay_ms
//输入:无
//输出:无
//描述:延时1ms

void delay_ms(uint ms)
   
    uint i,j;
    for(i=0;i         for(j=0;j<564;j++);
}

 

//文件名:main.c
//描述:检测独立按键的键号,显示在1602上
 

#include
#include
#include"key.h"
#include"LCD.h"
#include"define.h"

void main(void)
{
    DDRA=0XFF;
    PORTA=0X00;
    DDRB=0XFF;    
    PORTB=0X00;
    DDRD=0X00;
    PORTD|=0X0F; //上拉电阻使能
    TCCR0=0X0D;
    TCNT0=0X00;
    OCR0=0X39;
    TIMSK|=0X02;
    TIFR|=0X02;
    SEI();  //T0初始化,10ms中断,CTC模式
    
    LCD_Reset();
    LCD_Show_String(0,0,"=*=KEY DEMO=*=");
    LCD_Show_String(1,0,"NO KEY PRESSED");
    while(1)
    {
        ;
    }
}


//函数名:Time0
//输入:无
//输出:无
//描述:中断处理程序

#pragma interrupt_handler Time0:20
void Time0(void)
{
    static uint key_count=0;
    if(get_key0()==true)
    {
        LCD_Show_String(1,0,"KEY0 IS PRESSED");
        key_count=0;
           
    if(get_key1()==true)
    {
        LCD_Show_String(1,0,"KEY1 IS PRESSED");
        key_count=0;
       
    if(get_key2()==true)
    {
        LCD_Show_String(1,0,"KEY2 IS PRESSED");
        key_count=0;
       
    if(get_key3()==true)
    {
        LCD_Show_String(1,0,"KEY3 IS PRESSED");
        key_count=0;
    }
    if(key_count++>=500)
    {
        LCD_Show_String(1,0,"NOKEY IS PRESSED");
        key_count=0;
    }
   

附电路图:

            
 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430F5529 上手小例程2