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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3764|回復: 9
打印 上一主題 下一主題
收起左側

怎樣修改一下單片機代碼,可以不用38譯碼器進行位定義?求大佬指點

[復制鏈接]
跳轉到指定樓層
樓主
150黑幣

單片機代碼奉上:
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;
  5. #define GPIO_KEY P1
  6. u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  7. u8 t0,KeyVal,Display[8],flag,flag1,flag2,flag3;
  8. u16 hour,minute,second;                                   
  9. //38譯碼器                                         
  10. sbit LSA=P2^2;
  11. sbit LSB=P2^3;
  12. sbit LSC=P2^4;

  13. //數碼管顯示函數
  14. void Showsmg();
  15. //延時函數
  16. void Delay(u16 i);
  17. //初始化函數
  18. void Init();
  19. //按鍵檢測
  20. void KeyDown();
  21. //按鍵處理
  22. void Keypross();
  23. //數據處理
  24. void Datapross();
  25. //按鍵數字處理
  26. void Numpross(u8 dat);
  27. //Up功能處理
  28. void Uppross();
  29. //Down功能處理
  30. void Downpross();
  31. //Func功能處理
  32. void Funcpross();
  33. //Enter功能處理
  34. void Enterpross();
  35. //Back功能處理
  36. void Backpross();


  37. void main(){
  38.         Init();
  39.         while(1){
  40.                 KeyDown();
  41.                 Keypross();
  42.                 Datapross();
  43.                 Showsmg();
  44.         }
  45. }

  46. //數碼管顯示函數
  47. void Showsmg(){      
  48.         u8 i;
  49.         for(i=0;i<8;i++)
  50.         {
  51.            switch(7-i)          //位選
  52.            {
  53.                   case 0: LSA=0;LSB=0;LSC=0;break;
  54.                   case 1: LSA=1;LSB=0;LSC=0;break;
  55.                   case 2: LSA=0;LSB=1;LSC=0;break;
  56.                   case 3: LSA=1;LSB=1;LSC=0;break;
  57.                   case 4: LSA=0;LSB=0;LSC=1;break;
  58.                   case 5: LSA=1;LSB=0;LSC=1;break;
  59.                   case 6: LSA=0;LSB=1;LSC=1;break;
  60.                   case 7: LSA=1;LSB=1;LSC=1;break;
  61.            }
  62.           P0=Display[i];
  63.           Delay(1);
  64.           P0=0x00;
  65.         }
  66. }
  67. //延時函數
  68. void Delay(u16 i)   //11.0592 1ms
  69. {
  70.         while(i--){
  71.                 unsigned char i, j;

  72.                 _nop_();
  73.                 i = 2;
  74.                 j = 199;
  75.                 do
  76.                 {
  77.                         while (--j);
  78.                 } while (--i);
  79.         }
  80. }
  81. //初始化函數
  82. void Init(){
  83.         //參數初始化
  84.         hour=0;
  85.         minute=0;
  86.         second=0;
  87.         t0=0;
  88.         flag=0;
  89.         flag1=0;
  90.         flag2=0;
  91.         //定時器0初始化
  92.         TMOD=0x01;
  93.         TH0=(65536-9174)/256;   //10ms
  94.         TL0=(65536-9174)%256;
  95.         EA=1;
  96.         ET0=1;
  97.         TR0=0;
  98. }
  99. //按鍵檢測
  100. void KeyDown(){
  101.         char a=0;
  102.         GPIO_KEY=0x0f;
  103.         if(GPIO_KEY!=0x0f){
  104.                 Delay(10);
  105.                 if(GPIO_KEY!=0x0f){
  106.                         GPIO_KEY=0x0f;
  107.                         switch(GPIO_KEY){
  108.                                 case 0x07 : KeyVal=0;flag3=1;break;
  109.                                 case 0x0b : KeyVal=1;flag3=1;break;
  110.                                 case 0x0d : KeyVal=2;flag3=1;break;
  111.                                 case 0x0e : KeyVal=3;flag3=1;break;
  112.                         }
  113.                         GPIO_KEY=0xf0;
  114.                         switch(GPIO_KEY){
  115.                                 case 0x70 : KeyVal=KeyVal;break;
  116.                                 case 0xb0 : KeyVal=KeyVal+4;break;
  117.                                 case 0xd0 : KeyVal=KeyVal+8;break;
  118.                                 case 0xe0 : KeyVal=KeyVal+12;break;
  119.                         }
  120.                 }
  121.                 while((a<150) && (GPIO_KEY!=0xf0)){
  122.                         Delay(1);
  123.                         a++;
  124.                 }
  125.         }
  126. }
  127. //按鍵處理
  128. void Keypross(){
  129.         if(flag3==1){
  130.                 flag3=0;
  131.                 switch(KeyVal){
  132.                         case 0:Numpross(7);break;
  133.                         case 1:Numpross(8);break;
  134.                         case 2:Numpross(9);break;
  135.                         case 3:Uppross();break;
  136.                         case 4:Numpross(4);break;
  137.                         case 5:Numpross(5);break;
  138.                         case 6:Numpross(6);break;
  139.                         case 7:Downpross();break;
  140.                         case 8:Numpross(1);break;
  141.                         case 9:Numpross(2);break;
  142.                         case 10:Numpross(3);break;
  143.                         case 11:Funcpross();break;
  144.                         case 12:Numpross(0);break;
  145.                         case 13:break;
  146.                         case 14:Backpross();break;
  147.                         case 15:Enterpross();break;
  148.                         
  149.                 }
  150.         }
  151. }
  152. //數據處理
  153. void Datapross(){
  154.         if(flag2==1){
  155.                 flag2=0;
  156.                 second--;
  157.                 if(second>59){
  158.                         if(minute>59){
  159.                                 if(hour>23){
  160.                                         second=0;
  161.                                         minute=0;
  162.                                         hour=0;
  163.                                         TR0=0;
  164.                                 }
  165.                                 else{
  166.                                         hour--;
  167.                                         minute=59;
  168.                                 }
  169.                         }
  170.                         else{
  171.                                 minute--;
  172.                                 second=59;
  173.                         }        
  174.                 }        
  175.         }
  176.         Display[0]=smgduan[hour/10];
  177.         Display[1]=smgduan[hour%10];
  178.         Display[2]=0x40;
  179.         Display[3]=smgduan[minute/10];
  180.         Display[4]=smgduan[minute%10];
  181.         Display[5]=0x40;
  182.         Display[6]=smgduan[second/10];
  183.         Display[7]=smgduan[second%10];
  184. }
  185. //按鍵數字處理
  186. void Numpross(u8 dat){
  187.         u8 tp;
  188.         if(flag==1){
  189.                 switch(flag1){
  190.                         case 0:tp=hour%10;hour=tp+dat*10;break;
  191.                         case 1:tp=hour/10;hour=tp*10+dat;break;
  192.                         case 2:tp=minute%10;minute=tp+dat*10;break;
  193.                         case 3:tp=minute/10;minute=tp*10+dat;break;
  194.                         case 4:tp=second%10;second=tp+dat*10;break;
  195.                         case 5:tp=second/10;second=tp*10+dat;break;
  196.                 }
  197.         }
  198. }
  199. //Up功能處理
  200. void Uppross(){
  201.         if(flag==1){
  202.                 flag1++;
  203.                 if(flag1>5){
  204.                         flag1=0;
  205.                 }
  206.         }
  207. }
  208. //Down功能處理
  209. void Downpross(){
  210.         if(flag==1){
  211.                 flag1--;
  212.                 if(flag1<0)
  213.                         flag1=5;
  214.         }
  215. }
  216. //Func功能處理
  217. void Funcpross(){
  218.         TR0=0;        //停止計時
  219.         flag=1; //允許設置時間
  220. }
  221. //Enter功能處理
  222. void Enterpross(){
  223.         flag=0;                //清零,不允許設置時間
  224.         flag1=0;
  225.         if(hour>23)
  226.                 hour=23;
  227.         if(minute>59)
  228.                 minute=59;
  229.         if(second>59)
  230.                 second=59;
  231.         TR0=1;                //開始計時
  232. }
  233. //Back功能處理
  234. void Backpross(){
  235. //暫無功能
  236. }

  237. void Timer0() interrupt 1{
  238.         TH0=(65536-9174)/256;   //重置
  239.         TL0=(65536-9174)%256;
  240.         t0++;
  241.         if(t0==100){
  242.                 t0=0;
  243.                 flag2=1;
  244.         }
  245. }
復制代碼

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

使用道具 舉報

沙發
ID:230742 發表于 2021-11-14 07:10 | 只看該作者
生搬硬套。哈哈。
回復

使用道具 舉報

板凳
ID:230742 發表于 2021-11-14 11:18 | 只看該作者
坐沙發,等大佬解答。
回復

使用道具 舉報

地板
ID:213173 發表于 2021-11-14 21:12 | 只看該作者
軟件都是基于硬件條件編寫的。樓主找的程序只適合普中的開發板,不能直接套用到這個板子上。這個截圖根本看不清管腳標注,也就搞不清連接關系。亂猜沒有實際意義。
回復

使用道具 舉報

5#
ID:624769 發表于 2021-11-14 21:57 | 只看該作者
樓主的代碼,讓我想起前兩天那個DS1302的帖子……,那個是38譯碼器的高低位不明。
你這個代碼雖然和那個如出一轍。 但是從你的電路圖看,你板子上壓根沒有38譯碼器阿……
回復

使用道具 舉報

6#
ID:96682 發表于 2021-11-15 06:40 來自觸屏版 | 只看該作者
買開發板得用它配套的程序這是共識,隨便拿個程序來修改
回復

使用道具 舉報

7#
ID:523803 發表于 2021-12-13 00:07 | 只看該作者
為啥不用38譯碼器,難道你要直接用IO口嗎
回復

使用道具 舉報

8#
ID:155507 發表于 2021-12-13 09:49 | 只看該作者
樓主用天祥的單片機學習板 一個用的鎖存器驅動位碼,
找的程序只適合普中的開發板  一個用的38譯碼器驅動位碼,
你程序直接移過去,絕對是跑不起來的。
回復

使用道具 舉報

9#
ID:883242 發表于 2021-12-13 11:32 | 只看該作者
三八譯碼器是用三根線擴展成八根線,主要更改在硬件上面,你不貼硬件的圖貼軟件真讓人摸不到頭腦。
回復

使用道具 舉報

10#
ID:991571 發表于 2021-12-13 12:27 | 只看該作者
用多的端口來代替38譯碼器的所有輸出管腳
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品毛片一区二区在线看 | 国产久| 亚洲手机在线 | 国产传媒视频在线观看 | 日韩中文在线 | 久久中文免费视频 | 久久久国产一区二区三区 | 免费黄网站在线观看 | 欧美激情综合五月色丁香小说 | 亚洲成人精品 | 国产精品欧美一区二区三区 | 超碰激情| 日本不卡一区 | 亚洲色欧美另类 | 亚洲福利 | 91视频官网 | av一级久久| 国产精品久久久久久久久久 | 久久免费小视频 | 美女视频黄的免费 | 久久久久久综合 | 国产高清久久久 | 欧美成人视屏 | 成人在线视频网 | 亚洲在线一区 | 国产精品久久久久无码av | 欧美一级欧美三级在线观看 | av手机在线播放 | 亚洲国产精品一区二区三区 | 国产精品极品美女在线观看免费 | 日韩成人免费视频 | 天天久久| 国产精品一区久久久 | 国产成人福利视频在线观看 | 欧美一级免费 | 久久久人| 久久国产高清视频 | 伊大人久久 | 国产免费一区二区三区免费视频 | 精品国产一区二区三区性色av | 精品国产伦一区二区三区观看体验 |