单片机汇编程序题:AT89C51中p3.2接开关1,p3.3接开关2,当开关1,2全都断开时运行主程序,p1口的8个LED从

默认分类 未结 1 1260
0o柳小兔o0
0o柳小兔o0 2023-03-22 09:36
相关标签:
1条回答
  • 2023-03-22 10:18

    这样就有点似按键计数器吧,这里给出《51单片机C语言创新教程》温子祺著的光盘源码。/*实验名称:按键计数器实验 *描 述:每个1秒,计数值自动加1(若超过9999,那么计数值重新计数), 然后通过数码管来显示。如果想修改计数值, 可以通过按键来进行操作, 同时当前位会以小数点来标识。 *作 者:温子祺 *修改日期:2010/5/4 */#include "stc.h"typedef unsigned char UINT8;typedef unsigned intUINT16;typedef unsigned long UINT32; typedef char INT8;typedef int INT16;typedef long INT32; #define TIMER0_INITIAL_VALUE 5000#define SEG_PORT P0#define KEY_PORT P1#define KEY_MASK 0x0F#define KEY_SEARCH_STATUS 0 //查询按键状态#define KEY_ACK_STATUS 1 //确认按键状态#define KEY_REALEASE_STATUS 2 //释放按键状态#define KEY1 1#define KEY2 2#define KEY3 3#define KEY4 4#define HIGH 1#define LOW 0#define ON 1#define OFF 0#define LS164_DATA(x) {if((x))P0_4=1;else P0_4=0;} #define LS164_CLK(x) {if((x))P0_5=1;else P0_5=0;} UINT8 Timer0IRQEvent=0;UINT8 Time1SecEvent=0;UINT8 TimeCount=0;UINT8 SegCurPosMark=0;UINT16 CounterValue=0; UINT8 SegCurSel=0;code UINT8 SegCode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; UINT8 SegBuf[4] ={0};code UINT8 SegSelTbl[4]={0x07,0x0b,0x0d,0x0e};UINT8 bSetTime=0;void LS164Send(UINT8 byte){ UINT8 j; for(j=0;j<=7;j++) { if(byte&(1<<(7-j)))//仿真 { LS164_DATA(HIGH); } else { LS164_DATA(LOW); } LS164_CLK(LOW); LS164_CLK(HIGH); }}void RefreshDisplayBuf(void) //刷新显示缓存{SegBuf[0] =CounterValue%10; SegBuf[1] =CounterValue/10%10; SegBuf[2] =CounterValue/100%10;SegBuf[3] =CounterValue/1000%10; }void SegDisplay(void){ UINT8 t; SEG_PORT = 0x0F; if(bSetTime) {if(SegCurSel==SegCurPosMark) { #if 0 if(!(TimeCount%50)) { t = SegCode[SegBuf[SegCurSel]]; } #else t = SegCode[SegBuf[SegCurSel]]&0x7F; #endif }else { t = SegCode[SegBuf[SegCurSel]]; } } else { t = SegCode[SegBuf[SegCurSel]]; } LS164Send(t); SEG_PORT = SegSelTbl[SegCurSel]; if(++SegCurSel>=4) { SegCurSel=0; } }void TimerInit(void){ TH0 = (65536-TIMER0_INITIAL_VALUE)/256; TL0 = (65536-TIMER0_INITIAL_VALUE)%256; //定时1MS TMOD = 0x01; }void Timer0Start(void){ TR0 = 1;//启动计时器1 ET0 = 1;}void Timer0Stop(void){ TR0 = 0;//启动计时器1 ET0 = 0; }void PortInit(void){ P0=P1=P2=P3=0xFF;}UINT8 KeyRead(void){static UINT8 KeyStatus=KEY_SEARCH_STATUS,KeyCurPress=0; UINT8 KeyValue; UINT8 i=0;KeyValue=(~KEY_PORT)&KEY_MASK; switch(KeyStatus) {case KEY_SEARCH_STATUS: { if(KeyValue) { KeyStatus=KEY_ACK_STATUS; } return 0; } break;case KEY_ACK_STATUS: { if(!KeyValue) //没有按键按下 { KeyStatus=KEY_SEARCH_STATUS; } else { for(i=0;i<4;i++) //搜索哪个按键按下 { if(KeyValue & (1<=4) { SegCurPosMark=0; } } break; case KEY3: { if(!bSetTime)break; if(CounterValue>=9999)CounterValue=0; if (SegCurPosMark==0)CounterValue+=1; else if(SegCurPosMark==1)CounterValue+=10; else if(SegCurPosMark==2)CounterValue+=100; else CounterValue+=1000; } break; case KEY4: { if(!bSetTime)break; if(CounterValue<=0)CounterValue=9999; if (SegCurPosMark==0)CounterValue-=1; else if(SegCurPosMark==1)CounterValue-=10; else if(SegCurPosMark==2)CounterValue-=100; else CounterValue-=1000; } break; default:break; } } else if(Time1SecEvent) { Time1SecEvent=0; if(!bSetTime) { if(++CounterValue>=9999) { CounterValue=0; } } } }}void Timer0IRQ(void) interrupt 1 {ET0= 0;TH0 = (65536-TIMER0_INITIAL_VALUE)/256; TL0 = (65536-TIMER0_INITIAL_VALUE)%256; //定时10MSTimer0IRQEvent=1; SegDisplay(); if(++TimeCount>=200) { TimeCount=0; Time1SecEvent=1; }ET0= 1;}====================================================================坐等给分!

    0 讨论(0)
提交回复