51单片机+lcd12864液晶屏菜单程序

发布者:Tianyun2021最新更新时间:2015-06-26 来源: 51hei关键字:51单片机  lcd12864  液晶屏菜单 手机看文章 扫描二维码
随时随地手机看文章
这个是主界面


这个是主菜单界面


这个是设置时间的子界面


这个是设置日期


设置背景光


这是设置了按键音和闹铃以后,主界面出现状态标志

 


闹铃的界面,喇叭出现铃声。


生日倒计时提醒功能。

 

全部完整的源代码下载:http://www.51hei.com/bbs/dpj-20391-1.html
process.h文件:
/*------------------------------------
名称:菜单处理模块
编写:YuMin_Dong
时间:2013.01.24
------------------------------------*/
#ifndef _PROCESS_H_
#define _PROCESS_H_

bit Menu_Flag;//设置画面显示标志
 
bit FanHui1;//是否退出主菜单标签
bit Refresh_SetTime; //设置了时间需要刷新显示置位改表现
bit Menu1,Menu2,Menu3,Menu4,Menu5,Menu6,Enter_Menu; //Menu0定义在LCD12864.H中了,因为显示时间函数重复利用了.
//UINT8 MenuKey_Count;    //菜单键按下的次数
//UINT8 fen,shi,miao;//秒表功能用
bit Again;   //为了静态显示定义该标志,在子菜单下,第一次进入显示一次界面然后在不修改前不会去刷新它
//bit Speaker_Flag;   //按键音标志
bit Set_Bright,Set_Speaker;  //亮灭背景光和按键开关选项标志


bit Bell_Flag;
bit Menu1_Flag,Menu2_Flag;

/*------------------------------------
   按键控制位定义
------------------------------------*/
sbit KEY_MENU=P3^2; //选择键,调用中断,及时性
sbit KEY_UP=P0^0;  //上调
sbit KEY_DOWN=P0^1;  //下调
sbit KEY_ENTER=P0^2; //确定

sbit SPEAKER=P2^7;  //驱动喇叭位

sbit BRIGHT=P0^7; //背光控制位

[page]


/*------------------------------------
   主界面处理
------------------------------------*/
void MainMenu_Pro()
{
  if(guide!=guide_old) //箭头位和之前的不同的话证明按键了,刷新显示
  {
  LCD_RefreshMenu();  //刷新菜单显示
  guide_old=guide;  //LCD静态显示,不然快速刷屏不好看
  LCD_WriteCommand(0x30); //修正回一般指令模式
  LCD_WriteCommand(0x82);
  LCD_SendString("功能菜单");//菜单标题
  }
   if(!KEY_DOWN)  //
   {
   DelayMs(10);
    if(!KEY_DOWN)
    {
    TR1=1;
    while(!KEY_DOWN)
    ;
    if(guide     guide++;
    TR1=0;
    }
   }
   
   else if(!KEY_UP)
   {
   DelayMs(10);
    if(!KEY_UP)
    {
    TR1=1;
    while(!KEY_UP)
    ;
    if(guide>0)
    guide--;
    TR1=0;
    }
   }
   
   else if(!KEY_ENTER)
    {
    DelayMs(10);
     if(!KEY_ENTER)
     {
     TR1=1;
     while(!KEY_ENTER)
     ;
      switch(guide)
      {
      case 0: Menu0=1;Enter_Menu=1;break;
      case 1: Menu1=1;Enter_Menu=1;break;
      case 2: Menu2=1;Enter_Menu=1;break;
      case 3: Menu3=1;Enter_Menu=1;break;
      case 4: Menu4=1;Enter_Menu=1;break;
      case 5: Menu5=1;Enter_Menu=1;break;
      case 6: FanHui1=1;Menu_Flag=0;guide=0;
        LCD_WriteCommand(0x01);break;  //轮询到有enter键,当guide指向返回时候直接去掉FanHui1控制的父菜单循环
      default:return;
      }
     TR1=0;
     }
    }
}

/*------------------------------------
  Menu0设置时间子菜单处理
------------------------------------*/
void Menu0_Pro()
{
UINT8 temp;
  if(!Again)
  {
  LCD_ClearGDRAM();
  Set_Hour=1;   //第一次进入时候直接显示调小时位
  Again=1;   //执行一次的标置置高,表明运行到该if条件下不执行下面语句
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("设置时间:");
  LCD_WriteCommand(0x98);
  LCD_SendString("ENTER 键保存修改");
  DS1302_ReadTime();
  Second=0;
  }
  
  if(Refresh_SetTime)   //当调节了刷新显示
  {
  Refresh_SetTime=0;
  Display_Time();
  //Display_SetTime();
  }
  
  if(!KEY_UP)
  {
  DelayMs(10);
   if(!KEY_UP)
   {
   TR1=1;
   //Refresh_SetTime=1;
   while(!KEY_UP);
   TR1=0;
    if(Set_Hour)
    {
    temp=Hour/16;   //这里需要进行BCD数到十进制数的转换
    Hour=Hour%16+temp*10;
     if(Hour<23)
     Hour++;
     else Hour=0;
    temp=Hour/10;   //转换完以后再转换会BCD数
    Hour=Hour%10+temp*16;
     //Display_Time();
    }
    else
    {
    temp=Minute/16;
    Minute=Minute%16+temp*10;
     if(Minute<59)
     Minute++;
     else Minute=0;
    temp=Minute/10;
    Minute=Minute%10+temp*16;
    }
    //Display_Time();
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_DOWN)
  {
  DelayMs(10);
   if(!KEY_DOWN)
   {
   TR1=1;
   //Refresh_SetTime=1;
   while(!KEY_DOWN);
   TR1=0;
    if(Set_Hour)
    {
    temp=Hour/16;
    Hour=Hour%16+temp*10;
     if(Hour>0)
     Hour--;
     else Hour=23;
    temp=Hour/10;
    Hour=Hour%10+temp*16;
     //Display_Time();
    }
    else
    {
    temp=Minute/16;
    Minute=Minute%16+temp*10;
     if(Minute>0)
     Minute--;
     else Minute=59;
    temp=Minute/10;
    Minute=Minute%10+temp*16;
     
    }
   //Display_Time();
   Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
    Enter_Menu=0;
    Menu0=0;
    guide_old++;
    Again=0;
    guide=0;
    Set_Hour=0;
    //Set_Minute=0;
    DS1302_WriteTime();
    LCD_ClearGDRAM();
    }
   }
  

}

/*------------------------------------
  Menu1设置日期子菜单处理
------------------------------------*/
void Menu1_Pro()
{
UINT8 temp;
  if(!Again)
  {
  LCD_ClearGDRAM();
  Set_Date=0;
  Again=1;
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("设置日期:");
  LCD_WriteCommand(0x98);
  LCD_SendString("ENTER 键保存修改");
  DS1302_ReadDate();
  }
  
  if(Menu1_Flag)    //每次Menu1下最少轮询5个if条件,最7多个if.实验证明,能带得了,效果还行
  {
  Menu1_Flag=0;
  //Refresh_SetTime=1;
  Set_Date++;
  }
  
  if(Set_Date>2)
  Set_Date=0;
  
  if(Refresh_SetTime)   //当调节了刷新显示
  {
  Refresh_SetTime=0;
  Display_SetDate();
  }
  
  if(!KEY_UP)
  {
  DelayMs(10);
   if(!KEY_UP)
   {
   TR1=1;
   while(!KEY_UP);
   TR1=0;
    if(Set_Date==0)
    {
    temp=Year/16;
    Year=Year%16+temp*10;
     if(Year<99)
     Year++;
     else Year=0;
    temp=Year/10;
    Year=Year%10+temp*16;
    }
    else if(Set_Date==1)
    {
    temp=Month/16;
    Month=Month%16+temp*10;
     if(Month<12)
     Month++;
     else Month=1;
    temp=Month/10;
    Month=Month%10+temp*16;
    }
    
    else if(Set_Date==2)
    {
    temp=Date/16;
    Date=Date%16+temp*10;
     if(Date<31)
     Date++;
     else Date=1;
    temp=Date/10;
    Date=Date%10+temp*16;
    }
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_DOWN)
  {
  DelayMs(10);
   if(!KEY_DOWN)
   {
   TR1=1;
   while(!KEY_DOWN);
   TR1=0;
    if(!Set_Date)
    {
    temp=Year/16;
    Year=Year%16+temp*10;
     if(Year>0)
     Year--;
     else Year=99;
    temp=Year/10;
    Year=Year%10+temp*16;
    }
    else if(Set_Date==1)
    {
    temp=Month/16;
    Month=Month%16+temp*10;
     if(Month>1)
     Month--;
     else Month=12;
    temp=Month/10;
    Month=Month%10+temp*16;
    }
    
    else if(Set_Date==2)
    {
    temp=Date/16;
    Date=Date%16+temp*10;
     if(Date>1)
     Date--;
     else Date=31;
    temp=Date/10;
    Date=Date%10+temp*16;
    }
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
    Enter_Menu=0;
    Menu1=0;
    guide_old++;
    Again=0;
    //guide=0;
    //Set_Hour=0;
    //Set_Minute=0;
    DS1302_WriteDate();
    LCD_ClearGDRAM();
    }
   }
  

}

/*------------------------------------
  Menu2闹铃功能
------------------------------------*/
void Menu2_Pro()
{
UINT8 temp;
  if(!Again)
  {
  LCD_ClearGDRAM();
  Set_Bell=0;
  //Set_Hour=1;   //第一次进入时候直接显示调小时位
  Again=1;   //执行一次的标置置高,表明运行到该if条件下不执行下面语句
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("设置闹铃:");
  LCD_WriteCommand(0x98);
  LCD_SendString("  开启      关闭");
  }
  
  if(Menu2_Flag)
  {
  Menu2_Flag=0;
  Set_Bell++;
  Refresh_SetTime=1;
  } 
  
  if(Set_Bell>3)
  Set_Bell=0;
  
  
  if(Refresh_SetTime)   //当调节了刷新显示
  {
  Refresh_SetTime=0;
  Display_Bell();
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x98);
  LCD_SendString("  ");
  LCD_WriteCommand(0x9d);
  LCD_SendString("  ");
   if(Set_Bell>1)
   {
    if(Set_Bell==2)
    LCD_WriteCommand(0x98);
    else
    LCD_WriteCommand(0x9d);
   LCD_DisplayCGRAM(1);
   }
  }
  
  if(!KEY_UP)
  {
  DelayMs(10);
   if(!KEY_UP)
   {
   TR1=1;
   while(!KEY_UP);
   TR1=0;
    if(Set_Bell==0)
    {
     if(Bell_Hour<23)
     Bell_Hour++;
     else Bell_Hour=0;
    }
    else if(Set_Bell==1)
    {
     if(Bell_Minute<59)
     Bell_Minute++;
     else Bell_Minute=0;
    }
    Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_DOWN)
  {
  DelayMs(10);
   if(!KEY_DOWN)
   {
   TR1=1;
   while(!KEY_DOWN);
   TR1=0;
    if(Set_Bell==0)
    {
     if(Bell_Hour>0)
     Bell_Hour--;
     else Bell_Hour=23;
    }
    else if(Set_Bell==1)
    {
     if(Bell_Minute>0)
     Bell_Minute--;
     else Bell_Minute=59;
     
    }
   Refresh_SetTime=1;
   }
  }
  
  else if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
    Enter_Menu=0;
    Menu2=0;
    guide_old++;
    Again=0;
    
    //将闹钟时转换BCD以方便和ds1302读出的数据比较
    temp=Bell_Hour/10; Bell_Hour=Bell_Hour%10+temp*16;
    temp=Bell_Minute/10; Bell_Minute=Bell_Minute%10+temp*16;
    
    if(Set_Bell==2)
    Bell_Flag=1;
    else Bell_Flag=0;
    LCD_ClearGDRAM();
    }
   }
}

/*------------------------------------
  Menu3背光功能
------------------------------------*/
void Menu3_Pro()
{
 if(!Again)
 {
 LCD_ClearGDRAM();   //LCD清屏幕
 Again=1;     //表明这个分支每次进入者只执行一次
 //Set_Bright=0;
 Refresh_SetTime=1;
 LCD_WriteCommand(0x30);
 LCD_WriteCommand(0x80);
 LCD_SendString("背景光开关设置:");
 LCD_WriteCommand(0x90);
 LCD_SendString("  开      关");
 LCD_WriteCommand(0x98);
 LCD_SendString("ENTER 键保存修改");
 }
  
  if(Refresh_SetTime)   //当调节了刷新显示
  {
  Refresh_SetTime=0;
   if(Set_Bright)
   {
   LCD_WriteCommand(0x94);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x90);
   LCD_SendString("  ");
   }
   else 
   {
   LCD_WriteCommand(0x90);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x94);
   LCD_SendString("  ");
   }
  }
  
   if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
     if(Set_Bright) BRIGHT=0;
     else BRIGHT=1;
     
    Enter_Menu=0;
    Menu3=0;
    guide_old++;
    Again=0;
    LCD_ClearGDRAM();
    }
   }
}

/*------------------------------------
  Menu4按键音功能
------------------------------------*/
void Menu4_Pro()
{
  if(!Again)
  {
  LCD_ClearGDRAM();
  Again=1;
  //Set_Speaker=0;
  Refresh_SetTime=1;
  LCD_WriteCommand(0x30);
  LCD_WriteCommand(0x80);
  LCD_SendString("按键开关设置:");
  LCD_WriteCommand(0x90);
  LCD_SendString("  开      关");
  LCD_WriteCommand(0x98);
  LCD_SendString("ENTER 键保存修改");
  }
  
  if(Refresh_SetTime)   //当调节了刷新显示
  {
  Refresh_SetTime=0;
   if(Set_Speaker)
   {
   LCD_WriteCommand(0x94);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x90);
   LCD_SendString("  ");
   }
   else 
   {
   LCD_WriteCommand(0x90);
   LCD_DisplayCGRAM(1);
   LCD_WriteCommand(0x94);
   LCD_SendString("  ");
   }
  }
  
   if(!KEY_ENTER)
   {
   DelayMs(10);
    if(!KEY_ENTER)
    {
    TR1=1;
    while(!KEY_ENTER);
    TR1=0;
     if(Set_Speaker) ET1=0;
     else ET1=1;
     
    Enter_Menu=0;
    Menu4=0;
    guide_old++;
    Again=0;
    //guide=0;
    LCD_ClearGDRAM();
    }
   }
  

}

/*------------------------------------
  Menu5生日提醒功能
------------------------------------*/
void Menu5_Pro()
{
UINT16 temp;
LCD_ClearGDRAM();
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x80);
LCD_SendString("距我生日还有:");
LCD_WriteCommand(0x88);
LCD_SendString("距洋洋生日还有:");
temp=Month/16;
Month=Month%16+temp*10;

temp=Date/16;
Date=Date%16+temp*10;

 switch(Month)
 {
 case 1: temp=249-Date;break;
 case 2: temp=218-Date;break;
 case 3: temp=190-Date;break;
 case 4: temp=159-Date;break;
 case 5: temp=129-Date;break;
 case 6: temp=98-Date;break;
 case 7: temp=67-Date;break;
 case 8: temp=37-Date;break;
 case 9: if(Date<=6) temp=6-Date;
   else temp=365-30+Date;break;
 case 10:temp=(31-Date)+334;break;
 case 12:temp=(30-Date)+304;break;
 default: return;
 } 

 if(!(Year%0x4))
 temp+=1;

LCD_WriteCommand(0x06);
LCD_WriteCommand(0x90);
LCD_WriteData(temp/100|0x30);
LCD_WriteData(temp%100/10|0x30);
LCD_WriteData(temp%10|0x30);
temp+=12;
LCD_WriteCommand(0x98); 
LCD_WriteData(temp/100|0x30);
LCD_WriteData(temp%100/10|0x30);
LCD_WriteData(temp%10|0x30);
LCD_WriteCommand(0x93);
LCD_SendString("天");
LCD_WriteCommand(0x9b);
LCD_SendString("天");
 while(Menu5)
 {
  if(!KEY_ENTER)
  {
  DelayMs(10);
   if(!KEY_ENTER)
   {
   TR1=1;
   while(!KEY_ENTER);
   TR1=0;
   Menu5=0;
   LCD_ClearGDRAM();
   Enter_Menu=0;
   guide_old++;
   }
  }
 }
DS1302_ReadDate();
}

#endif

关键字:51单片机  lcd12864  液晶屏菜单 引用地址:51单片机+lcd12864液晶屏菜单程序

上一篇:单片机驱动ds18b20用12864液晶显示温度程序
下一篇:旋转LED灯原理和应用

推荐阅读最新更新时间:2024-03-16 14:05

采用AT89C51单片机设计的变频调速控制系统
   1.概述   在电气传动领域中,随着自关断器件技术水平的不断提高,脉宽调制技术(简称PWM技术)也日趋成熟。PMW交流变频调速以其高效率、高功率因数、输出波形好、结构简单等优点,在井下风机、水泵、造纸机等设备中得到了广泛的应用。将单片机应用于交流变频调速系统,可有效地避免传统调速方案中的一些缺点,达到了提高控制精度的目的 ,其特点:   (1)采用单片机可以使绝大多数控制逻辑通过软件实现,简化了电路。   (2)单片机具有更强的逻辑功能,运算速度快,精度高,有大容量的存储单元,可以实现较为复杂的控制。   (3)无零点漂移,控制精度高。   (4)可以提供人机界面,多机连网工作。   根据国内外有关变频调速的最新
[单片机]
采用AT89C<font color='red'>51单片机</font>设计的变频调速控制系统
Labview与C51单片机实现串口通信
Labview串口通信学会两种方法,一种是利用visa(虚拟仪器软件构架),另一种是调用activeX控件。 第一种方法(VISA)程序如图 首先,设置串口参数,串口初始化,循环内利用VISA WITE实现对串口的写操作,延时200毫秒,用VISA READ实现读操作,中间有个端口属性节点的作用是计算端口的总的字节数。非常简单,但我花了一天时间搞懂。 第二种方法 调用active X 程序图如下所示 ACTIVE X串口通信的最大优点是可以利用中断实现数据的传送或对下位机的控制,MSCOMM32控件实现串口通信主要是通过对其属性节点的设置来实现的。并利用到了事件回调方法实现中断程序。
[单片机]
C51单片机学习笔记之中断系统
简介 什么是中断 在CPU 运行主程序时,暂停去处理别的程序,然后再回来处理主程序,这就是中断。 中断源 共8个,外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3。 中断寄存器 ps:优先级从高到低。 TCON寄存器 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。 TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作 IE0(IE1)——外部中断请求标志位 IT1(IT0)——外部中断触发方式选择位 IE寄存器 EA:中断的总开关,E
[单片机]
C<font color='red'>51单片机</font>学习笔记之中断系统
MCS-51单片机指令系统“读-改-写”方式指令
51 单片机有四个 8 位的并行接口。由于内部结构的特点,并行接口在输出 0、1 的时候,能力是不一样的。输出 0 的时候,能力较强,但输出 1 的时候,能力就很差了,而 P0 口,则要外接上拉电阻才能输1。 单片机从端口读入数据的通道有两个,一个是从锁存器引入,一个是从输出引脚处引入,分别叫做“读锁存器”和“读引脚”。单片机在进行端口输出时,经常要参考其上一次的输出状态。 Example:使一个LED灯闪烁。编程序时需要从输出引脚读前一次的输出状态,然后将其求反输出。如果上次是输出“1”使LED点亮,这时候虽然端口上输出逻辑是“1”,但是由于LED的二极管作用将输出高电平拉至“0”电平(0.7V左右),通过引脚读进来就是
[单片机]
分析C51单片机的一些误区和注意事项
简介:常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。 1) C忌讳绝对定位。常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x, 你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。 2) 设
[单片机]
51单片机】1602 CGRAM、CGROM及DDRAM的作用
CGRAM : 允许用户自建字模区的空间。从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零(表上的高位)。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。 CGROM : 字模存储用空间。你要显示某个ASCII字符时,要显示字符的字模就存在这里。 DDRAM : 显示用RAM。直接和屏幕上的点相对应。屏幕上的一个点和DDRA
[单片机]
【<font color='red'>51单片机</font>】1602 CGRAM、CGROM及DDRAM的作用
51单片机使用printf函数带参数打印不正常的解决办法
本人在调试STC8A8K64S4单片机时遇到一个很奇葩的问题,使用printf函数打印一个带参数的调试信息时出现异常,具体表现定义了8位的变量使用%X格式打印出的值却变成了16位,且赋值为0后任然打印出16位的随即数值。由于之前使用stm32单片机一直使用printf打印没有出现过类似情况,因此没有怀疑是函数问题而是怀疑是否为单片机某处寄存器设置错误。在看了很久手册之后没发现问题,最后自己写了一个带参数打印的函数发现数值没有错误。由于项目匆忙未继续深入探究原因,只能初步断定在51单片机使用printf函数带参数打印时数值不正常。 当然使用printf带参数打印调试是非常方便的,因此我尝试使用sprintf先将参数装到一个buf
[单片机]
详解80C51单片机的复位电路和时钟电路
复位电路 在80C51中,最常见的复位电路就是下图的上电复位电路。 它能有效地实现上电复位和手动复位。RST引脚高电平有效。 其有效时间应持续24个振荡周期以上才能完成复位操作。若使用6MHz晶振,则需持续4us以上才能完成复位操作。 在通电瞬间,由于RC电路的充电过程,在RST端出现一定宽度的正脉冲,只要正脉冲保持10mS以上,就能使单片机自动复位。 CPU在第二个及其周期内执行内部复位操作,以后每个机器周期重复一次,直至RST端电平变低。 在单片机复位器件,ALE和~PSEN信号都不产生。复位操作将对部分专用寄存器产生影响,复位后,这些内部寄存器的状态发生变化,如下表。 时钟电路 在80C51单片机内有一个高增益的反
[单片机]
详解80C<font color='red'>51单片机</font>的复位电路和时钟电路
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved