STC12C5A60S2(引脚排序及基本功能同AT89S51)作为主控芯片,设计抢答器,利用LCD显示最先按下按键的编号。一是设计LCD1602显示电路,用于显示最先抢答的按键编号;二是设计按键电路,设置总允许按键,当总允许按键按下后可进行抢答。
以下是抢答器的电路设计:
按键电路设计
首先,我们需要设计按键电路,用于检测按键是否被按下。我们可以使用一个8位DIP开关,将其接到P3口上,通过检测P3口的状态来判断按键是否被按下。当按键被按下时,P3口对应的位会变成0,反之为1。
LCD1602显示电路设计
接下来,我们需要设计LCD1602显示电路,用于显示最先抢答的按键编号。我们可以将LCD1602的RS、RW、E、D0-D7引脚分别接到P2口上,通过P2口向LCD发送指令和数据来控制其显示内容。
抢答器程序设计
最后,我们需要编写抢答器的程序,实现如下功能:
1)等待总允许按键被按下,表示抢答开始。
2)当有按键被按下时,判断是否为最先按下的按键,并将其编号显示到LCD上。
3)等待所有按键都被按下后,显示最先抢答的按键编号,并等待一段时间后清空LCD,准备进行下一轮抢答。
下面是STC12C5A60S2的抢答器程序参考代码:
#include<reg52.h>
#include<intrins.h>
#define LCD1602_DB P2
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_E=P2^2;
sbit KEY=P3^0;
unsigned char code table[]="12345678";
unsigned char key;
unsigned char first_key;
unsigned char flag;
void delay(unsigned int i)
{
while(i--);
}
void write_com(unsigned char com)
{
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=com;
LCD1602_E=1;
nop();
LCD1602_E=0;
delay(10);
}
void write_data(unsigned char data)
{
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=data;
LCD1602_E=1;
nop();
LCD1602_E=0;
delay(10);
}
void init_lcd1602()
{
write_com(0x38);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x06);
delay(5);
write_com(0x01);
delay(5);
}
void main()
{
init_lcd1602();
while(1)
{
if(KEY==0&&!flag)
{
first_key=table[0];
write_data(first_key);
flag=1;
}
if(KEY==0&&flag)
{
key=table[0];
if(key<first_key)
{
first_key=key;
write_com(0x80+0x40);
write_data(first_key);
}
}
if(KEY==1&&flag)
{
delay(1000);
write_com(0x01);
flag=0;
}
}
}
注意:上述代码仅供参考,具体实现可能需要根据实际情况进行修改。
以下是LCD1602显示的数字抢答器设计方案:
LCD1602显示电路的原理图如下:
LCD1602显示电路的具体设计步骤如下:
步骤1:将LCD1602模块的VSS引脚连接到GND,将VDD引脚连接到5V电源。
步骤2:将LCD1602模块的VO引脚连接到10K电位器的中间引脚,将10K电位器的两个端口依次连接到GND和5V电源。
步骤3:将LCD1602模块的RS、RW、E引脚分别连接到STC12C5A60S2的P1.0、P1.1、P1.2引脚。
步骤4:将LCD1602模块的D4、D5、D6、D7引脚分别连接到STC12C5A60S2的P2.4、P2.5、P2.6、P2.7引脚。
步骤5:将LCD1602模块的K引脚连接到GND,用于点亮LCD背光。
按键电路的原理图如下:
按键电路的具体设计步骤如下:
步骤1:将总允许按键(SW1)的一端连接到5V电源,另一端连接到STC12C5A60S2的P3.0引脚。
步骤2:将抢答按键(SW2-SWx)的一端分别连接到STC12C5A60S2的P3.1-P3.x引脚,另一端分别连接到GND。
抢答器程序设计的主要流程如下:
步骤1:初始化LCD1602模块,设置光标位置。
步骤2:初始化按键电路,设置总允许按键和抢答按键。
步骤3:当总允许按键按下后,开始抢答。
步骤4:当抢答按键按下后,记录按键编号,显示在LCD上。
以下是抢答器程序设计的代码:
#include <REG51.H>
#include <intrins.h>
#define LCD_RS P1_0
#define LCD_RW P1_1
#define LCD_E P1_2
#define LCD_D4 P2_4
#define LCD_D5 P2_5
#define LCD_D6 P2_6
#define LCD_D7 P2_7
#define SW1 P3_0
#define SW2 P3_1
#define SW3 P3_2
#define SW4 P3_3
#define SW5 P3_4
void delay(unsigned int t)
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<125; j++);
}
void lcd_write_cmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_D4 = cmd >> 4;
LCD_D5 = cmd >> 5;
LCD_D6 = cmd >> 6;
LCD_D7 = cmd >> 7;
LCD_E = 0;
delay(1);
LCD_E = 1;
LCD_D4 = cmd & 0x0f;
LCD_D5 = (cmd & 0x1f) << 1;
LCD_D6 = (cmd & 0x3f) << 2;
LCD_D7 = (cmd & 0x7f) << 3;
LCD_E = 0;
delay(1);
}
void lcd_write_data(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
LCD_D4 = dat >> 4;
LCD_D5 = dat >> 5;
LCD_D6 = dat >> 6;
LCD_D7 = dat >> 7;
LCD_E = 0;
delay(1);
LCD_E = 1;
LCD_D4 = dat & 0x0f;
LCD_D5 = (dat & 0x1f) << 1;
LCD_D6 = (dat & 0x3f) << 2;
LCD_D7 = (dat & 0x7f) << 3;
LCD_E = 0;
delay(1);
}
void lcd_init()
{
lcd_write_cmd(0x33);
lcd_write_cmd(0x32);
lcd_write_cmd(0x28);
lcd_write_cmd(0x0c);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);
delay(10);
}
void lcd_gotoxy(unsigned char x, unsigned char y)
{
unsigned char addr;
if(y==0)
addr = 0x80 + x;
else
addr = 0xc0 + x;
lcd_write_cmd(addr);
}
void lcd_puts(unsigned char *s)
{
while(*s)
lcd_write_data(*s++);
}
unsigned char get_key()
{
if(SW2 == 0)
return 2;
else if(SW3 == 0)
return 3;
else if(SW4 == 0)
return 4;
else if(SW5 == 0)
return 5;
else
return 0;
}
void main()
{
unsigned char key, flag=0;
unsigned char s[4] = " ";
lcd_init();
lcd_gotoxy(0, 0);
lcd_puts("Press any key");
while(SW1);
lcd_gotoxy(0, 0);
lcd_puts(" ");
while(1)
{
if(SW1 == 0 && flag == 0)
{
flag = 1;
key = get_key();
if(key != 0)
{
lcd_gotoxy(0, 1);
s[0] = key + '0';
lcd_puts(s);
while(SW1 == 0);
}
}
else if(SW1 == 1 && flag == 1)
{
flag = 0;
}
}
}
注释说明:
delay()函数:延时函数,用于延时一段时间。
lcd_write_cmd()函数:写入LCD命令。
lcd_write_data()函数:写入LCD数据。
lcd_init()函数:初始化LCD模块。
lcd_gotoxy()函数:设置LCD光标位置。
lcd_puts()函数:显示字符串。
get_key()函数:检测抢答按键是否按下,返回按键编号。
main()函数:主函数,包括LCD初始化、按键检测、抢答记录和LCD显示。