Skip to content

Instantly share code, notes, and snippets.

@OctopusLian
Created November 20, 2018 09:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OctopusLian/74e36baa755ff476d2c927c801a39004 to your computer and use it in GitHub Desktop.
Save OctopusLian/74e36baa755ff476d2c927c801a39004 to your computer and use it in GitHub Desktop.
单片机课程设计-99码表
;C语言1-10行改为
ORG 0000H ;汇编起始伪指令,功能是规定程序存储器中源程序或数据块存放的起始地址
ajmp STAR ;ajmp无条件跳转指令
ORG 000bh
ajmp timer0
anjian equ P1.7 ;位定义
keycount equ 40h
shi equ 41h
gewei equ 42h
aa equ 43h
temp equ 44h
tab: db 3fh,6h,5bh,4fh,66h ;建表
db 6dh,7dh,7h,7fh,6fh
;C语言初始化函数12-14行改为
STAR:
acall init ;子程序近程调用指令,功能是主程序调用子程序,调用子程序的范围为2kb
;C语言初始化函数39-49行改为
init:
mov keycount,#0 ;keycount=0
mov temp,#0 ;temp=1
mov tmod,#01h ;TMOD=0x01
mov TH0,#60
mov TL0,#176
setb EA ;位置位指令,对操作数所指出的位进行置1操作
setb ET0
setb TR0
ret
;C语言中15-35行while循环改为
START:
acall display
inc temp ;加1指令,将操作数所指定的单元或寄存器中的内容加1
acall delay70 ;近程调用delay70
x8: mov r0,keycount
cjne r0,#2,F1 ;cjne比较跳转指令,若r0=2则跳转到x8,否则跳转到F1。
ajmp x8
F1: mov r0,temp
cjne r0,#99,START ;若r0<99时,重复循环,否则temp=0
mov temp,#0
ajmp START
F9:
acall key
mov r0,keycount
cjne r0,#0,F2 ;keycount=0顺序执行,否则跳转到F1
CLR P1.3 ;清0
SETB TR0
F2: mov r0,keycount ;第二次按键
cjne r0,#2,F2
clr TR0
reti
mov r0,keycount ;第三次按键
cjne r0,#3,F3
mov temp,#0
mov keycount,#0
;清零操作
timer0:
w1:
acall key
mov TH0,#60
mov TL0,#176
cpl p1.0
JB keycount,x2
ajmp x3
x2:
ajmp START
clr p1.0
ajmp w1
ajmp w1
x3: mov r0,keycount
cjne r0,#3,w1 ;若r0=3则顺序执行,否则跳转到w1
mov temp,#0
mov keycount,#0
ret
;C语言58-64行display函数改为
display:
mov a,temp
mov b,#10
div ab ;除法指令,实现两个八位无符号数的除法操作。
mov r2,A
mov r3,B
mov dptr,#tab ;16位数据传送使用方式
mov a,r2
movc a,@a+dptr ;查表,先将累加器A的内容与数据指针寄存器DPTR的内容相加,再以其结果为地址,将该地址的结果送入A中
mov P0,a
acall delay70
nop ;空指令
mov a,r3
movc a,@a+dptr
mov P2,a
nop
acall delay70
ret
;C语言66-76行key函数改为
key:
jb anjian,F6 ;若anjian=0则顺序执行,否则跳转到F6
ACALL delay5
inc keycount ;keycount++
F6:
ret
;C语言78-83行delay函数改为
delay70:
mov r6,#70
D2: mov R7,#248
d1: djnz R7,d1 ;248*70次
djnz R6,D2
ret
delay5:
mov r6,#5 ;消抖。
F7: mov R7,#248
F8: djnz r7,F8 ;248*5次
djnz r6,F7
ret
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,aa,keycount=0,temp;
sbit anjian=P1^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(shi,ge);
void key ();
void init();
void delay(uint z);
/*-----主程序-----*/
void main()
{
init(); //初始化
while(1)
{
key ();
if(keycount==1)
TR0=1; //开中断
if(keycount==2)
TR0=0;
if(keycount==3)
{
temp=0;
keycount=0;
}
if(aa==10){aa=0;
if(temp<=99)
{
temp++;display(shi,ge);
}
else
temp=0;}
}
}
/*------初始化程序-------*/
void init()
{
keycount=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
//TR0=0;
}
/*-----定时器中断-----*/
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
/*-----显示子程序-----*/
void display(shi,ge)
{
shi=temp/10;
ge=temp%10;
P0=table[shi];;delay(70);
P2=table[ge]; ;delay(70);
}
/*-----按键检测子程序-----*/
void key ()
{
if(anjian==0)
{
delay(5); //消抖
if(anjian==0)
keycount++;
}
//while(anjian==0);
//display(shi,ge); //等待按键弹起
}
/*-----延时子程序-----*/
void delay(uint z) //延时约1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment