久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2127|回復: 9
收起左側

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

[復制鏈接]
ID:1045601 發表于 2023-8-7 21:52 來自手機 | 顯示全部樓層 |閱讀模式
1..怎么用按鍵k3關開數碼管。我思路是關定時器中斷。可效果不理想,必須加p3= 0x00,數碼管才沒有殘影,應該是刷新太塊,按鍵關不斷。有沒有好辦法關開數碼管。
2..k3關閉數碼管顯示時程序所有停止,開數碼管顯示時程序從頭開始運行,程序該怎么寫?
3.程序有些亂,我新手寫程序不久,能看懂的老師幫忙看看應該怎么解決,謝謝

單片機源程序如下:
#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; //時間切換鍵
sbit k2 = P1^6; //啟動按鍵
sbit k3 = P5^5;    //開關
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;  // 動態掃描的索引
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;                //設置定時初始值
    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;            //定時器時鐘12T模式
    T2L = 0xFB;                //設置定時初始值
    T2H = 0xFF;                //設置定時初始值
    AUXR|=0x10;
}

回復

使用道具 舉報

ID:277550 發表于 2023-8-8 10:12 | 顯示全部樓層
不想顯示,關停定時器2、且設置P3  = 0x00;
回復

使用道具 舉報

ID:712097 發表于 2023-8-8 10:12 | 顯示全部樓層
1. 只關定時器中斷不行,要不關段碼(P3=0x00應該就是關段碼),要不關位碼。
2. k3關閉數碼管顯示時程序所有停止,- 關顯示后,做一個死循環while(1),只保留外部中斷,開數碼管顯示時,外部中斷喚醒,中斷函數中做一個軟件復位,這樣程序就從頭開始運行了。
回復

使用道具 舉報

ID:213173 發表于 2023-8-8 19:18 | 顯示全部樓層
樓主首先要說清楚程序要實現什么功能,再談遇到什么具體問題。用5us中斷掃描數碼管肯定是錯誤的,你這個段碼寫的怪怪的,不清楚你的數碼管硬件連接關系。STC15系列的定時器2是自動重裝,無需在中斷中對T2L、T2H賦值。
回復

使用道具 舉報

ID:1045601 發表于 2023-8-10 12:51 來自手機 | 顯示全部樓層
devcang 發表于 2023-8-8 10:12
不想顯示,關停定時器2、且設置P3  = 0x00;

謝謝建議
回復

使用道具 舉報

ID:1045601 發表于 2023-8-10 12:53 來自手機 | 顯示全部樓層
chxelc 發表于 2023-8-8 10:12
1. 只關定時器中斷不行,要不關段碼(P3=0x00應該就是關段碼),要不關位碼。
2. k3關閉數碼管顯示時程序 ...

謝謝建議
回復

使用道具 舉報

ID:1045601 發表于 2023-8-10 13:08 來自手機 | 顯示全部樓層
wulin 發表于 2023-8-8 19:18
樓主首先要說清楚程序要實現什么功能,再談遇到什么具體問題。用5us中斷掃描數碼管肯定是錯誤的,你這個段 ...

代碼也不是很亂就是不夠簡潔,數碼管與硬件關系看段碼位碼就明白了啊。
謝謝你的建議
回復

使用道具 舉報

ID:1064915 發表于 2023-8-10 14:21 | 顯示全部樓層
硬件原理圖,一塊貼出來
回復

使用道具 舉報

ID:213173 發表于 2023-8-10 19:55 | 顯示全部樓層
702724152 發表于 2023-8-10 13:08
代碼也不是很亂就是不夠簡潔,數碼管與硬件關系看段碼位碼就明白了啊。
謝謝你的建議

用一個定時器就可以搞定
  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; //時間切換鍵
  9. sbit k2 = P1^6; //啟動按鍵
  10. sbit k3 = P5^5;    //開關
  11. sbit fm = P1^7;    //蜂鳴器
  12. sbit mos= P1^4;    //mos管
  13. //共陰數碼管段碼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;//中斷計數
  18. uchar knum=0;//切換鍵值
  19. bit flag_ms=0;//1ms中斷標志
  20. bit start=0;//開始標志
  21. bit kn=0;//開關標志
  22. //初始化定時器T0
  23. void Timer0_Init(void)                //1毫秒@11.0592MHz
  24. {
  25.         TMOD |= 0x01;                        //設置定時器模式
  26.         TL0 = 0x66;                                //設置定時初始值
  27.         TH0 = 0xFC;                                //設置定時初始值
  28.         TR0 = 1;                                //定時器0開始計時
  29.         ET0 = 1;
  30.         EA  = 1;
  31. }
  32. //顯示函數
  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. //主函數
  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中斷服務函數
  135. void InterruptTimer0() interrupt 1
  136. {
  137.         TL0 = 0x66;                                //設置定時初始值
  138.         TH0 = 0xFC;                                //設置定時初始值
  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. }
復制代碼



回復

使用道具 舉報

ID:1045601 發表于 2023-8-11 14:31 來自手機 | 顯示全部樓層
wulin 發表于 2023-8-10 19:55
用一個定時器就可以搞定

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久久久丝袜 | 仙人掌旅馆在线观看 | 国产精品久久久久久妇女6080 | 国产日韩欧美在线观看 | 99reav| 国产成人一区二区三区精 | www.啪啪.com| 97精品超碰一区二区三区 | 日批日韩在线观看 | 一区二区三区四区国产 | 美女一级毛片 | 久久久99国产精品免费 | 欧美a级成人淫片免费看 | 成人免费在线播放视频 | www日日日 | 欧美精品乱码99久久影院 | 伊人伊人 | 亚洲成人精品 | 亚洲欧美视频 | 日韩视频在线播放 | 国产一区2区 | 日韩在线高清 | 日本一区二区三区在线观看 | 成人免费视频一区 | 中文字幕在线免费观看 | 天天射中文 | 成人免费小视频 | 成人影院av | 国产乱码精品1区2区3区 | 二区视频| 国产成人精品久久二区二区91 | 日产久久 | 雨宫琴音一区二区在线 | 日本一二三区电影 | 理论片午午伦夜理片影院 | 精品国产乱码久久久久久蜜退臀 | 毛片黄| 免费看的黄网站 | 日韩精品一区在线 | 精品美女视频在免费观看 | 日韩欧美在线一区 |