1. 用单片机控制2位数码管,不用锁存器能显示动态扫描码比如说从0到99。如果能程序怎么写
编写一个程序来使用单片机控制2位数码管显示动态扫描码,比如从0到99,确实不需要使用锁存器。下面是一个简单的示例程序:
我们首先定义一个数组来存储每个数字的段码:
char code anxuan[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}
接下来定义一些变量:
char i, j, x; int y;
定义一个函数用于延时:
void yanshi(char shu) { while(shu--) for(x=0; x<110; x++); }
在主函数中,我们设置延时变量:
void main() { y = 30000; while(y--) { for(i = 0; i < 9; i++) { P21 = 1; //如果你用的数码管是共阳极的话,就置1. P0 = anxuan[i]; yanshi(5); P0 = 0x00; } for(j = 0; j < 9; j++) { P20 = 1; P0 = anxuan[j]; yanshi(5); P0 = 0x00; } }}
这个程序使用了动态扫描技术,通过控制P21和P20引脚的状态来切换数码管的显示。每个数字在P0引脚上显示5毫秒。
你可以根据自己的需求调整延时时间和显示的数字范围。希望这个示例对你有所帮助。
请记住,不同的数码管类型(共阳极或共阴极)需要调整相应的引脚设置。如果使用共阴极数码管,P21和P20应该设置为低电平。
如果你对这个方法感兴趣,不妨尝试编写更多的示例程序,以加深对单片机控制数码管的理解。
2. 求用一片74hc595加单片机驱动一个4位数码管的动态扫描程序!!!
下面是595的程序,给你参考一下,根据这个程序来写数码管显示就很简单了。
#define u8 unsigned char
#define u16 unsigned int
sbit MR=P1^6; //寄存器清0,避免数据错位
sbit RCK=P1^5; //并行输出时钟
sbit DS=P1^4; //数据线
sbit CLK=P1^3; //移位输入时钟
void writ_595(u8 dat)
{
u8 i;
MR=0; //寄存器清0,避免数据错位
MR=1;
for(i=0;i<8;i++)
{
CLK=0;
if((dat&0x80) == 0x80)
DS = 1; //串行数据输出
else DS = 0;
CLK=1; //移位输入时钟,上升沿输入
dat<<=1;
}
RCK=0; //并行输出时钟
RCK=1;
} 该子函数可以直接调用,比如writ_595(0xfe);Q0-Q7脚则输出对应的二进制码
3. 求用52单片机实验板实现4*4键盘及数码管动态扫描显示的程序
#include <reg52.h>
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
sbit la=P2^6;
sbit wela=P2^7;
uchar keyscan();
uchar num,temp,num1;
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
num=17;
la=1;
P0=0;
la=0;
wela=1;
P0=0xc0;
wela=0;
while(1)//每次按下都是 所以while循环
{
num1=keyscan();
la=1;
P0=table[num1-1];
la=0;
}
}
uchar keyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0); //必须用if啊
{
delay(5);//消抖再判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //必须用if啊
{
temp=P3;
switch(temp)
{
case 0xee:num=1;break;
case 0xde:num=2;break;
case 0xbe:num=3;break;
case 0x7e:num=4;break;
}
while(temp!=0xf0)// 松手检测 松手数字才变化 必须用while 不松手不显示 不松手下一排键盘没用 一直在while内循环 放在第二个if内
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xed:num=5;break;
case 0xdd:num=6;break;
case 0xbd:num=7;break;
case 0x7d:num=8;break;
}
while(temp!=0xf0)//松手检测 松手数字才变化 必须用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xeb:num=9;break;
case 0xdb:num=10;break;
case 0xbb:num=11;break;
case 0x7b:num=12;break;
}
while(temp!=0xf0)//松手检测 松手数字才变化 必须用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
delay(5);//消抖再判断
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0);
{
temp=P3;
switch(temp)
{
case 0xe7:num=13;break;
case 0xd7:num=14;break;
case 0xb7:num=15;break;
case 0x77:num=16;break;
}
while(temp!=0xf0)//松手检测 松手数字才变化 必须用while
{
temp=P3;
temp=temp&0xf0;
}
}
}
return num;
}
4. 单片机矩阵键盘按键行列逐级扫描法
unsigned char KeyScan(void) //键盘扫描函数,使用行列逐级扫描法{ unsigned char Val; KeyPort=0xf0;//这句其实就是整体看看是否有键按下,四行全送0,有键按下,高四位肯定不为全1 if(KeyPort!=0xf0)//表示有按键按下 { DelayMs(10); //去抖 if(KeyPort!=0xf0) { //表示有按键按下 KeyPort=0xfe; //检测第一行 if(KeyPort!=0xfe) { Val=KeyPort&0xf0; Val+=0x0e; //相当于检测到第一行有键按下,键值=列(高四位)+行(低四位) while(KeyPort!=0xfe); DelayMs(10); //去抖 while(KeyPort!=0xfe); return Val; }
5. 单片机2×2按键扫描程序
单片机2×2按键扫描程序的实现方法如下:
以上代码实现了一个简单的2×2矩阵键盘扫描程序,通过扫描行线和列线的状态来确定哪个按键被按下,并返回相应的按键值。