通过开发板上的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;
}
}
}
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |