基于stc15f2k60s2,设计完整具体程序,实现当按下ADC分压键盘时,将相应的键号(01-16)通过两片具有SPI接口的74HC595芯片驱动最右端两个7段数码管显示,其余6个数码管关闭。
时间: 2024-03-16 17:44:03 浏览: 20
好的,我可以帮您解答这个问题。基于stc15f2k60s2,实现按下ADC分压键盘时,将相应的键号(01-16)通过两片具有SPI接口的74HC595芯片驱动最右端两个7段数码管显示,其余6个数码管关闭,具体程序如下:
```c
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
sbit ADC_IN = P1^2;
sbit KEY_IN1 = P3^4;
sbit KEY_IN2 = P3^5;
uchar code LED_TBL[17] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00};
void delayms(uint ms)
{
uint i, j;
for(i=0; i<ms; i++)
for(j=0; j<110; j++);
}
void Write_595(uchar dat)
{
uchar i;
for(i=0; i<8; i++)
{
if(dat & 0x80)
P2 |= 0x02; // MOSI = 1
else
P2 &= ~0x02; // MOSI = 0
P2 |= 0x01; // SCLK = 1
P2 &= ~0x01; // SCLK = 0
dat <<= 1;
}
}
void Display(uchar num1, uchar num2)
{
uchar i;
P2 &= ~0x08;
for(i=0; i<2; i++)
{
Write_595(LED_TBL[num2]);
Write_595(LED_TBL[num1]);
}
P2 |= 0x08;
}
uchar Key_Scan()
{
uchar key_val = 0;
KEY_IN1 = 0;
if(KEY_IN2 == 0)
{
delayms(10);
if(KEY_IN2 == 0)
{
key_val = 1;
while(!KEY_IN2);
}
}
KEY_IN1 = 1;
KEY_IN2 = 0;
if(KEY_IN1 == 0)
{
delayms(10);
if(KEY_IN1 == 0)
{
key_val = 2;
while(!KEY_IN1);
}
}
KEY_IN2 = 1;
return key_val;
}
void main()
{
uchar key_val = 0;
P2 = 0x00;
while(1)
{
if(ADC_IN == 0)
{
key_val = Key_Scan();
if(key_val)
{
Display(key_val, 0);
}
while(!ADC_IN);
}
else
{
P2 &= ~0x08;
Write_595(0x00);
Write_595(0x00);
P2 |= 0x08;
}
}
}
```
代码中用到了SPI接口的74HC595芯片,通过Write_595函数将数据写入芯片中,实现数码管的显示。Key_Scan函数用于键盘扫描,当检测到按键按下时,返回相应的键号。在主函数中,通过ADC_IN检测键盘是否按下,如果按下则调用Key_Scan函数获取键号,然后调用Display函数显示在数码管上。如果没有按下,则关闭数码管。
注意,此代码仅供参考,具体实现还需要根据硬件电路进行调整。