51单片机,写程序,用独立键盘让数码管一个接一个亮 10

P1^0--P1^5接独立键盘,分别代表数字0到5在数码管上显示。P0口数码管段选,P2口数码管位选。当按下一个键时,在数码管第一位显示这个数字,按下另外一个键时,在第二... P1^0--P1^5 接独立键盘,分别代表数字0到5在数码管上显示。P0口数码管段选,P2口数码管位选。当按下一个键时,在数码管第一位显示这个数字,按下另外一个键时,在第二位数码管显示另外键代表的数字,同时,第一位数码管的数字也显示。以此类推,当按完六个数字时,不管怎么按,数码管数字不再改变,保持现状。 展开
 我来答
院里小佳人851
2011-08-09 · TA获得超过5.4万个赞
知道大有可为答主
回答量:3.8万
采纳率:0%
帮助的人:5746万
展开全部
#include <c8051f020.h>
//------------------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------------
#define SYSCLK 2000000 //系统工作频率
#define PORTA 0x8000 //c8051f020 A口地址
#define PORTB 0x8001 //c8051f020 B口地址
#define PORTC 0x8002 // c8051f020 C口地址
#define PORTCON 0x8003 // c8051f020 控制口地址
//------------------------------------------------------------------------------------
// 函数定义
//------------------------------------------------------------------------------------
void PORT_Init (void);
//------------------------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------------------------
void main (void)
{
unsigned int i;
unsigned char j,k;
unsigned char xdata * Pointm;

WDTCN = 0xde; //禁止看门狗定时器
WDTCN = 0xad;
PORT_Init ();
Pointm=PORTCON;
*Pointm=0x80; //B口输出,C口输出 A口不用
while(1) //循环显示
{
for(j=0;j<11;j++)
{ if( j==0x00)
k=0x06;
else if(j==0x01)
k=0x5b;
else if(j==0x02)
k=0x4f;
else if (j==0x03)
k=0x66;

else if(j==0x04)
k=0x6d;

else if ( 0x05)
k=0x7d;

else if(j==0x06)
k=0x07;

else if(j==0x07)
k=0x7f;

else if(j==0x08)
k=0x6f;

else if(j==0x09)
k=0x3f;

else
k=0x80;//显示dp(即。)
}
Pointm=PORTB;// B口存放字位码
*Pointm=0x01;//从左边第一位数码管开始显示数字
Pointm=PORTC; //C口存放字形码
*Pointm=k; //显示K中存放的字形码
for(i=0;i<=36000;i++); //延时
Pointm=PORTB;
*Pointm=0x02; //左边第二位数码管开始显示数字
for(i=0;i<=36000;i++);
Pointm=PORTB;
*Pointm=0x04; //左边第三位数码管开始显示数字
for(i=0;i<=36000;i++);
Pointm=PORTB;
*Pointm=0x08; //左边第四位数码管开始显示数字
for(i=0;i<=36000;i++);
Pointm=PORTB;
*Pointm=0x10; //左边第五位数码管开始显示数字
for(i=0;i<=36000;i++);
Pointm=PORTB;
*Pointm=0x20; //左边第六位数码管开始显示数字
for(i=0;i<=36000;i++);
}
}

//------------------------------------------------------------------------------------
//函数名称: PORT_Init ()
//函数功能: 通用I/O口及交叉开关初始化
//入口参数: 无
//出口参数: 无
//全局变量引用: 无
//调用模块: 无
//------------------------------------------------------------------------------------
void PORT_Init (void)
{
XBR2 = 0x40; // 使能交叉开关
P74OUT |= 0xff; // P5、P6、P7设为推挽输出
EMI0CF |= 0x2c; /*EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉宽占1个SYSCLK周期*/
EMI0TC |= 0x6c; /*地址建立/保持时间占0个SYSCLK周期,/WR和/RD占12个SYSCLK周期*/
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2011-07-31 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3.1万
采纳率:82%
帮助的人:8432万
展开全部
要求用什么语言?
追问
C语言
追答
#include "reg51.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char

sbit K1 = P3^0;
sbit K2 = P3^1;
sbit K3 = P3^2;
sbit K4 = P3^4;
sbit K5 = P3^5;
sbit K6 = P3^6;

uchar code table[] = { //共阳段码
0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, //0 ~ 9
0xff}; // ' '
//*************************************************************
uchar D_buf[6] = {10, 10, 10, 10, 10, 10}; //空白
uchar DispW[6] = {1, 2, 4, 8, 16, 32};

uchar Dflag = 0;
//*************************************************************
void Delay_1ms(uint x)
{
uint i, j;
for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
//*************************************************************
void Main(void)
{
TMOD = 0x01; //设置T0定时方式1
TH0 = (65536 - 1000) / 256;// 1ms@12MHz
TL0 = (65536 - 1000) % 256;
TR0 = 1;
ET0 = 1; // 1ms中断一次
EA = 1;

while(1) {
if (!K1) {
Delay_1ms(10);
if (!K1) D_buf[3] = 1;
}

if (!K2) {
Delay_1ms(10);
if (!K2) D_buf[2] = 7;
}

if (!K3) {
Delay_1ms(10);
if (!K3) D_buf[4] = 6;
}

if (!K4) {
Delay_1ms(10);
if (!K4) D_buf[0] = 2;
}

if (!K5) {
Delay_1ms(10);
if (!K5) D_buf[5] = 3;
}

if (!K6) {
Delay_1ms(10);
if (!K6) D_buf[1] = 9;
}
}
}
//--------------------------------------------------------------
void T0_INT (void) interrupt 1
{
TH0 = (65536 - 1000) / 256;
TL0 = (65536 - 1000) % 256;
Dflag++;
if(Dflag == 6) Dflag = 0;
P2 = 0;
P0 = table[D_buf[Dflag]];
P2 = DispW[Dflag];
}
//==============================================================
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wbasyyl7
2011-08-01 · TA获得超过9387个赞
知道大有可为答主
回答量:3753
采纳率:0%
帮助的人:1754万
展开全部
出故障了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式