主页 > 科技生活 >趣步app官网_单片机数码管编程 汇编语言,急 >

趣步app官网_单片机数码管编程 汇编语言,急

单片机数码管编程 汇编语言,急

U16INC MACRO U16,;;16位无符号型变1
LOCALZZ
INC U16+1
MOV A,U16+1
JNZ ZZ
MOV U16+1,#0
INC U16
ZZ:
ENDM

U16MOV MACRO U16,VAL;;16位无符号型变量赋值
MOV U16+1,#LOW(VAL)
MOV U16,#HIGH(VAL)
ENDM

U16DAYV MACRO U16,VAL,;;16位无符号型变量判断大小,最后根据Cy判断
MOV A,U16+1
CLR C
SUBB A,#LOW(VAL)
MOV A,U16
SUBB A,#HIGH(VAL)
ENDM

WX1 EQU P2.0
WX2 EQU P2.1
WX3 EQU P2.2
WX4 EQU P2.3

S4 EQU P1.3
S5 EQU P1.4

LED1 EQU P1.6;;两个LED
LED2 EQU P1.7

JDQ EQU P1.5;;继电器

SMGBZ1 EQU 0X30
DS1 EQU 0X31

ZT EQU DS1+4
JSBZ1 EQU ZT+1;0-39的计数
JSBZ2 EQU ZT+2;计时标志,用于闪烁和计时
JSBZ3 EQU JSBZ2+2;;继电器通断两次的计时和计数

ORG 0
JMP MAIN
ORG 0XB
JMP TimeInterupt

MAIN:
MOV SP,#0X70
MOV R0,#0x70
CLR A
MA1: MOV @R0,A;数据全清0
DJNZ R0,MA1
CALL JDQLC_STOP
CALL Time0Init

;主循环
LOOP: CALL AJPD
CALL RUN
JMP lOOP

;主运行函数
RUN: MOV A,ZT
CJNE A,#1,RR1
JMP RUN1
RR1: CJNE A,#2,RR2
JMP RUN2
RR2: RET

;;0-39循环
RUN1:
MOV DS1+0,#0X10
MOV DS1+1,#0X10
MOV A,JSBZ1
MOV B,#10
DIV AB
MOV DS1+2,A
MOV DS1+3,B

U16DAYV JSBZ2,1000
JC RUN1_1
U16MOV JSBZ2,0
INC JSBZ1
MOV A,JSBZ1
CJNE A,#39+1,RUN1_1
MOVJSBZ1,#0
RUN1_1:
RET

;;FFFF闪烁
RUN2: U16DAYV JSBZ2,500
JC RUN2_1
MOV DS1+0,#0X10
MOV DS1+1,#0X10
MOV DS1+2,#0X10
MOV DS1+3,#0X10
SETB LED1
SETB LED2
U16DAYV JSBZ2,1000
JC RUN2_2
U16MOV JSBZ2,0
JMP RUN2_2
RUN2_1:
MOV DS1+0,#0X0F
MOV DS1+1,#0X0F
MOV DS1+2,#0X0F
MOV DS1+3,#0X0F
CLR LED1
CLR LED2
RUN2_2:
CALL JDQLC

RET

;按键判断
AJPD:
JNB S4,AJ1
JNB S5,AJ2
RET
AJ1: JNB S4,$
MOV ZT,#2
CALL JDQLC_START
RET
AJ2: CALL JDQLC_STOP
SETB LED1
SETB LED2
JNB S5,$
MOV ZT,#1
MOV JSBZ1,#0
U16MOV JSBZ2,0
RET

JDQLC_START:
U16MOV JSBZ3,0
RET
JDQLC_STOP:
U16MOV JSBZ3,30000
SETB JDQ
RET
;继电器通断两次
JDQLC:
U16DAYV JSBZ3,1000
JNC JDQ_1
CLR JDQ;通1s
RET
JDQ_1: U16DAYV JSBZ3,1500
JNC JDQ_2
SETB JDQ;断0.5s
RET
JDQ_2: U16DAYV JSBZ3,1500+1000
JNC JDQ_3
CLR JDQ;通1s
RET
JDQ_3: U16DAYV JSBZ3,3000
JNC JDQ_4
SETB JDQ;断
JDQ_4: RET


;;定时器初始化
Time0Init:
MOV TMOD,#0X01
MOV TH0,#HIGH(65536-1000)
MOV TL0,#LOW(65536-1000)
SETB TR0
SETB ET0
SETB EA
RET

;;数码显示
SMXS:
INC SMGBZ1
MOV A,SMGBZ1
SUBB A,#4
JC SMXS1
MOV SMGBZ1,#0

SMXS1:
MOV P2,#0XF0
MOV A,SMGBZ1
ADD A,#DS1
MOV R0,A
MOV A,@R0
MOV DPTR,#TABD
MOVC A,@A+DPTR
MOV P0,A
MOV DPTR,#TABW
MOV A,SMGBZ1
MOVC A,@A+DPTR
MOV P2,A
RET

TABD:;段码
DB0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
DB0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF,0XBF
TABW:;位码
DB0xF1,0xF2,0xF4,0xF8


;;定时器0中断
TimeInterupt:
PUSH PSW
PUSH ACC

MOV TH0,#HIGH(65536-1000)
MOV TL0,#LOW(65536-1000)
CALL SMXS
U16INC JSBZ2
U16DAYV JSBZ3,30000
JNC TimeOut
U16INC JSBZ3


TimeOut:
POP ACC
POP PSW
RETI

END

追问

兄弟,我给你转账还是发红包
如何编程让这个数码管动态显示?


数位选由74LS138控制的,74LS138由P0口高四位控制。一开始的做初始化,单片机P0.7 P0.6 P0.5 P0.4 输出 1 0 0 0,138的Y0输出低电平,选中第一个数码管。追问

谢谢!!我查了查真值表,好像只用到A0 A1 A2 也就是 P0.7 P0.6 P0.5 那我编程的时候 就直接写成P0.5=1这种形式就可以了是吗?位选是74LS138控制的,段选是单片机IO口直接控制的
编程,用VB!已知学号由8个数码组成,如06431001


'已知学号由8个数成,如06431001
'
'从左算起前2位表示年级,第3个字符表示学生,学生类型规下:
'
'2表示博士生,3表示硕士生,4表示本科生。
'
'编写程序,从输入对话框输入一个学号,经过判断处理后,显示该生的年级及学生类型
Dim Grade As String, Level As String, lev As String, num As String
num = InputBox("输入学号", num)
Grade = Mid(num, 1, 2)
Level = Mid(num, 3, 1)
Select Case Val(Level)
Case 2
lev = "博士生"
Case 3
lev = "硕士生"
Case 4
lev = "本科生"
End Select
Me.Print "年级:" & Grade & Chr(13) & "学历:" & levPrivate Sub Command1_Click()
Dim xuehao As String
xuehao = InputBox("输号=", xuehao)
Debug.Print Mid(xuehao, 1, 2) & ""
If Mid(xuehao, 3, 1) = "2" Then
Debug.Print "博士生"
ElseIf Mid(xuehao, 3, 1) = "3" Then
Debug.Print "生"
ElseIf Mid(xuehao, 3, 1) = "4" Then
Debug.Print "生"
End If
End SubPrivate Sub Command1_Click()
Dim Nos As String, Grade As String, Degree As String, Result As String
Nos = InputBox("请输号")
Grade = Mid(Nos, 1, 2)
Degree = Mid(Nos, 3, 1)
Select Case Degree
Case 2
Result = "该" & Grade & "年级的学生,学历士生"
Case 3
Result = "该生是" & Grade & "年级的学生,学硕士生"
Case 4
Result = "该生是" & Grade & "年级的学生,学历为本科生"
End Select
MsgBox Result
End Sub
人工智能的八数码问题,过程化的c语言编程方法,求解,好的话要多少分给多少分!!!
#include
#include
#define TIME 50//限定只搜索前50步,50步以果仍然没索到结果,认为无解。
#define MAXSIZE 200
int n=1;
int result[9]={1,2,3,8,0,4,7,6,5};//所要达到的最终状0代表空格。
typedef struct{
int num[9];
char expension;//记录是否可以扩展,Y代表可以扩展,N代表不可以。
char banOperate;//表示不可以执行的操作,'L'代表不能左移,'R'代表不能右移,
//'U'代表不能上移,'D'代表不能下移,'C'代表可以任意移动。
int father;//记录父节点的下标。
}Node;
Node store[MAXSIZE];//将搜索过的状态存储于该数组中。

int same(int temp)//判断是否达到了目标状态。
{
for(int j=0;j<9;j++)
if(store[temp].num[j]!=result[j])
return 0;
return 1;
}

void printResult()//输出搜索结果。
{
for(int j=1;j<=n;j++)
{
printf("第%d步搜索后:\n",j);
printf("\t%d\t%d\t%d\n",store[j].num[0],store[j].num[1],store[j].num[2]);
printf("\t%d\t%d\t%d\n",store[j].num[3],store[j].num[4],store[j].num[5]);
printf("\t%d\t%d\t%d\n",store[j].num[6],store[j].num[7],store[j].num[8]);
printf("\n\n");
}
}

int left(int temp)//将空格进行左移操作。
{
for(int j=0;j<9;j++)//判断空格的位置。
if(store[temp].num[j]==0)
break;
if(j==0||j==3||j==6)
return 0;
for(int k=0;k<9;k++)
store[n].num[k]=store[temp].num[k];
int tempNum=store[n].num[j-1];//将移动后的状态赋给store[n]
store[n].num[j-1]=0;
store[n].num[j]=tempNum;
store[temp].expension='N';
store[n].banOperate='R';
store[n].expension='Y';
store[n].father=temp;
if(same(n))//判断store[n]是否为最终想得到的状态。
{
printResult();
exit(1);
}
n++;
return 1;
}

int right(int temp)//将空格进行右移操作。
{
for(int j=0;j<9;j++)
if(store[temp].num[j]==0)
break;
if(j==2||j==5||j==8)
return 0;
for(int k=0;k<9;k++)
store[n].num[k]=store[temp].num[k];
int tempNum=store[n].num[j+1];
store[n].num[j+1]=0;
store[n].num[j]=tempNum;
store[temp].expension='N';
store[n].banOperate='L';
store[n].expension='Y';
store[n].father=temp;
if(same(n))
{
printResult();
exit(1);
}
n++;
return 1;
}

int up(int temp)//将空格进行上移操作。
{
for(int j=0;j<9;j++)
if(store[temp].num[j]==0)
break;
if(j==0||j==1||j==2)
return 0;
for(int k=0;k<9;k++)
store[n].num[k]=store[temp].num[k];
int tempNum=store[n].num[j-3];
store[n].num[j-3]=0;
store[n].num[j]=tempNum;
store[temp].expension='N';
store[n].banOperate='D';
store[n].expension='Y';
store[n].father=temp;
if(same(n))
{
printResult();
exit(1);
}
n++;
return 1;
}

int down(int temp)//将空格进行下移操作。
{
for(int j=0;j<9;j++)
if(store[temp].num[j]==0)
break;
if(j==6||j==7||j==8)
return 0;
for(int k=0;k<9;k++)
store[n].num[k]=store[temp].num[k];
int tempNum=store[n].num[j+3];
store[n].num[j+3]=0;
store[n].num[j]=tempNum;
store[temp].expension='N';
store[n].banOperate='U';
store[n].expension='Y';
store[n].father=temp;
if(same(n))
{
printResult();
exit(1);
}
n++;
return 1;
}

void init()
{
Node start;
printf("请输入初始状态,用空格分开,0代表空格:\n");//输入初始的状态。
for(int i=0;i<9;i++)
scanf("%d",&start.num[i]);
for(int k=0;k<9;k++)
if(start.num[k]==0)
break;
start.banOperate='C';
start.expension='Y';
start.father=-1;
store[0]=start;//将初始状态赋于store[0]。
}
void main(){
init();

if(same(0))
{
printf("没有必要进行搜索,初始状态即为最终状态!");
exit(1);
}

for(int i=0;i {
if(store[i].expension='Y')
{
if(store[i].banOperate=='L')
{
up(i);
right(i);
down(i);
}
if(store[i].banOperate=='R')
{
left(i);
up(i);
down(i);
}
if(store[i].banOperate=='U')
{
left(i);
right(i);
down(i);
}
if(store[i].banOperate=='D')
{
left(i);
up(i);
right(i);
}
if(store[i].banOperate=='C')
{
left(i);
up(i);
right(i);
down(i);
}
}
if(n>=TIME)//50步以后仍然没有达到所要求的状态,认为无解。
{
n--;
printResult();
printf("Sorry,在所在搜索范围内没有搜索到结果!");
exit(1);
}
}

}


上一篇: 下一篇: