 
					
				 
					
				 
					
				 
					
				通过开发板上的4 x1 key的S3和S4来控制继电器的吸合与断开,并控开发板的LED12亮与灭:
简单程序:
#include<STC12C5A60S2.H> //头文件
sbit S3 = P3 ^2;
sbit S4 = P3 ^3;
sbit RL1 = P3 ^7;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/
/*********************************************************************************************/
void main (void){ //主程序
 while(1){
      if (S3 == 0)
      {
      DELAY_MS (300);//消抖
      RL1 = 1;
      }
      if (S4 == 0)
      {
      DELAY_MS (300);
      RL1 = 0;
      }
 } 
}
/*********************************************************************************************/
 
					
				4x4键盘实验,LED 数码管显示:
原程序:
#include<STC12C5A60S2.H> //头文件
#include <string.h>
bit flag;
unsigned char leddisplay[] ={0};
sbit speaker = P1^0;
sbit led = P1^3;
#define   KEY   P3 //数据总线
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/
/**********************************************************
蜂鸣器驱动子函数
**********************************************************/
void beep(void)
{
    speaker = 1;   
 DELAY_MS(20);
 speaker = 0; 
 DELAY_MS(20);
}
/**********************************************************
键盘扫描子函数
**********************************************************/
keyscan()
{ 
unsigned char a,b,c;
   KEY = 0x0F;              
   if(KEY!= 0x0F)
   {
       DELAY_MS(125); 
    if(KEY!= 0x0F)
     {
     a = KEY;     
     }
    KEY = 0xF0;     
    c =  KEY;
    a = a|c;
         switch(a){
    case  0xee: b = 0x39;beep();flag=1;break;   //C 
    case  0xed: b = 0x5E;beep();flag=1;break;  //D
    case  0xeb: b = 0x79;beep();flag=1;break;  //E
    case  0xe7: b = 0x71;beep();flag=1;break;  //F
    case  0xde: b = 0x6F;beep();flag=1;break;  //9
    case  0xdd: b = 0x3F;beep();flag=1;break;  //0
    case  0xdb: b = 0x77;beep();flag=1;break;  //A
    case  0xd7: b = 0x7C;beep();flag=1;break;  //B
    case  0xbe: b = 0x6D;beep();flag=1;break;  //5
    case  0xbd: b = 0x7D;beep();flag=1;break;  //6
    case  0xbb: b = 0x07;beep();flag=1;break;  //7
    case  0xb7: b = 0x7F;beep();flag=1;break;  //8
    case  0x7e: b = 0x06;beep();flag=1;break;  //1
    case  0x7d: b = 0x5B;beep();flag=1;break;   //2 
    case  0x7b: b = 0x4f;beep();flag=1;break;  //3
    case  0x77: b = 0x66;beep();flag=1;break;  //4
                        default:flag=0;break;   //
   
   } 
   DELAY_MS(125);  
  }
 return(b);
}
     
/**********************************************************
LED驱动子函数
**********************************************************/
void led_display(void)
{
unsigned char i;
 for(i=0;i<8;i++)
 {  
 P0 = leddisplay[i];
 P2 = i;
 DELAY_MS(2);  
   }
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/   
int main (void)
{
    unsigned char b,i,l=0;
 speaker = 0;
 P0 = 0x00;
    while(1)
 {
     b = keyscan();
  if(flag)
     {
   
     leddisplay[l] = b;
   l=l+1;
   if(l>8)
     {
      leddisplay[8] = b;
      for(i=0;i<8;i++)
        {
        leddisplay[i]= leddisplay[i+1];
     }
      } 
      flag=0;
       }
  led_display();    
 }
}
 
					
				 
					
				 
					
				AT24C02实验程序是参考STC官网的原程序,视频演示的内容为:
1、按S13键,并通过4x3键盘输入8位数(可以是数字,也可以是字母,但最右边四个键为功能键,限制输入,如果在输入过程中有误,需重新输入,则可按S16清除,然后重新输入。);
2、按S15键,将输入的8位数据存入AT24C02中;
3、按S14键,并通过4x3键盘输入8位数;
4、按S15键,如果第3步输入的数字与第1步输入的数字完全一样,则LED数码管显示“good”,并点亮开发板上的LED5,如果不完全一样,则LED数码管显示“Err”,并熄灭开发板上的LED5,可重新步骤3。
参考程序:
#include<STC12C5A60S2.H> //头文件
#include <string.h>
#include <INTRINS.H>
bit flag;
typedef unsigned char BYTE;
typedef unsigned short WORD;
sbit SCL = P1^1;                //AT24C04的时钟
sbit SDA = P1^2;                //AT24C04的数据
BYTE BUF[8]; //数据缓存区
BYTE code WriteDATA[] ={0};
BYTE code  ReadDATA[] ={0};
unsigned char  leddisplay[8] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char gooddisplay[8] ={0x6F,0x5C,0x5C,0x5E,0x00,0x00,0x00,0x00};
unsigned char  errdisplay[8] ={0x79,0x50,0x50,0x00,0x00,0x00,0x00,0x00};
void Delay5us();
void Delay5ms();
void AT24C04_Start();
void AT24C04_Stop();
void AT24C04_SendACK(bit ack);
bit AT24C04_RecvACK();
void AT24C04_SendByte(BYTE dat);
BYTE AT24C04_RecvByte();
void AT24C04_ReadPage();
void AT24C04_WritePage();
sbit speaker = P1^0;
sbit led = P1^3;
#define   KEY   P3 //数据总线
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/
/**********************************************************
LED驱动子函数
**********************************************************/
void led_display(void)
{
unsigned char i;
 for(i=0;i<8;i++)
 {  
 P0 = leddisplay[i];
 P2 = i;
 DELAY_MS(2);  
   }
}
/**********************************************************
蜂鸣器驱动子函数
**********************************************************/
void beep(void)
{
    speaker = 1;   
 DELAY_MS(20);
 speaker = 0; 
 DELAY_MS(20);
}
/**********************************************************
键盘扫描子函数
**********************************************************/
keyscan()
{ 
unsigned char a,b,c;
   KEY = 0x0F;              
   if(KEY!= 0x0F)
   {
       DELAY_MS(125); 
    if(KEY!= 0x0F)
     {
     a = KEY;     
     }
    KEY = 0xF0;     
    c =  KEY;
    a = a|c;
         switch(a){
    case  0xee: b = 0x39;beep();flag=1;break;   //C 
    case  0xed: b = 0x5E;beep();flag=1;break;  //D
    case  0xeb: b = 0x79;beep();flag=1;break;  //E
    case  0xe7: b = 0x71;beep();flag=1;break;  //F
    case  0xde: b = 0x6F;beep();flag=1;break;  //9
    case  0xdd: b = 0x3F;beep();flag=1;break;  //0
    case  0xdb: b = 0x77;beep();flag=1;break;  //A
    case  0xd7: b = 0x7C;beep();flag=1;break;  //B
    case  0xbe: b = 0x6D;beep();flag=1;break;  //5
    case  0xbd: b = 0x7D;beep();flag=1;break;  //6
    case  0xbb: b = 0x07;beep();flag=1;break;  //7
    case  0xb7: b = 0x7F;beep();flag=1;break;  //8
    case  0x7e: b = 0x06;beep();flag=1;break;  //1
    case  0x7d: b = 0x5B;beep();flag=1;break;   //2 
    case  0x7b: b = 0x4f;beep();flag=1;break;  //3
    case  0x77: b = 0x66;beep();flag=1;break;  //4
                        default:flag=0;break;   //
   
   } 
   DELAY_MS(125);  
  }
 return(b);
}
     
/**********************************************************/
/**************************************
向AT24C04写1页(16字节)数据
将TESTDATA开始的16个测试数据写如设备的00~0F地址中
**************************************/
void AT24C04_WritePage()
{
    BYTE i;
    AT24C04_Start();            //起始信号
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
    AT24C04_SendByte(0x00);     //发送存储单元地址
    for (i=0; i<8; i++)
    {
        AT24C04_SendByte(leddisplay[i]);
    }
    AT24C04_Stop();             //停止信号
}
/**************************************
从AT24C04读取1页(16字节)数据
将设备的00~0F地址中的数据读出存放在DATA区的BUF中
**************************************/
void AT24C04_ReadPage()
{
    BYTE i;
    AT24C04_Start();            //起始信号
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
    AT24C04_SendByte(0x00);     //发送存储单元地址
    AT24C04_Start();            //起始信号
    AT24C04_SendByte(0xa1);     //发送设备地址+读信号
    for (i=0; i<8; i++)
    {
        BUF[i] = AT24C04_RecvByte();
        if (i == 8)
        {
            AT24C04_SendACK(1); //最后一个数据需要会NAK
        }
        else
        {
            AT24C04_SendACK(0); //回应ACK
        }
    }
    AT24C04_Stop();             //停止信号
}
/**************************************
延时5微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5us()
{
    BYTE n = 4;
    while (n--)
    {
        _nop_();
        _nop_();
    }
}
/**************************************
延时5毫秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void Delay5ms()
{
    WORD n = 2500;
    while (n--)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}
/**************************************
起始信号
**************************************/
void AT24C04_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}
/**************************************
停止信号
**************************************/
void AT24C04_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}
/**************************************
接收应答信号
**************************************/
bit AT24C04_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
    return CY;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void AT24C04_SendByte(BYTE dat)
{
    BYTE i;
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    AT24C04_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE AT24C04_RecvByte()
{
    BYTE i;
    BYTE dat = 0;
    SDA = 1;                    //使能内部上拉,准备读取数据
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    return dat;
}
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/   
int main (void)
{
    unsigned char a=1,b,i,j,m,k=1,l=0;
 speaker = 0;
 P0 = 0x00;
    while(1)
 {
     b = keyscan();
  if(flag)
     {
   if(b==0x39)
   {
     for(i=0;i<8;i++)
      {
      leddisplay[i]= 0x08;
   }
     flag=0;
     do{
         b = keyscan();
       if(flag && b!=0x39 && b!=0x5e && b!=0x79 && b!=0x71)
        {
        leddisplay[l] = b;
        l=l+1;
      if(l>8)
        {
         leddisplay[8] = b;
         for(i=0;i<8;i++)
           {
           leddisplay[i]= leddisplay[i+1];
        }
         } 
         flag=0;
          }
      if(b==0x71)
      {
         for(i=0;i<8;i++){
                 leddisplay[i]= 0x08;}
       l=0;
       flag=0;
      }
           led_display();
    }while( b!=0x79);
   AT24C04_WritePage();
   P0 = 0x00;
   flag=0;
    }
  if(b==0x5e)
   { 
    for(i=0;i<8;i++)
      {
      leddisplay[i]= 0x08;
   }
     flag=0; 
           l=0;
     do{
         b = keyscan();
       if(flag && b!=0x39 && b!=0x5e && b!=0x79 && b!=0x71)
        {
        leddisplay[l] = b;
        l=l+1;
      if(l>8)
        {
         leddisplay[8] = b;
         for(i=0;i<8;i++)
           {
           leddisplay[i]= leddisplay[i+1];
        }
         } 
         flag=0;
          }
      if(b==0x71)
      {
         for(i=0;i<8;i++){
                 leddisplay[i]= 0x08;}
       l=0;
       flag=0;
      }
         led_display();
    }while( b!=0x79);
   flag=0;
   k=0;
      AT24C04_ReadPage();
            for(m=0;m<8;m++)
    {
      if(BUF[m]==leddisplay[m])
      {
        k++;
      }
    }
    if(k==8)
     {led=0;
      for(i=0;i<8;i++){
                leddisplay[i] = gooddisplay[i];}
     }
    if(k!=8)
     {
         led=1;
      for(j=0;j<8;j++){
                leddisplay[j] = errdisplay[j];}
     }
           do{
        b=keyscan();
        led_display();
    }while(b!=0x5e);
   flag=0;
   P0=0x00;
      }
       }      
 }
}
回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |

 
					
				 
			
			
			
						
			 ,拍得不好,不好意思自荐。。。
,拍得不好,不好意思自荐。。。										 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

