① 51單片機計算器,運算部分和結果顯示怎麼寫
要求還不低,i簡單的我有,不能實現混合運算比較
主程序如下:
void main()
{ while(1)
{
c=1;
while(c<7)//輸入第1個6 位數
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case 1:b1=keyval; break;
case 2:b2=keyval; break;
case 3:b3=keyval; break;
case 4:b4=keyval; break;
case 5:b5=keyval; break;
case 6:b6=keyval; break;
}
c++;
}
display(b1,b2,b3,b4,b5,b6);
}
while(c==7) //輸入計算符號
{
keyval=keyscan();
if(keyval>=10)
{
d=keyval;
}
c=1;
}
while(c<7) //輸入第2個6 位數
{
keyval=keyscan();
if(keyval<10)
{
switch(c)
{
case 1:d1=keyval; break;
case 2:d2=keyval; break;
case 3:d3=keyval; break;
case 4:d4=keyval; break;
case 5:d5=keyval; break;
case 6:d6=keyval; break;
}
c++;
}
display(d1,d2,d3,d4,d5,d6);
}
P1=0;
bb= b1*100000+b2*10000+b3*1000+b4*100+b5*10+b6;
dd=d1*100000+d2*10000+d3*1000+d4*100+d5*10+d6;
while(keyval!=15) //等待按下"="號
{
keyval=keyscan();
}
delay(100);
switch(d1)//根據輸入的運算符,作不同的運算
{
case 10:ee=bb+dd; break;//加
case 11:
flag1=0;
if(bb>=dd)//減
{
ee=bb-dd;
flag1=1;;//flag 是正負號標志
}
else ee=bb-dd;
break;
case 12:ee=bb*dd; break;//乘
case 13:ee=bb/dd; break; //除
}
f1=ee/100000%10;;// 分離個十百千萬
f2=ee/10000%10;
f3=ee/1000%10;
f4=ee/100%10;
f5=ee/10%10;
f6=ee%10;
display(f1,f2,f3,f4,f5,f6);//顯示運算結果
}
}
② 用單片機設計簡易計算器
給你些子程序,自己看著湊吧。呵呵。有了這些,寫出來應該不難了。
;@@@@@@@@@雙位元組整數運算@@@@@@@@@@@@@@@@@@
;***********雙位元組無符號加法**************
;入口:R6(H),R7,R4(H),R5,出口:和R6(H),R7(L)
UADD: MOV A,R7
ADD A,R5
MOV R7,A
MOV A,R6
ADDC A,R4
MOV R6,A
RET
;***********雙位元組無符號減法**************
;入口:被減數R6(H),R7(L),減數R4(H),R5(L),出口:差R6(H),R7(L)
CLR C
MOV A,R7
SUBB A,R5
MOV R7,A
MOV A,R6
SUBB A,R4
MOV R6,A
RET
;***********雙位元組無符號乘法**************
;入口:R6(H),R7(L),R4(H),R5(L),出口:積R6(H),R7(L)
UMUL: MOV A,R7
MOV B,R5
MUL AB
MOV R0,B
XCH A,R7
MOV B,R4
MUL AB
ADD A,R0
XCH A,R6
MOV B,R5
MUL AB
ADD A,R6
MOV R6,A
RET
;***********雙位元組無符號除法*****************
;入口:R6(H),R7(L),R4(H),R5(L),出口:商R6(H),R7(L),余R4(H),R5(L)
;影響:R2,R3,
;堆棧需求:1
UDIV: CLR C
CLR A
MOV R2,A
MOV R3,A
MOV B,#10H
MOVBIT: MOV A,R7;R6、R7中數據左移一位到R2、R3中,C到R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
CLR C ;R2R3-R4R5
MOV A,R3
SUBB A,R5
PUSH Acc
MOV A,R2
SUBB A,R4
JBC Cy,MOVBIT0;不夠減,清C繼續左移
MOV R2,A;夠減,存回余數並置位C
POP Acc
MOV R3,A
SETB C
SJMP MOVBIT1
MOVBIT0: POP Acc
MOVBIT1: DJNZ B,MOVBIT
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R2
MOV R4,A
MOV A,R3
MOV R5,A
RET
(7) 標號: DIVD 功能:雙位元組二進制無符號數除法
入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
出口信息:OV=0 時,雙位元組商在R2、R3中,OV=1 時溢出。
影響資源:PSW、A、B、R1~R7 堆棧需求: 2位元組
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙位元組商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
③ 單片機計算器C語言程序
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:多功能計算器 **
//**<功能>:可以進行6位數以內正整數的加減乘除運算,以及計時器和自定義倒計時功
*
//* ******************************頭文件及宏定義************************** *
//* *
//*************************************************************************************************
#include "includes.h"
#define TIME0H 0xFC
#define TIME0L 0x18 //定時器0溢出時間:5ms
#define TIME1H 0x44
#define TIME1L 0x80 //定時器1溢出時間:48ms
//*************************************************************************************************
//* *
//* ********************************全局變數****************************** *
//* *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器0定時刷新LED計數>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned long ul_Number=0; //LCD實時顯示數字。
unsigned char uca_ShowCustom[6]={0x88,0x83,0xC6,0xA1,0x86,0x84};
//存放自定義顯示字元。
unsigned char uc_DisCount=1; //LCD時事刷新計數。
bit b_ShowMode=0; //顯示模式標志位。
//0--數字模式,將要顯示的數字賦給ul_Number便可時事顯示數值,
// 默認為數字模式;
//1--自定義模式,該模式下自定義字元顯示。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器1計數刷新定時(計時模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_TimeCount=1; //定時器1定時計數。
bit b_ClockStart=0; //定時器1顯示計數標志位。
extern bit b_ClockOppose; //TimeOppose.c
extern unsigned long ul_ClockOppose;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動標志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //鍵盤防抖動標志位。
//當按鍵中斷產生時,首先判斷此位。
//0--執行鍵盤掃描及鍵碼處理程序;1--不執行。
bit b_KillShock=0; //防抖標志清除位:0--不清除;1--清除。
unsigned char uc_KillCount=1; //抖動標志清除計數,使用定時器1。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD閃爍顯示報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_LCDClean=0; //通過設置b_LCDClean為1便可啟動延時清空LCD顯示。
unsigned char uc_CleanCount=1; //延遲時間可在T1中斷中設定。
unsigned char uc_ReportSymbol;
bit b_ReportFlash=0;
unsigned char uca_FlashBlank[]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
//*************************************************************************************************
//* *
//* ********************************主函數****************************** *
//* *
//*************************************************************************************************
void main()
{
P2=0x0F; //初始化鍵盤介面。
TMOD=0x11; //定時器0:模式一;定時器0:模式一.
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器0,用於LCD刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME0H;
TL0=TIME0L;
TR0=1; //開啟定時器0
ET0=1; //開定時器0中斷
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定時器1,用於1s計時 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //開啟定時器1
ET1=1; //開定時器1中斷
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中斷0,用於執行鍵盤掃描和鍵處理程序>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; //外部中斷0,中斷方式:下降沿
EX0=1; //開啟外部中斷0
PT0=1; //把定時器0溢出中斷設為高優先順序。
EA=1; //開啟總中斷
while(1);
}
//*************************************************************************************************
//* *
//* ***************************外部中斷0,調用鍵盤掃描程序************************* *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
EX0=0; //在鍵掃描處理時,關閉外部中斷0,防抖動。
if(b_KeyShock==0)
{
vKeyProcess(ucKeyScan()); //當判斷有按鍵按下時,掃描鍵盤,並把掃描結果進行處理。
b_KeyShock=1; //設置防抖動標志。
}
else b_KeyShock=0; //如果有抖動則不執行鍵掃描,恢復防抖動標志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<設置防抖動清除標志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖動標志位開啟則開啟防抖動標志清除位,
//300ms後清除防抖動標志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復鍵掃描處理前初始狀態 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
P2=0x0F; //恢復P2口。
EX0=1; //恢復按鍵中斷。
}
//*************************************************************************************************
//* *
//* ****************定時器1中斷,用於計時功能和防抖動標志清除以及顯示報告**************** *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<計時模式計數刷新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_ClockStart==1) //當計時模式開啟式,如計時處於運行狀態則執行定時計數增加。
{
if(b_ClockOppose==0) //正常計時。
{
if(uc_TimeCount%21==0)
{
uc_TimeCount=1;
ul_Number++;
}
else uc_TimeCount++;
}
else
{ //倒計時模式。
if(uc_TimeCount%21==0)
{
uc_TimeCount=1;
if(ul_ClockOppose>0)
{
ul_ClockOppose--;
ul_Number=ul_ClockOppose;
}
else
{
b_ClockStart=0;
uc_ReportSymbol=7;
b_LCDClean=1;
}
}
else uc_TimeCount++;
}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖動標志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KillShock==1)
{
if(uc_KillCount%5==0) //當防抖動標志位為1時,計時300ms後清除抖動標志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=1;
}
else uc_KillCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<LCD顯示報告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_LCDClean==1)
{
if(uc_CleanCount==1)
{
EX0=0; //關閉鍵盤中斷,此時按鍵無效。
vShowReport(uc_ReportSymbol);
b_ShowMode=1;
}
if(uc_CleanCount%40==0) //通過設置b_LCDClean為1便可啟動延時清空LCD顯示。
{
b_LCDClean=0; //關閉清零標志位,清零結束。
uc_CleanCount=1; //恢復清零計數為初始值1.
b_ShowMode=0; //恢復顯示模式為默認的數字模式。
b_ReportFlash=0;
EX0=1; //重新開啟鍵盤中斷。
}
else
{
//<<<<<<<<<<<<<<<<<<<<<<<<<實現閃爍報告功能>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(uc_CleanCount%7==0)
{
if(b_ReportFlash==0)
{
vCharCopy(uca_FlashBlank);
b_ReportFlash=1;
}
else
{
vShowReport(uc_ReportSymbol);
b_ReportFlash=0;
}
}
uc_CleanCount++;
}
}
TH1=TIME1H;
TL1=TIME1L;
}
//*************************************************************************************************
//* *
//* ***************************定時器0,定時刷新LED************************* *
//* *
//*************************************************************************************************
void vTimer0(void) interrupt 1
{
if(b_ShowMode==0)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<數字模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{
vShowOneNum(*(pucLedNum(ul_Number)+uc_DisCount),6-uc_DisCount); //在LCD上顯示1位數字。
if(uc_DisCount==5)
uc_DisCount=0; //定時器0在每次被觸發時,改變LCD顯示。
else uc_DisCount++; //從第一位到第六位循環顯示。
}
else
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<自定義模式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{
vShowCustom(uca_ShowCustom[uc_DisCount],uc_DisCount);
if(uc_DisCount==5)
uc_DisCount=0; //定時器0在每次被觸發時,改變LCD顯示。
else uc_DisCount++; //從第一位到第六位循環顯示。
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢復定時器0初始狀態 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH0=TIME0H;
TL0=TIME0L;
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:鍵盤掃描子程序 **
//**<功能>:當有外部中斷0時調用此函數,使用列掃描的方式獲取鍵碼,鍵碼由2位數字組成。高位為行號 **
//** 低位為列號。 **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************頭文件及宏定義************************** *
//* *
//*************************************************************************************************
#include <at89x51.h>
#define SCANPORT P2 //4×4鍵盤掃描埠,低4位是行線,高4位是列線。
//採用逐列掃描的方法,無按鍵時,低4位輸出1,高4位輸出0。
//當有按鍵時,高4位輸出掃描電位,低4位輸入掃描結果。
//*************************************************************************************************
//* *
//* ********************************全局變數****************************** *
//* *
//*************************************************************************************************
unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //列線掃描電壓,分為第1,2,3,4根列線
//為低電平,其他為高電平。
//*************************************************************************************************
//* *
//* ********************************函數實現****************************** *
//* *
//*************************************************************************************************
unsigned char ucKeyScan()
{
unsigned char ucTemp=0; //掃描狀態暫存。
unsigned char ucRow=0,ucLine=0; //行號,列號。
for(ucLine=0;ucLine<4;ucLine++) //列掃描
{
SCANPORT=uca_LineScan[ucLine]; //輸出掃描電位。
ucTemp=SCANPORT&0x0F; //輸入掃描電位,並屏蔽高4位。
if(ucTemp!=0x0F)
{ //判斷該列是否有按鍵按下。
switch(ucTemp)
{
case 0x0E: ucRow=10;break; //如果有,則判斷行號。
case 0x0D: ucRow=20;break;
case 0x0B: ucRow=30;break;
case 0x07: ucRow=40;break;
default: ucRow=50;break;
}
break;
}
}
return ucRow+ucLine+1; //返回按鍵編碼。格式為2位數,高位為行號,低位為列號。
}
/////////////////////////////////////////////////////////////////////
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:計算器處理主程序,根據計算器的輸入狀態分派不同的函數對按鍵進行處理。 **
//**<功能>:當b_WorkMode=0是,若有鍵按下則調用此函數對鍵碼進行處理。 **
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************頭文件及宏定義************************** *
//* *
//*************************************************************************************************
#include "CalReady.h"
//*************************************************************************************************
//* *
//* ********************************全局變數****************************** *
//* *
//*************************************************************************************************
extern unsigned long ul_Number; //LCE顯示數據,LCD實時顯示該數字。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<工作模式(默認為計算器模式)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
extern bit b_WorkMode; //0--計算器模式;
//1--計時模式。
//定義在KeyProcess.c中。
unsigned char uc_ModeChange=0;
extern bit b_LCDClean;
extern unsigned char uc_ReportSymbol;
unsigned long ul_NumberOne=0; //第一個數
unsigned long ul_NumberTwo=0; //第二個數
unsigned char uc_Operator=0; //運算符
unsigned long ul_Result=0; //運算結果
unsigned char uc_NumPointer=1; //計算狀態
//*************************************************************************************************
//* *
//* *******************************計算器處理主函數****************************** *
//* *
//*************************************************************************************************
void vCalculator(unsigned char ucKeyCode)
{
if(ucKeyCode==41) //判斷按鍵是不是'NO/C'。
{
if(uc_NumPointer==1) //如果是『NO/C』鍵則判斷手機否是狀態一。
{
if(uc_ModeChange==2) //如果是狀態一則看uc_ModeChange是不是2。
{
uc_ModeChange=0; //如果是2則計時器模式。
b_WorkMode=1;
uc_ReportSymbol=3; //閃爍顯示:-CHAG-1。表明正在切換狀態。
b_LCDClean=1;
}
else
{
uc_ModeChange++; //如果uc_ModeChange不是2則加一。
ul_NumberOne=0; //清除所有數據,將所有數據恢復到狀態一。
ul_NumberTwo=0;
ul_Number=0;
uc_NumPointer=1;
}
}
else
{
ul_NumberOne=0; //清除所有數據,將所有數據恢復到狀態一。
ul_NumberTwo=0;
ul_Number=0;
uc_NumPointer=1;
}
}
else
{ //如果不是「NO/C」鍵,首先將uc_ModeChange清零。
uc_ModeChange=0;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<根據不同狀態分派不同的鍵處理函數>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
switch(uc_NumPointer)
{
case 1:
vCalReadyOne(ucKeyCode); //進入狀態一。
break;
case 2:
vCalReadyTwo(ucKeyCode); //進入狀態二。
break;
case 3:
vCalReadyThree(ucKeyCode); //進入狀態三。
break;
default:break;
}
}
}
④ 單片機實訓要求:四則運算計算器的設計與製作
唉差蔽···前天替人編寫了一個0~99的加、減、乘虛友州、除運算;程序和模擬···你可告悉以拿去看看····自己再加程序功能···要就留郵箱吧····
⑤ 用51單片機實現一個簡單計算器的功能
下面是我以前用來顯示9999秒倒計時的原程序,僅供學習,版權所有,侵權不究。 #include <REGX51.H> #include <./stdint.h> #include <ABSACC.H> #include<AT89X51.H> #include <INTRINS.H> //------------------------------ #define TH_10MS (65536-50000)/256 #define TL_10MS (65536-50000)%256 //------------------------------------------ #define led12 XBYTE[0xf7ff] //led1與led2數碼管 #define led34 XBYTE[0xefff] //led3與led4數碼管 #define led_light P3_7 #define keyst P1_0 #define keyclk P1_1 volatile struct _clock { uint8_t t_s;//秒 uint8_t t_ms;//分秒 uint8_t led_lightf : 1;//中間燈 uint8_t keyf_st : 1; //開停鍵標志 uint8_t keyf_clk : 1; //清0鍵標志 uint8_t clockf_st : 1; //開始計時標志 #define STOP 0 #define START 1 uint8_t : 0; }clock; //-----------------delay----------------------------- void delay_10ms() { uint8_t i, j; for(i=0; i<100; i++) for(j=0; j<100; j++); } //-------------------10進制顯示----------------------- void display_val(uint8_t data_l, uint8_t data_r) { uint8_t led_tmp12, led_tmp34; //取右邊分秒 led_tmp12 = (data_r/10)%10; led_tmp12 <<=4; led_tmp12 |= (uint8_t)(data_r%10); //取左邊秒 led_tmp34 = (data_l/10)%10; led_tmp34 <<=4; led_tmp34 |= data_l%10; led12 = led_tmp12;//送顯示 led34 = led_tmp34; } //------------------------初始化-------------- void clr_data() { clock.t_s = 99; clock.t_ms = 99; clock.led_lightf = 0; clock.keyf_st = 0; clock.keyf_clk = 0; clock.clockf_st = 0; TR0 = 0; //關定時器 display_val(99,99); led_light = 0; } void init_sys() { clr_data(); //定時器0設置 TMOD = 0x01; //定時器0設為MAOD1 TCON = 0x00; //清標志位 TH0 = TH_10MS; TL0 = TL_10MS; //TR0 = 1; //開定時器 //IE = 0x8a; //開定時中斷0,1與總開關 EA = 1; ET0 = 1; } //--------------------鍵盤掃描----------------- void key_scan() { bit keyf; keyf = keyst & keyclk; if(keyf) goto error; delay_10ms(); keyf = keyst & keyclk; if(keyf) goto error; clock.keyf_st = !keyst; clock.keyf_clk = !keyclk; do { keyf = keyst & keyclk; } while(!keyf); error: return ; } //--------------------鍵盤處理------------------- void key_deal() { if(clock.keyf_st) { if(clock.clockf_st == STOP) TR0 = 1; else TR0 = 0; clock.clockf_st = ~clock.clockf_st; clock.keyf_st = 0; } if(clock.keyf_clk) { clr_data(); clock.keyf_clk = 0; } } // -------------------main------------------------ void main() { init_sys(); while(1) { key_scan();//鍵盤掃描 key_deal();//鍵盤處理 } } //----------------------定時中斷0----------------- void t0_interrupt() interrupt 1 { static t0_count = 0 , t_1s = 0; TR0 = 0; t_1s++; if(t_1s==20) { t_1s=0; clock.t_ms--; if(clock.t_ms == -1) clock.t_ms = 99; t0_count++; if(t0_count == 100) { t0_count = 0; clock.t_s--; if(clock.t_s == -1) clock.t_s = 99; } display_val(clock.t_s, clock.t_ms); clock.led_lightf = ~clock.led_lightf; led_light = clock.led_lightf; } TH0 = TH_10MS; TL0 = TL_10MS; TR0 = 1; }