//LCD的口线
sbit E=P3^5
sbit RW=P3^6
sbit RS=P3^7
//8字LED的连接方法
//P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0
//G, F A E B H C D
unsigned char code ledcode[]={0x84,0xf5,0x46,0x54,0x35,0x1c,0x0c,0xd5,
0x04,0x14,0x05,0x2c,0x8e,0x64,0x0e,0x0f}//数码管段码表
unsigned char js100ms,jsgw,jssw,t0100ms,t0sm
void time0(void)
void main(void)
{
E=0 //取消LCD对LED的影响
RW=0
RS=1
js100ms=0x00
jsgw=0x00
jssw=0x00
t0100ms=0x14
t0sm=0x01 //从第一个LED开始显示
TH0=0xee
TL0=0x00
TMOD=0x01
TR0=1
IE=0x82
while(1)
{}
}
void time0(void) interrupt 1
{
TH0=0xee
TL0=0x00
t0100ms--
if(t0100ms==0x00)
{
t0100ms=0x14
js100ms++
if(js100ms==0x0a)
{
js100ms=0x00
jsgw++
if(jsgw==0x0a)
{
jsgw=0x00
jssw++
if(jssw==0x0a)
{jssw=0x00}
}
}
}
t0sm++
if(t0sm==0x04)
{t0sm=0x01}
P0=0xff
switch(t0sm)
{
case 0x01: { P2=0xdfP0=ledcode[js100ms]}break
case 0x02: { P2=0xefP0=ledcode[jsgw]&0xFB}break
case 0x03: { P2=0xf7P0=ledcode[jssw]}break
default: break
}
}
或者汇编
JS100MS EQU 32H 计数器明纯0.1S
JSGW EQU 30H 计数器的个位
JSSW EQU 31H 计数器的十位
T0_100MS EQU 33H 产生1S
LEDSM EQU 34H 现在扫到第几个LED
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME0_1
ORG 0050H
MAIN:
MOV JS100MS,#00H 上电时从00.0开始
MOV JSSW,#00H
MOV JSGW,#00H
MOV T0_100MS,#14H 5MS*20=100MS
MOV LEDSM,#01H
MOV TH0,#0EEH 16位的定时器,定时5MS
MOV TL0,#00H
MOV TMOD,#01H
SETB TR0
MOV IE,#82H 定时器0中断
SJMP $
ORG 0100H
TIME0_1: MOV TH0,#0EEH
MOV TL0,#00H
DJNZ T0_100MS,TODISP
MOV T0_100MS,#14H
INC JS100MS
MOV A,JS100MS
CJNE A,#0AH,TODISP
MOV JS100MS,#00H
INC JSGW
MOV A,JSGW
CJNE A,#0AH,TODISP
MOV JSGW,#00H
INC JSSW
MOV A,JSSW
CJNE A,#0AH,TODISP
MOV JSSW,#00H 溢出99.9则回到00.0
TODISP: MOV P0,#0FFH 在位选时关显示
INC LEDSM
MOV A,LEDSM
CJNE A,#04H,TODISP1
MOV LEDSM,#01H 扫孝侍完第三个又从第一个开激慎咐始
TODISP1: MOV A,LEDSM
CJNE A,#01H,TODISP2
MOV P2,#0DFH
MOV A,JS100MS
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
AJMP TOP0
TODISP2: CJNE A,#02H,TODISP3
MOV P2,#0EFH
MOV A,JSGW
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
CLR ACC.2 把H点点亮
AJMP TOP0
TODISP3: MOV P2,#0F7H
MOV A,JSSW
MOV DPTR,#LEDCODE
MOVC A,@A+DPTR
TOP0: MOV P0,A
RETI
8字LED的连接方法
P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0
G, F A E B H C D
LED字段码表
LEDCODE: DB 84H 0
DB 0F5H 1
DB 46H 2
DB 54H 3
DB 35H 4
DB 1CH 5
DB 0CH 6
DB 0D5H 7
DB 04H 8
DB 14H 9
DB 05H A
DB 2CH B
DB 8EH C
DB 64H D
DB 0EH E
DB 0FH F
END
如果发电路可以量身打造哦QQ514586810
#include<pic.h>//blink程序,纯纤没PORTD作为输出八路LED信竖洞号
void delay(unsigned int t)
{//延时1s子程序
unsigned int i,j
for(i=0i<=ti++)
{
for(j=0j<=42000j++)
{
asm("nop")
}
}
}
main()
{
TRISD=0X00//D口都为输出
PORTD=0x01//初始值做纳
while(1)
{
delay(1)
PORTD=PORTD<<1
if(PORTD==0x00)
{
PORTD=0x01
}
}
}
用定时器产生固定的时间(一般为毫秒级)州袜卖,然后对它计数(产生秒),以秒,分,时进位就是了(电子表),加两个按键实现复册逗位和停止就行了(马表了)!这是思路,具体程序如下:
0-9999999.9 跑马表
Count EQU 40H
TimeCount EQU 3FH
K1 BIT P1.4 启动好颂计时
K2 BIT P1.5 暂停计时
K3 BIT P1.6
K4 BIT P1.7 计时单元清零
BEEP BIT P3.7
**********************************************************
ORG 0000H
JMP MAIN
ORG 000BH
JMP TIMER0
ORG 0030H
**********************************************************
主程序
**********************************************************
MAIN:
MOV SP,#60H
MOV TMOD,#01
SETB EA
SETB ET0
MOV TH0,#4CH 50ms定时
MOV TL0,#00H
CALL M_CLR 计时单元清零
MAIN1:
JB K1,MAIN2
CALL BEEP_BL
CALL DELAY 调显示延时
SETB TR0 启动中断
MAIN2:
JB K2,MAIN3
CALL BEEP_BL
CALL DELAY 调显示延时
CLR TR0停止中断
MAIN3:
JB K4,MAIN4
CALL BEEP_BL
CALL DELAY 调显示延时
CALL M_CLR 计时单元清零
MAIN4:
CALL DISP
JMP MAIN1
**********************************************************
计时单元清零子程序
**********************************************************
M_CLR:
MOV R0,#Count
MOV A,#00H
CLR_1:
MOV @R0,A 清零
INC R0
CJNE R0,#49H,CLR_1
RET
**********************************************************
键延时子程序
**********************************************************
DELAY:
MOV R4,#05H
DELAY1:
CALL DISP
DJNZ R4,DELAY1
RET
**********************************************************
显示子程序
**********************************************************
DISP:
MOV R0,#Count 获得显示单元首地址
MOV R1,#07FH 从第一个数码管开始
MOV R2,#08H 共显示8位数码管
DISP1:
MOV A,@R0 获得当前位地址
MOV DPTR,#TABLE 获得表头
MOVC A,@A+DPTR查表获得显示数据
MOV P0,A 显示数据
MOV P2,R1 开始显示当前位
MOV A,R1 准备显示下一位
CJNE A,#0BFH,DISP2
CLR P0.7 加小数点
DISP2:
RR A
MOV R1,A 下一位
INC R0取下一个单元地址
LCALL DELAY2MS延时 2 MS
DJNZ R2,DISP1 重复显示下一个
MOV P2,#0FFH 关闭显示
RET 显示完成,返回
**********************************************************
显示延时子程序
**********************************************************
DELAY2MS:
MOV R6,#10
DEL1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DEL1
RET
**********************************************************
中断服务子程序
**********************************************************
TIMER0:
PUSH ACC
MOV TH0,#4CH 50ms定时
MOV TL0,#00H
INC TimeCount
MOV A,TimeCount
CJNE A,#2,T_END
MOV TimeCount,#00H
INC Count 小数位
MOV A,Count
CJNE A,#10,T_END
MOV Count,#00H
INC Count+1 个位
MOV A,Count+1
CJNE A,#10,T_END
MOV Count+1,#00H
INC Count+2 十位
MOV A,Count+2
CJNE A,#10,T_END
MOV Count+2,#00H
INC Count+3 百位
MOV A,Count+3
CJNE A,#10,T_END
MOV Count+3,#00H
INC Count+4 千位
MOV A,Count+4
CJNE A,#10,T_END
MOV Count+4,#00H
INC Count+5 万位
MOV A,Count+5
CJNE A,#10,T_END
MOV Count+5,#00H
INC Count+6 十万位
MOV A,Count+6
CJNE A,#10,T_END
MOV Count+6,#00H
INC Count+7 百万位
MOV A,Count+7
CJNE A,#10,T_END
MOV Count+7,#00H
T_END:
POP ACC
RETI
**********************************************************
蜂鸣器响一声子程序
**********************************************************
BEEP_BL:
MOV R6,#100
BL2:CALL DEX1
CPL BEEP
DJNZ R6,BL2
RET
DEX1: MOV R7,#180
DE2:NOP
DJNZ R7,DE2
RET
**********************************************************
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H ,90H,0FFH
DB 88H,83H,0C6H,0A1H,86H,8EH
**********************************************************
END
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Count
sbit K1 = P1^4
sbit K2 = P1^5
sbit K3 = P1^6
sbit K4 = P1^7
sbit DIN = P0^7 //小数点
sbit BEEP = P3^7 //蜂鸣器
uchar code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff}
uchar data display[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
uchar code scan_bit[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
/*********************************************************
延时函数
*********************************************************/
void Delay(uint num)//延时函数
{
while( --num )
}
/*********************************************************
蜂鸣器响一声
**********************************************************/
void beep()
{
unsigned char y
for (y=0y<150y++)
{
Delay(50)
BEEP=!BEEP //BEEP取反
}
BEEP=1 //关闭蜂鸣器
}
/********************************************************
显示函数
*********************************************************/
play()
{
uchar i
for(i=0i<8i++)
{
P0=LEDData[display[i]] //显示个位
P2=scan_bit[i]
if(scan_bit[i]==0xbf)
DIN=0 //加小数点
Delay(100)
}
P2=0xff//关闭显示
}
/********************************************************
键延时函数
*********************************************************/
key_time()
{
uchar k
for(k=0k<15k++)
play()
}
/********************************************************
主函数
*********************************************************/
main()
{
uchar j
P0=0xff
P2=0xff
Count=0x00
TMOD=0x01
TH0=0x4cTL0=0x00 //50ms定时
EA=1ET0=1
while(1)
{
if(K1==0)
{
beep()
key_time()
TR0=1 //启动中断
}
if(K2==0)
{
beep()
key_time()
TR0=0 //停止中断
}
if(K4==0)
{
beep()
key_time()
for(j=0j<8j++)
display[j]=0x00 //计时单元清零
}
play()
}
}
/*********************************************************
Time0中断函数
**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c //50ms定时
TL0=0x00
Count++
if(Count==2)
{
Count=0
display[0]++//0.1S
}
if(display[0]==10)
{
display[0]=0
display[1]++//个位
}
if(display[1]==10)
{
display[1]=0
display[2]++//十位
}
if(display[2]==10)
{
display[2]=0
display[3]++//百位
}
if(display[3]==10)
{
display[3]=0
display[4]++//千位
}
if(display[4]==10)
{
display[4]=0
display[5]++//万位
}
if(display[5]==10)
{
display[5]=0
display[6]++ //十万位
}
if(display[6]==10)
{
display[6]=0
display[7]++ //百万位
}
if(display[7]==10)
{
display[7]=0
}
}
/*********************************************************/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)