历史上的今天

今天是:2025年07月14日(星期一)

正在发生

2018年07月14日 | AVRmeg16单片机实现按键控制LCD1602的数据显示

发布者:Serendipitous33 来源: eefocus关键字:AVRmeg16  单片机  按键控制  LCD1602  数据显示 手机看文章 扫描二维码
随时随地手机看文章

/**********************************   

*action: meg16 LCD1602控制程序

**********************************/

#include

#include

#define uchar unsigned char

#define uint unsigned int

 

#define RS_CLR PORTD &= ~(1 << 4)

#define RS_SET PORTD |=  (1 << 4)

 

#define RW_CLR PORTD &= ~(1 << 5)

#define RW_SET PORTD |=  (1 << 5)

 

#define EN_CLR PORTD &= ~(1 << 6)

#define EN_SET PORTD |=  (1 << 6)

 

#define I_MAX 2000 

#define U_MAX 2000 

#define I_MIN 0    

#define U_MIN 0    

 

uint I=500;  //当前电流

uint flag=0; //功能选择标志

uchar n;

uchar a='0',b='0',c='0',d='0',e='0';

 

void delay_us(uint n)

{

   while(n--)

   {

      NOP();NOP();NOP();NOP();

      NOP();NOP();NOP();NOP();

   }

}

 

void delay_ms(uint n)

{

   while(n--)

   {

      delay_us(1000);

   }

}

 

void LCD_en_write() //产生一个下降沿脉冲来写入数据或命令

{

   EN_SET;

   delay_us(20);

   EN_CLR;

   delay_us(20);

}

 

void LCD_clear() //LCD清零

{

   Write_CMD(0x01);

   delay_ms(5);

}

 

void Write_CMD(uchar cmd)//写命令

{

   RS_CLR;

   RW_CLR;

   EN_SET;

   PORTB=cmd;

   LCD_en_write();

}

 

void Write_Data(uchar data)//写数据

{

   RS_SET;

   RW_CLR;

   EN_SET;

   PORTB=data;

   LCD_en_write();

}

 

void LCD_SET_XY(uchar X,uchar Y)//设置写入位置

{

   uchar address;

   Y==0?(address=0x80+X):(address=0xc0+X);

   Write_CMD(address);

}

 

void LCD_write_str(uchar x,uchar y,uchar *s)//写入字符串

{

   LCD_SET_XY(x,y);

   while(*s)

   {

      Write_Data(*s);

 s++;

   }

}

 

void LCD_write_char(uchar x,uchar y,uchar data)//写入单个字符

{

   LCD_SET_XY(x,y);

   Write_Data(data);

}

 

void port_init()

{

   PORTA=0XFF;

   DDRA =0X00;

   

   PORTB=0XFF;

   DDRB =0X00;

   

   PORTC=0X7F;

   DDRC =0X80;

   

   PORTD=0XFF;

   DDRD =0X00;

}

 

void LCD_init()

{

   DDRB=0xff;

   DDRD|=(BIT(4)|BIT(5)|BIT(6));

   delay_ms(15);

   Write_CMD(0x38);

   delay_ms(5);

   Write_CMD(0x38);

   delay_ms(5);

   Write_CMD(0x38);

   

   Write_CMD(0x08);

   Write_CMD(0x01);

   delay_ms(5);

   

   Write_CMD(0x04);

   delay_ms(5);

   

   Write_CMD(0x0c);

}

void update() //数据更新

{

   a=I/10000+'0';

   b=I/1000%10+'0';

   c=I/100%10+'0';

   d=I/10%10+'0';

   e=I%10+'0';

   LCD_write_str(0,0,"I:       mA");

   LCD_write_str(0,1,"U:       mV");

   LCD_write_char(3,0,a);

   LCD_write_char(4,0,b);

   LCD_write_char(5,0,c);

   LCD_write_char(6,0,d);

   LCD_write_char(7,0,e);

}

/*********************************

      以下键盘输入函数

*********************************/

void key_1()

{

   if(I<=I_MAX-10) 

      if(flag%2==0)I+=10;

 else I+=1;

   update();

   //LCD_clear();

}

 

void key_2()

{

   if(I>=I_MIN+10) 

      if(flag%2==0)I-=10;

 else I-=1;

   update();

}

 

void key_3()

{

  flag++;

}

 

void key_4()//输出接口

{

   ;

}

 

void key_scan(void)

  {

   unsigned char key;

   DDRB = 0XFF;

   DDRD = 0Xff;

   PORTD = 0Xff;

   

   if(PIND != 0XFF)         //检测D口电平,如果全是高电平则退出

    {

     delay_ms(50);             //防抖

     if(PIND !=0xff)      //再次检测D口电平,如果不全是高电平则继续执行程序

      {

     key=PIND;

 switch(key)

 {

case 0xfd: key_1();break;

case 0xfe: key_2();break;

case 0xfb: key_3();break;

case 0xf7: key_4();break;

default : PORTB=key;

 }

      // while(PIND != 0XFF); //当前有按键处于按下状态,再按其他按键时程序维持当前

                       //状态,不会有对应LED点亮发生

      }

    }

 }

 

void UI()   //开机说明界面

{

   LCD_write_str(0,0," Welcome to our    ");

   LCD_write_str(0,1,"     System        ");

   delay_ms(500);

   LCD_clear();

   LCD_write_str(0,0,"key_1--> +10mA");

   LCD_write_str(0,1,"key_2--> -10mA");

   delay_ms(500);

   LCD_clear();

   LCD_write_str(0,0,"key_3--> choose");

   LCD_write_str(0,1,"key_4--> sure");   

   delay_ms(500);

   LCD_clear();

}

void main()

{

   flag=0;

   port_init();

   LCD_init();

   LCD_clear();

   UI();

   LCD_clear();

      

   LCD_write_str(0,0,"I: 00500 mA");

   LCD_write_str(0,1,"U: 00500 mV");

   

   while(1)

   {

      key_scan();

   }

}


关键字:AVRmeg16  单片机  按键控制  LCD1602  数据显示 引用地址:AVRmeg16单片机实现按键控制LCD1602的数据显示

上一篇:avr频率占空比可调波形输出子函数
下一篇:AVR单片机中断的学习探究(外部中断与内部中断)

推荐阅读

在欧美日等汽车市场非常成熟的国家,二手车备受欢迎,因为这些国家的车辆监控体系非常完善,修理、保养、事故记录全面可靠,消费者用有限的预算就可以购买到一辆配置越级、安全可靠的二手车,购车性价比不言而喻。然而在我国,汽车在生命周期内的使用状况并不能做到实时监控,普通消费者对于二手车的质量问题存疑,有没有出过大事故?有没有泡过水?车身零...
今日,针对有媒体报道称“华为分获电信、移动5G网络建设和设备订单,而联通将华为排除在外”一事,晚间中国联通在官方微博的回应中予以否认,称造谣者“居心不良”。中国联通发布的声明表示,自媒体对中国联通的5G合作与采购颠倒黑白、主观臆断、肆意歪曲、恶意诽谤。这些自媒体为博眼球而毫无底线,中国联通强烈谴责这种居心不良、凭空捏造、滥扣帽子、煽...
7月14日讯,昨日华为公布了2020年上半年财务报告。数据显示,2020年上半年华为的销售收入为4540亿元(人民币,下同),年增13.1%,净利润率9.2%。与第一季(销售收入1822亿元、年增1.4%,净利润率7.3%)相比,华为第二季销售收入2718亿元、季增49%,相较第一季明显成长。消费者业务仍占主要地位华为上半年营运商业务收入1596亿元,企业业务收入36...
7月13日,电连技术发布业绩预告,预计2021年半年度归母净利1.83亿元-1.93亿元,同比增长113.52%-125.22%。而在7月12、13日两个交易日内,电连技术股价暴涨超20%。对于业绩增长的原因,据电连技术表示:1、公司上年同期受新冠肺炎疫情影响,半年度完工订单与销售订单减少,本 报告期新冠疫情基本得以控制,完工订单与销售订单恢复正常增长水平;2、消费电...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved