
以下是单片机的部分程序,请个位帮忙看能不能进行注释下。 10
geweidata30hshiweidata31hbuttondata33hnumdata32hdelaynum1data34hdelaynum2data35horg00...
gewei data 30h
shiwei data 31h
button data 33h
num data 32h
delaynum1 data 34h
delaynum2 data 35h
org 0000h
start:mov p1,#0ffh
mov p2,#0ffh
mov gewei,#0
mov shiwei,#0
mov button,#0
mov num,#0
loop6:jnb p3.7,next6
mov p1,#0ffh
mov a,p1
anl a,#0f0h
swap a
cjne a,#0fh,rrr
sjmp loop6
rrr:mov p1,a
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov button,a
acall xuanshouhao
acall warring
sjmp start
next6:mov b,#11h
loop7:acall count
acall display
mov a,b
cjne a,#0,next1
mov r7,#5
loop4:mov p1,#0f0h
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov p1,#0ffh
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
djnz r7,loop4
sjmp start
next1:mov a,p1
anl a,#0f0h
swap a
cjne a,#0fh,next
sjmp loop7
next:mov b,#31h
mov p1,a
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov button,a
acall xuanshouhao
acall singledis
lable:acall count
acall display
mov a,b
cjne a,#0,lable
acall warring
ljmp start
count:mov a,b
add a,#99h
da a
mov b,a
anl a,#0fh
mov gewei,a
mov a,b
anl a,#0f0h
swap a
mov shiwei,a
ret
display: mov dptr, #table
mov r7,#100
aaa:setb p3.1
clr p3.0
mov a,gewei
movc a,@a+DPTR
mov p2,a
mov delaynum1,#1h
mov delaynum2,#5h
acall delay
mov p2,#0ffh
setb p3.0
clr p3.1
mov a,shiwei
movc a,@a+DPTR
mov p2,a
mov delaynum1,#1h
mov delaynum2,#5h
acall delay
mov p2,#0ffh
djnz r7,aaa
ret
xuanshouhao:mov a,button
cjne a,#0eh,sss
mov num,#01
sjmp fff
sss: cjne a,#0dh,ddd
mov num,#02
sjmp fff
ddd: cjne a,#0bh,eee
mov num,#03
sjmp fff
eee:cjne a,#07h ,fff
mov num,#04
fff: ret
singledis:mov DPTR,#table
mov a,num
movc a,@a+DPTR
mov p0,a
mov delaynum1,#3h
mov delaynum2,#0h
acall delay
ret
warring:mov DPTR,#table
mov r6,#5
lll: mov a,num
movc a,@a+DPTR
mov p0,a
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov p0,#0ffh
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
djnz r6,lll
ret
table: db 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h
delay:mov r3,delaynum1
delay2:mov r4,delaynum2
delay1:mov r5,#0
djnz r5,$
djnz r4,delay1
djnz r3,delay2
ret
end 展开
shiwei data 31h
button data 33h
num data 32h
delaynum1 data 34h
delaynum2 data 35h
org 0000h
start:mov p1,#0ffh
mov p2,#0ffh
mov gewei,#0
mov shiwei,#0
mov button,#0
mov num,#0
loop6:jnb p3.7,next6
mov p1,#0ffh
mov a,p1
anl a,#0f0h
swap a
cjne a,#0fh,rrr
sjmp loop6
rrr:mov p1,a
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov button,a
acall xuanshouhao
acall warring
sjmp start
next6:mov b,#11h
loop7:acall count
acall display
mov a,b
cjne a,#0,next1
mov r7,#5
loop4:mov p1,#0f0h
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov p1,#0ffh
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
djnz r7,loop4
sjmp start
next1:mov a,p1
anl a,#0f0h
swap a
cjne a,#0fh,next
sjmp loop7
next:mov b,#31h
mov p1,a
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov button,a
acall xuanshouhao
acall singledis
lable:acall count
acall display
mov a,b
cjne a,#0,lable
acall warring
ljmp start
count:mov a,b
add a,#99h
da a
mov b,a
anl a,#0fh
mov gewei,a
mov a,b
anl a,#0f0h
swap a
mov shiwei,a
ret
display: mov dptr, #table
mov r7,#100
aaa:setb p3.1
clr p3.0
mov a,gewei
movc a,@a+DPTR
mov p2,a
mov delaynum1,#1h
mov delaynum2,#5h
acall delay
mov p2,#0ffh
setb p3.0
clr p3.1
mov a,shiwei
movc a,@a+DPTR
mov p2,a
mov delaynum1,#1h
mov delaynum2,#5h
acall delay
mov p2,#0ffh
djnz r7,aaa
ret
xuanshouhao:mov a,button
cjne a,#0eh,sss
mov num,#01
sjmp fff
sss: cjne a,#0dh,ddd
mov num,#02
sjmp fff
ddd: cjne a,#0bh,eee
mov num,#03
sjmp fff
eee:cjne a,#07h ,fff
mov num,#04
fff: ret
singledis:mov DPTR,#table
mov a,num
movc a,@a+DPTR
mov p0,a
mov delaynum1,#3h
mov delaynum2,#0h
acall delay
ret
warring:mov DPTR,#table
mov r6,#5
lll: mov a,num
movc a,@a+DPTR
mov p0,a
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
mov p0,#0ffh
mov delaynum1,#2h
mov delaynum2,#0h
acall delay
djnz r6,lll
ret
table: db 0c0h, 0f9h, 0a4h, 0b0h, 99h, 92h, 82h, 0f8h, 80h, 90h
delay:mov r3,delaynum1
delay2:mov r4,delaynum2
delay1:mov r5,#0
djnz r5,$
djnz r4,delay1
djnz r3,delay2
ret
end 展开
意法半导体(中国)投资有限公司
2023-06-12
展开全部
展开全部
非常简单的IIC通讯的一个程序,你参考IIC的通讯协议和时序看,非常简单的
我给你简单的注释了下,不明白再给我发邮件todhong@163.com
main(void)
{
uchar i;
SDA = 1; //IIC的数据位
SCL = 1; //IIC的时钟位
fill_byte(72,0xff); // 将前72字节填充0xff
for(i = 0 ; i < 72; i++) //写入显示代码到AT24C02
{
write_byte(i,display[i]); //写函数,在指定地址写入指定数据
}
for(i =0 ;i <72 ; i++) //从AT24C02移出数据送到P0口显示
{
P0 = read_random(i); //读函数
delayms(350);
}
}
/**********************************************************/
void start() // 起始信号
//开始位
{
SDA = 1; //开始总线
SCL = 1;
delayNOP();
SDA = 0;
delayNOP();
SCL = 0;
}
/**********************************************************/
void stop() //停止信号
// 停止位
{
SDA = 0;
delayNOP();
SCL = 1;
delayNOP();
SDA = 1;
}
/**********************************************************/
uchar shin() //读一个字节
// 从AT24C02移出数据到MCU
{
uchar i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1; // 左移8次,读出一个字节
read_data |= SDA;
SCL = 0;
}
return(read_data);
}
/**********************************************************/
bit shout(uchar write_data)
// 从MCU移出数据到AT24C02 // 写1个字节
{
uchar i;
bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
delayNOP();
SCL = 0;
write_data <<= 1;
}
SDA = 1; // 读取应答
delayNOP();
SCL = 1;
delayNOP();
ack_bit = SDA;
SCL = 0;
return ack_bit; // 返回AT24C02应答位
}
/**********************************************************/
void write_byte(uchar addr, uchar write_data)
// 在指定地址addr处写入数据write_data
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10); // 写入周期
}
/**********************************************************/
void fill_byte(uchar fill_size,uchar fill_data)
// 填充数据fill_data到EEPROM内fill_size字节
{
uchar i;
for(i = 0; i < fill_size; i++)
{
write_byte(i, fill_data);
}
}
/**********************************************************/
uchar read_current()
// 在当前地址读取
{
uchar read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
/**********************************************************/
uchar read_random(uchar random_addr)
// 在指定地址读取
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
/**********************************************************/
void delayms(uint ms)
// 延时子程序
{
uchar k;
while(ms--)
{
for(k = 0; k < 120; k++);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
原程序有点问题,不能保证生成的一定是4位的随机数,已帮你改进并注释如下:
/*猜数游戏改进版 dev-c++下验证通过*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int rdigit,rdigit1,num,num1,count,flag;
int i,j,k,t,l[4]; /*j:数字正确的位数 k:位置正确的位数*/
/*l[]:数字相同时,人所猜中数字的正确位置*/
srand((unsigned int)time(NULL));
rdigit=1000+rand()%9000; /*计算机想一个四位随机数*/
printf("The number is: %d\n",rdigit); /*这就是计算机想的数,这一行可以去掉*/
printf("I have a number with 4 digits in mind,please guess it.\n\n");
for(count=1;;count++) /*count: 猜数次数计数器*/
{
printf("Enter a number with 4 digits:");
scanf("%d",&num); /*请人猜*/
rdigit1=rdigit;
j=0;
k=0;
l[0]=l[1]=l[2]=l[3]=0;
for(i=1;i<5;i++) /*i:原数中的第i位数。个位为第一位,千位为第4位*/
{
num1=num;
flag=1;
for(t=1;t<5;t++) /*人所猜想的数*/
{
if(num1%10==rdigit1%10) /*若人猜的第t位与计算机想的第i位相同*/
{
if(flag&&t!=l[0]&&t!=l[1]&&t!=l[2]&&t!=l[3])
{
j++;flag=0;l[j-1]=t; /*若该位置上的数字尚未与其它数字“相同”*/
} /*记录相同数字时,该数字在所猜数字中的位置*/
if(i==t) k++; /*若位置也相同,则计数器k加1*/
}
num1/=10;
}
rdigit1/=10;
}
printf("Correctly guessed %d digits,",j);
printf("and guessed %d digits in exact position.\n\n",k);
if(k==4) break; /*若位置全部正确,则人猜对了,退出*/
}
printf("Now correctly guessed the whole number after %d times.\n",count);
system("pause");
return 0;
}
/*猜数游戏改进版 dev-c++下验证通过*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int rdigit,rdigit1,num,num1,count,flag;
int i,j,k,t,l[4]; /*j:数字正确的位数 k:位置正确的位数*/
/*l[]:数字相同时,人所猜中数字的正确位置*/
srand((unsigned int)time(NULL));
rdigit=1000+rand()%9000; /*计算机想一个四位随机数*/
printf("The number is: %d\n",rdigit); /*这就是计算机想的数,这一行可以去掉*/
printf("I have a number with 4 digits in mind,please guess it.\n\n");
for(count=1;;count++) /*count: 猜数次数计数器*/
{
printf("Enter a number with 4 digits:");
scanf("%d",&num); /*请人猜*/
rdigit1=rdigit;
j=0;
k=0;
l[0]=l[1]=l[2]=l[3]=0;
for(i=1;i<5;i++) /*i:原数中的第i位数。个位为第一位,千位为第4位*/
{
num1=num;
flag=1;
for(t=1;t<5;t++) /*人所猜想的数*/
{
if(num1%10==rdigit1%10) /*若人猜的第t位与计算机想的第i位相同*/
{
if(flag&&t!=l[0]&&t!=l[1]&&t!=l[2]&&t!=l[3])
{
j++;flag=0;l[j-1]=t; /*若该位置上的数字尚未与其它数字“相同”*/
} /*记录相同数字时,该数字在所猜数字中的位置*/
if(i==t) k++; /*若位置也相同,则计数器k加1*/
}
num1/=10;
}
rdigit1/=10;
}
printf("Correctly guessed %d digits,",j);
printf("and guessed %d digits in exact position.\n\n",k);
if(k==4) break; /*若位置全部正确,则人猜对了,退出*/
}
printf("Now correctly guessed the whole number after %d times.\n",count);
system("pause");
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我靠,上面的老大也太神了吧。。。这明显就是一个7段数码管的显示和按键程序
貌似还是抢答器一类的。。
注释的活太累了,自己看看51的汇编指令好好学下吧
貌似还是抢答器一类的。。
注释的活太累了,自己看看51的汇编指令好好学下吧
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询