找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2142|回复: 6
收起左侧

P0=pt[look[0]]; 请问这个单片机代码表示什么意思?

[复制链接]
ID:404479 发表于 2018-11-5 14:35 来自手机 | 显示全部楼层 |阅读模式
两个不一样的数组。为什么可以重叠使用啊!
以下是程序:
#include <reg52.h> //包含寄存器的库文件
#define u16 unsigned int
#define u8 unsigned char
sbit a = P1^0;
sbit b= P1^1;
sbit c = P1^2;
sbit d= P1^3;
sbit e = P1^4;
u8 pt[] = { //用数组来表示数码管真值表
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e,
};
void main()
{
u16 z= 0;
u8 j = 0;
unsigned long s =0;
u8 look[6]={0};
e= 0; d= 1;P0 = 0XFF; //74HC138和P0初始化部分
TMOD = 0x01; //设置定时器0为模式1
TH0 = 0xFC;
TL0 = 0x67; //定时值初值,定时1ms
TR0 = 1; //打开定时器0
while(1)
{
if(1 == TF0) //判断定时器0是否溢出
{
TF0 = 0;
TH0 = 0xFC; //一旦溢出后,重新赋值
TL0 = 0x67;
z++;
if(1000 == z) //判断定时器0溢出是否达到1000次
{
z= 0;
s++; //秒表数值一秒加1
look[0] = s%10; 余数为1
look[1] = s/10%10; 余数1
look[2] = s/100%10; 余数1
look[3] = s/1000%10; //数码管显示值计算
look[4] = s/10000%10;
look[5] = s/100000%10;
}
switch(j)
{
case 0: a=0; b=0; c=0; j++; P0=pt[look[0]];break;
case 1: a=1; b=0; c=0; j++; P0=pt[look[1]];break;
case 2: a=0; b=1; c=0; j++; P0=pt[look[2]];break;
case 3: a=1; b=1; c=0; j++; P0=pt[look[3]];break;
case 4: a=0; b=0; c=1; j++; P0=pt[look[4]];break;
case 5: a=1; b=0; c=1; j=0; P0=pt[look[5]];break;
default: break;
}
} //数码管动态刷新部分
}
}
回复

使用道具 举报

ID:213173 发表于 2018-11-5 15:56 | 显示全部楼层
两个不一样的数组是可以嵌套使用的,但是楼主这个程序不可能正常运行。因为定时器0溢出周期是1ms,而执行1次   if(1000 == z)花括号内语句需要耗时超过3ms。主要是因为分解long大数据耗时长,定时器溢出标志TF0信号大部分丢失,甚至数码管动态刷新速度过慢而闪烁。
回复

使用道具 举报

ID:249661 发表于 2018-11-5 16:06 | 显示全部楼层
我的理解,使用pt[look[0]]相当于pt[s%10],以此类推。p0de你把look[0]-look[5]看做普通的整形变量,好理解。供参考
回复

使用道具 举报

ID:149144 发表于 2018-11-5 16:06 | 显示全部楼层
u8 pt[] = { //用数组来表示数码管真值表
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e,
};
上面的是数码管的 0 1 2 3 4 5 6 7 8 9 A B C D E F   是共阳的管子

look[0] = s%10; 就是数码管的 个位 假如这时候 s = 58, look[0] = 8,他应该不会大于 9  ,  0---9

这个时候 P0=pt[look[0]]; 相当于 P0=pt[ 8 ]; 也就是 P0 = 0x80; 这个数码管就显示 8
[ 8 ]表示数组里的第九个数据,[ 0 ]表示 第一个
回复

使用道具 举报

ID:249661 发表于 2018-11-5 16:13 | 显示全部楼层
look[0] = s%10; P0=pt[look[0]]即P0=pt[s%10]。例s为4,s%10为4,pt[4]为0x99,P0=pt[s%10]=pt[4]=0x99;按硬件P0口外接数据管,显示相应的值
回复

使用道具 举报

ID:94031 发表于 2018-11-5 16:30 | 显示全部楼层
先计算要显示的数值(look[0]),再在pt数组里找出相应的码值输出到段码用来显示。
回复

使用道具 举报

ID:413475 发表于 2018-11-5 16:55 | 显示全部楼层
P0=pt[look[0]]; 意思是将pt[]数组的第look[0]位赋给P0口.
1.look[]数组是计算存储秒(s)的个位到十万位的值(0~9).
2.pt[] 数组是数码管的段码,用来显示数值的.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表