if(8==j) j=0;
错在这里改if(j==8){j=0;}还有就是你的程序也有问题,程序运行时P0=0x01的情况不会出现,因为P0=0x01<<(j++);后进入switch的P0只会从0x02开始~粗心了吧~还有就是你用的什么数码管?不是用的那种共阳、共阴8位数据端的数码管?是8421那种?下面修改后的程序(数码管采用的是共阳的数码管)#include <reg51h>#define uchar unsigned charuchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
main()
{
int i;
char j=0;
while(1)
{
switch(P0)
{
case 0x01: P2=led[0];break;
case 0x04: P2=led[1];break;
case 0x02: P2=led[2];;break;
case 0x08: P2=led[3];;break;
case 0x10: P2=led[4];;break;
case 0x40: P2=led[5];;break;
case 0x20: P2=led[6];;break;
case 0x80: P2=led[7];;break;
}
for(i=0;i<10000;i++);//延时时间随意写的
if(j<7) {j++;P0=0x01<<j;}else{P0=0x01;j=0;}
}
}
如果还有问题~就留给邮箱~我发仿真和程序给你~上面的程序是随手打的~可能有错哈~不过思路是对的~
#include<reg52h>
//52系列单片机头文件
#define
uchar
unsigned
char
//宏定义
#define
uint
unsigned
int
sbit
dula=P2^6;
//申明u1锁存器的锁存端
sbit
wela=P2^7;
//
u2
uchar
num1,num2;
uchar
code
table[]={
//数组定义
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar
code
aable[]={
//位选数组定义
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void
delays(uint);
//子函数申明
void
main()
{
while(1)
{
for(num1=0;num1<48;num1++)
//6个数循环显示
{
wela=1;
//打开u2锁存端
P0=aable[num1%6];
//送入位选信号
wela=0;
//关闭u2锁存端
//
delays(1);
dula=1;
//打开u1锁存端
P0=table[num1%16];
//送入段选信号
dula=0;
//关闭u1锁存端
delays(1);
}
}
}
/---------主函数-----------------------------------------------/
void
delays(uint
xs)
{
uint
i,j,k;
for(i=xs;i>0;i--)
for(j=1000;j>0;j--)
for(k=110;k>0;k--);
}
/----------------延时程序-----------------------------------------------/
以下是使用51单片机(如STC89C52)和4个开关来控制数码管显示一位密码的简单示例代码。假设使用的是共阴数码管,并且数码管的引脚连接到了单片机的P0口。
#include <reg52h> // 引入单片机寄存器定义头文件// 数码管显示的密码模式,共16种,每种模式使用4位二进制表示unsigned char password[16] = { 0x3F, // 0b00111111, 模式0
0x06, // 0b00000110, 模式1
0x5B, // 0b01011011, 模式2
0x4F, // 0b01001111, 模式3
0x66, // 0b01100110, 模式4
0x6D, // 0b01101101, 模式5
0x7D, // 0b01111101, 模式6
0x07, // 0b00000111, 模式7
0x7F, // 0b01111111, 模式8
0x6F, // 0b01101111, 模式9
0x77, // 0b01110111, 模式10
0x7C, // 0b01111100, 模式11
0x39, // 0b00111001, 模式12
0x5E, // 0b01011110, 模式13
0x79, // 0b01111001, 模式14
0x71 // 0b01110001, 模式15};void main() { unsigned char i = 0; // 密码模式的索引
while (1) { // 读取四个开关的状态,每个开关对应一个二进制位
unsigned char switchValue = (P1 & 0x0F); // 根据开关状态选择密码模式
i = switchValue; // 设置数码管显示的密码模式
P0 = password[i]; // 简单延时
for (unsigned int j = 0; j < 1000; j++);
}
}
以上代码通过读取四个开关(连接到P1口的低4位)的状态来选择密码模式,并将选择的密码模式通过P0口设置到数码管上显示。
#include<reg52h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
count;
uint
disnum;
sbit
dula=P2^6;
sbit
wela=P2^7;
uchar
code
tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
display(uchar,uchar,uchar);
delay(uchar);
void
main()
{
EA=1;
ET1=1;
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(1)
{
if(count==20)
{
count=0;
//
if(disnum==1000)
//
disnum=0;
disnum++;
}
display(disnum/100,disnum%100/10,disnum%100%10);
}
}
void
tim1()
interrupt
3
using
3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
}
display(uchar
bai,uchar
shi,uchar
ge)
{
P0=tabledu[bai];
dula=1;
dula=0;
P0=0xfe;
wela=1;
wela=0;
delay(1);
P0=tabledu[shi];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(1);
P0=tabledu[ge];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(1);
}
delay(uchar
x)
{
uchar
a,b;
for(a=x;a>0;a--)
for(b=255;b>0;b--);
}
//你自己看一下,有不对的就改点别忘了给分啊
以上就是关于请教单片机控制数码管显示数字C语言程序问题,满意加分全部的内容,包括:请教单片机控制数码管显示数字C语言程序问题,满意加分、51单片机数码管显示程序、51单片机,利用0和1两个数字组成16种模式,并用四个开关控制数码显示一位密码求程序设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)