找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2224|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

幫忙看看單片機(jī)程序按鍵k3該怎么配置?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1045601 發(fā)表于 2023-8-7 21:52 來(lái)自手機(jī) | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1..怎么用按鍵k3關(guān)開(kāi)數(shù)碼管。我思路是關(guān)定時(shí)器中斷?尚Ч焕硐,必須加p3= 0x00,數(shù)碼管才沒(méi)有殘影,應(yīng)該是刷新太塊,按鍵關(guān)不斷。有沒(méi)有好辦法關(guān)開(kāi)數(shù)碼管。
2..k3關(guān)閉數(shù)碼管顯示時(shí)程序所有停止,開(kāi)數(shù)碼管顯示時(shí)程序從頭開(kāi)始運(yùn)行,程序該怎么寫(xiě)?
3.程序有些亂,我新手寫(xiě)程序不久,能看懂的老師幫忙看看應(yīng)該怎么解決,謝謝

單片機(jī)源程序如下:
#include <STC15F2K60S2.H>
#define uint unsigned int
sbit ADDR0 = P1^0; //位碼
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit k1 = P5^4; //時(shí)間切換鍵
sbit k2 = P1^6; //啟動(dòng)按鍵
sbit k3 = P5^5;    //開(kāi)關(guān)
sbit fm = P1^7;    //蜂鳴器
sbit mos= P1^4;    //mos管
unsigned char knum,kn;   
bit k1f=0;
bit k2f=0;
unsigned char code LedChar[] = {0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x7b,0xa8,0xfb,0xfa};
unsigned char LedBuff[4] = {0,0,0,0};
unsigned char i = 0;  // 動(dòng)態(tài)掃描的索引
unsigned char sec = 10,ms=0;
unsigned char sec1 = 30,ms1=0;
unsigned char sec2 = 0,ms2=03;
unsigned char sec3 = 0,ms3=05;
unsigned char sec4 = 0,ms4=10;
unsigned int cnt=0;
void Timer2_Init();
void Delay1ms(unsigned char c)   //誤差 0us
{
    unsigned char a,b;
    for(;c>0;c--)
       { for(b=199;b>0;b--)
            for(a=1;a>0;a--);
     }
}
void keyscan()
{     
if(k1==0) {Delay1ms(10);if(k1f==0)
{     k1f=1;  knum++;
if(knum==4)  knum=0; } }
      else k1f=0;   
if(k2==0) {Delay1ms(10);if(k2==0)
{ TR0=!TR0;mos=!mos;  while(k2==0);} }
if(k3==0) {Delay1ms(10);if(k2f==0)
{     k2f=1; kn++;
if(kn==2)  kn=0; } }
      else k2f=0;}      
void main()
{
P3M0 = 0xff;
P3M1 = 0x00;
Timer2_Init();   
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
while(1)
{
if(kn==0){IE2&=~0x04;EA=0;P3=0x00;}
if(kn==1){IE2|=0x04;EA=1;}
  keyscan();
if(knum==0)
  { LedBuff[0] = LedChar[ms/10];
   LedBuff[1] = LedChar[ms  % 10];
   LedBuff[2] = LedChar[sec % 10];
   LedBuff[3] = LedChar[sec /10]; }   
if(knum==1)
  { LedBuff[0] = LedChar[ms1/10];
   LedBuff[1] = LedChar[ms1  % 10];
   LedBuff[2] = LedChar[sec1 % 10];
   LedBuff[3] = LedChar[sec1 /10];     }  
if(knum==2)
  { LedBuff[0] = LedChar[ms2/10];
   LedBuff[1] = LedChar[ms2  % 10];
   LedBuff[2] = LedChar[sec2 % 10];
   LedBuff[3] = LedChar[sec2 /10];      }
if(knum==3)
  { LedBuff[0] = LedChar[ms3/10];
   LedBuff[1] = LedChar[ms3  % 10];
   LedBuff[2] = LedChar[sec3 % 10];
   LedBuff[3] = LedChar[sec3 /10];}
}
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
    if(cnt>=1000)
{ cnt=0;
switch(knum)
{case 0: sec--; if(sec==0) {sec = 10, ms=0; TR0=0;mos=1;fm=0;} break;
  case 1: sec1--;if(sec1==0){sec1 = 30,ms1=0;TR0=0;mos=1;fm=0;} break;
  case 2: if(ms2>0||sec2>0)   {if(ms2 > 0) {sec2--;if(sec2 >59){sec2 = 59;ms2--; }}else if(sec2 > 0)  { sec2--; }}
          if(sec2==0&&ms2==0){sec2=0;ms2=03;TR0=0;mos=1;fm=0;}break;
  case 3: if(ms3>0||sec3>0)   {if(ms3 > 0) {sec3--;if(sec3 >59){sec3 = 59;ms3--; }}else if(sec3 > 0)  { sec3--; }}
          if(sec3==0&&ms3==0){sec3=0;ms3=05;TR0=0;mos=1;fm=0;}break;
  default: break;
}
} }
void Timer2_Isr(void) interrupt 12
{
    T2L = 0xFB;                //設(shè)置定時(shí)初始值
    T2H = 0xFF;   
     P3 = 0x00;
switch (i)
{
  case 0:ADDR3=1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; P3= LedBuff[0];      i++; break;
  case 1:ADDR3=1; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; P3= LedBuff[1]+0x04; i++; break;
  case 2:ADDR3=1; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; P3= LedBuff[2];      i++; break;
  case 3:ADDR3=0; ADDR2 = 1; ADDR1 = 1; ADDR0 = 1; P3= LedBuff[3];      i=0; break;
}
}
void Timer2_Init(void)        //5微秒@12.000MHz
{
    AUXR &= 0xFB;            //定時(shí)器時(shí)鐘12T模式
    T2L = 0xFB;                //設(shè)置定時(shí)初始值
    T2H = 0xFF;                //設(shè)置定時(shí)初始值
    AUXR|=0x10;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:277550 發(fā)表于 2023-8-8 10:12 | 只看該作者
不想顯示,關(guān)停定時(shí)器2、且設(shè)置P3  = 0x00;
回復(fù)

使用道具 舉報(bào)

板凳
ID:712097 發(fā)表于 2023-8-8 10:12 | 只看該作者
1. 只關(guān)定時(shí)器中斷不行,要不關(guān)段碼(P3=0x00應(yīng)該就是關(guān)段碼),要不關(guān)位碼。
2. k3關(guān)閉數(shù)碼管顯示時(shí)程序所有停止,- 關(guān)顯示后,做一個(gè)死循環(huán)while(1),只保留外部中斷,開(kāi)數(shù)碼管顯示時(shí),外部中斷喚醒,中斷函數(shù)中做一個(gè)軟件復(fù)位,這樣程序就從頭開(kāi)始運(yùn)行了。
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2023-8-8 19:18 | 只看該作者
樓主首先要說(shuō)清楚程序要實(shí)現(xiàn)什么功能,再談?dòng)龅绞裁淳唧w問(wèn)題。用5us中斷掃描數(shù)碼管肯定是錯(cuò)誤的,你這個(gè)段碼寫(xiě)的怪怪的,不清楚你的數(shù)碼管硬件連接關(guān)系。STC15系列的定時(shí)器2是自動(dòng)重裝,無(wú)需在中斷中對(duì)T2L、T2H賦值。
回復(fù)

使用道具 舉報(bào)

5#
ID:1045601 發(fā)表于 2023-8-10 12:51 來(lái)自手機(jī) | 只看該作者
devcang 發(fā)表于 2023-8-8 10:12
不想顯示,關(guān)停定時(shí)器2、且設(shè)置P3  = 0x00;

謝謝建議
回復(fù)

使用道具 舉報(bào)

6#
ID:1045601 發(fā)表于 2023-8-10 12:53 來(lái)自手機(jī) | 只看該作者
chxelc 發(fā)表于 2023-8-8 10:12
1. 只關(guān)定時(shí)器中斷不行,要不關(guān)段碼(P3=0x00應(yīng)該就是關(guān)段碼),要不關(guān)位碼。
2. k3關(guān)閉數(shù)碼管顯示時(shí)程序 ...

謝謝建議
回復(fù)

使用道具 舉報(bào)

7#
ID:1045601 發(fā)表于 2023-8-10 13:08 來(lái)自手機(jī) | 只看該作者
wulin 發(fā)表于 2023-8-8 19:18
樓主首先要說(shuō)清楚程序要實(shí)現(xiàn)什么功能,再談?dòng)龅绞裁淳唧w問(wèn)題。用5us中斷掃描數(shù)碼管肯定是錯(cuò)誤的,你這個(gè)段 ...

代碼也不是很亂就是不夠簡(jiǎn)潔,數(shù)碼管與硬件關(guān)系看段碼位碼就明白了啊。
謝謝你的建議
回復(fù)

使用道具 舉報(bào)

8#
ID:1064915 發(fā)表于 2023-8-10 14:21 | 只看該作者
硬件原理圖,一塊貼出來(lái)
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2023-8-10 19:55 | 只看該作者
702724152 發(fā)表于 2023-8-10 13:08
代碼也不是很亂就是不夠簡(jiǎn)潔,數(shù)碼管與硬件關(guān)系看段碼位碼就明白了啊。
謝謝你的建議

用一個(gè)定時(shí)器就可以搞定
  1. #include <STC15F2K60S2.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit ADDR0 = P1^0; //位碼
  5. sbit ADDR1 = P1^1;
  6. sbit ADDR2 = P1^2;
  7. sbit ADDR3 = P1^3;
  8. sbit k1 = P5^4; //時(shí)間切換鍵
  9. sbit k2 = P1^6; //啟動(dòng)按鍵
  10. sbit k3 = P5^5;    //開(kāi)關(guān)
  11. sbit fm = P1^7;    //蜂鳴器
  12. sbit mos= P1^4;    //mos管
  13. //共陰數(shù)碼管段碼P3---5-7-3-1-0-6-4-2
  14. uchar code LedChar[] = {0xeb,0x88,0xb3,0xba,0xd8,0x7a,0x7b,0xa8,0xfb,0xfa};
  15. uchar LedBuff[4] = {0,0,0,0};
  16. char sec=10,ms=0;
  17. uchar cnt=0;//中斷計(jì)數(shù)
  18. uchar knum=0;//切換鍵值
  19. bit flag_ms=0;//1ms中斷標(biāo)志
  20. bit start=0;//開(kāi)始標(biāo)志
  21. bit kn=0;//開(kāi)關(guān)標(biāo)志
  22. //初始化定時(shí)器T0
  23. void Timer0_Init(void)                //1毫秒@11.0592MHz
  24. {
  25.         TMOD |= 0x01;                        //設(shè)置定時(shí)器模式
  26.         TL0 = 0x66;                                //設(shè)置定時(shí)初始值
  27.         TH0 = 0xFC;                                //設(shè)置定時(shí)初始值
  28.         TR0 = 1;                                //定時(shí)器0開(kāi)始計(jì)時(shí)
  29.         ET0 = 1;
  30.         EA  = 1;
  31. }
  32. //顯示函數(shù)
  33. void display()
  34. {
  35.         static uchar i;
  36.         P3=0x00;
  37.         switch(i)
  38.         {
  39.                 case 0: ADDR0 = 0; ADDR1 = 1;ADDR2 = 1;ADDR3 = 1;break;
  40.                 case 1: ADDR0 = 1; ADDR1 = 0;ADDR2 = 1;ADDR3 = 1;break;
  41.                 case 2: ADDR0 = 1; ADDR1 = 1;ADDR2 = 0;ADDR3 = 1;break;
  42.                 case 3: ADDR0 = 1; ADDR1 = 1;ADDR2 = 1;ADDR3 = 0;break;
  43.         }
  44.         P3=LedBuff[i];
  45.         i=++i%4;
  46. }
  47. //按鍵掃描
  48. void keys_can()
  49. {     
  50.         static uchar count=0;
  51.         static bit sign_key=0;

  52.         if(!k1||!k2||!k3)
  53.         {
  54.                 if(++count>=20 && sign_key==0)
  55.                 {
  56.                         sign_key=1;
  57.                         fm = 1;
  58.                         if(!k1 && !start && kn)
  59.                         {
  60.                                 knum++;
  61.                                 if(knum>=4)knum=0;
  62.                                 switch(knum)
  63.                                 {
  64.                                         case 0: sec=10;ms =0; break;
  65.                                         case 1: sec=30;ms= 0; break;
  66.                                         case 2: sec= 0;ms=30; break;
  67.                                         case 3: sec= 0;ms=50; break;
  68.                                 }
  69.                         }
  70.                         if(!k2 && !start && kn)
  71.                         {
  72.                                 switch(knum)
  73.                                 {
  74.                                         case 0: sec=10;ms =0; break;
  75.                                         case 1: sec=30;ms= 0; break;
  76.                                         case 2: sec= 0;ms=30; break;
  77.                                         case 3: sec= 0;ms=50; break;
  78.                                 }
  79.                                 cnt=0;
  80.                                 mos=0;
  81.                                 start=1;
  82.                         }
  83.                         if(!k3)
  84.                         {
  85.                                 kn=~kn;
  86.                                 if(!kn)
  87.                                 {
  88.                                         knum=0;
  89.                                         cnt=0;
  90.                                         mos=1;
  91.                                         start=0;
  92.                                         sec=10;
  93.                                         ms = 0;
  94.                                 }
  95.                         }
  96.                 }
  97.         }
  98.         else
  99.         {
  100.                 count=0;
  101.                 sign_key=0;
  102.         }
  103. }
  104. //主函數(shù)
  105. void main()
  106. {
  107.         P3M0 = 0xff;  
  108.         P3M1 = 0x00;
  109.         Timer0_Init();
  110.         while(1)
  111.         {
  112.                 if(flag_ms)
  113.                 {
  114.                         flag_ms=0;
  115.                         display();
  116.                         keys_can();
  117.                         if(kn)       
  118.                         {
  119.                                 LedBuff[0] = LedChar[ms%10];
  120.                                 LedBuff[1] = LedChar[ms/10];
  121.                                 LedBuff[2] = LedChar[sec%10]|0x04;
  122.                                 LedBuff[3] = LedChar[sec/10];  
  123.                         }
  124.                         else
  125.                         {
  126.                                 LedBuff[0] = 0x00;
  127.                                 LedBuff[1] = 0x00;
  128.                                 LedBuff[2] = 0x00;
  129.                                 LedBuff[3] = 0x00;
  130.                         }
  131.                 }
  132.         }
  133. }
  134. //T0中斷服務(wù)函數(shù)
  135. void InterruptTimer0() interrupt 1
  136. {
  137.         TL0 = 0x66;                                //設(shè)置定時(shí)初始值
  138.         TH0 = 0xFC;                                //設(shè)置定時(shí)初始值
  139.         if(start)
  140.         {
  141.                 if(++cnt>=10)//10ms
  142.                 {
  143.                         cnt=0;
  144.                         ms--;
  145.                         if(sec==0 && ms==0)
  146.                         {
  147.                                 start=0;
  148.                                 mos=1;
  149.                                 fm=0;
  150.                         }
  151.                         else if(ms<0)
  152.                         {
  153.                                 ms=99;
  154.                                 sec--;
  155.                         }
  156.                 }
  157.         }
  158.         flag_ms=1;
  159. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

10#
ID:1045601 發(fā)表于 2023-8-11 14:31 來(lái)自手機(jī) | 只看該作者
wulin 發(fā)表于 2023-8-10 19:55
用一個(gè)定時(shí)器就可以搞定

老師,學(xué)生這廂有禮了。膜拜大神,代碼已解決我想要的功能
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表