找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1825|回复: 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 单片机教程网

快速回复 返回顶部 返回列表