找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1234|回复: 0
打印 上一主题 下一主题
收起左侧

合泰单片机交通灯控制程序

[复制链接]
跳转到指定楼层
楼主
ID:703358 发表于 2020-3-6 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "HT66F70A.h"
  2. #include <stdlib.h> //随机函数
  3. #include <time.h>
  4. #define LED_Port _pc
  5. #define LED_PortC _pcc
  6. #define LED_PortBSC _pdc
  7. #define LED_PortBS _pd
  8. #define LED1_Port _pg
  9. #define LED_Portc _pgc
  10. #define KEY_PORTC _pec
  11. #define KEY_PORT _pe
  12. #define KeyPortPU _pepu
  13. //下面是函数声明部分
  14. void openLedLight(unsigned char Lbit, unsigned char LNum);
  15. void dynamicLed(unsigned char Counter,unsigned char Ligh);
  16. unsigned char const ledTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x73,0x38,0x3e};//存放LED的点阵码 对应0~15,HPLV
  17. unsigned char const tabIndex[]={0x01,0x02,0x04,0x08};//存放显示位对应的码对应1~4位
  18. unsigned char  Num[4]={0x05,0x09,0x05,0x05};//存放显示位对应的码对应1~4位
  19. unsigned int counter =0;
  20. unsigned int time=60;
  21. unsigned int time1=55;
  22. const unsigned short pili_TAB[] = {0x21,0x0C,0x12,0x28,0x05,0x3F};
  23. unsigned short ScanKey();
  24. unsigned char keyNum=0;//最大数只能是255
  25. unsigned char mode=0;//0
  26. void InitPort()
  27. {
  28. _wdtc=0xaf;
  29. LED_Portc = 0x00;//设置为LED口为输出;  //关闭看门狗
  30. _pec = 0x00;//设置E口输出
  31. _pepu0 = 1;//开启上拉模式
  32. _pe0 = 0;//输出0
  33. }
  34. void main()
  35. {
  36. unsigned short int i;
  37. LED_PortC =0x00;//设置为LED口为输出
  38. LED_PortBSC=0x00;//设置LED位选口为输出
  39. unsigned char temp=0x01;
  40. InitPort();
  41. LED_Portc = 0x00;//设置为LED口为输出;
  42. LED_Port = temp;//按位取反,关闭灯显示;
  43. openLedLight(0,5);
  44. while(1)
  45. {
  46. keyNum=ScanKey();
  47.      if(keyNum==0)
  48.     {
  49.      mode=1;
  50.    
  51.     }
  52.    
  53.         else if(keyNum==1)
  54.     {
  55.      mode=2;
  56.     }
  57.     else if(keyNum==2)
  58.     {
  59.       mode=3;
  60.     }
  61. else if(keyNum==3)
  62.     {
  63.       mode=4;
  64.     }
  65.     else if(keyNum==4)
  66.     {
  67.       mode=5;
  68.     }
  69.     if(mode==1)
  70.    {
  71. counter++;
  72. if(counter>=6000)
  73. {    time--;  
  74.      Num[0]=time/10;
  75.   Num[1]=time%10;
  76.   time1--;      
  77.      Num[2]=time1/10;
  78.   Num[3]=time1%10;
  79.   
  80.   if(time>30){LED1_Port = pili_TAB[0];}
  81.   if(time<=30){LED1_Port = pili_TAB[1];}
  82.    for(i=0;i<80;i++)
  83.    {
  84.     _clrwdt();
  85.     GCC_DELAY(5000);
  86.    }
  87.    
  88.   if(time==0)
  89.   {
  90.    time=60;
  91.   }
  92.   if(time1==0)
  93.   {
  94.    time1=55;
  95.   }
  96.   counter=0;
  97. }
  98.    }
  99.    
  100.        if(mode==2)
  101.    {
  102.        LED1_Port = pili_TAB[2];
  103.    }
  104.    
  105.           if(mode==3)
  106.    {
  107.      LED1_Port = pili_TAB[3];
  108.    }
  109.          if(mode==4)
  110.    {
  111.      LED1_Port = pili_TAB[4];
  112.    }
  113.    if(mode==5)
  114.    {
  115.      LED1_Port = pili_TAB[5];
  116.    }
  117.    
  118. _clrwdt();//喂狗
  119. dynamicLed(4,255);
  120. }
  121. }
  122. /********************************************************************
  123. 函数名称:Delay_us
  124. 函数功能:us秒级别演示
  125. 输入参数:要延时的时间参数
  126. 输出参数:无
  127. *********************************************************************/
  128. void Delay_us(unsigned int time)
  129. {
  130. while(time--);
  131. }
  132. /********************************************************************
  133. 函数名称:openLedLight
  134. 函数功能:实现单个LED灯的点亮
  135. 输入参数:Lbit 表示要显示的是4个位里面的哪个位,取值为0~7的数值
  136.           LNum表示要显示的数字的数值,取值为0~15的的数值
  137. 输出参数:无
  138. *********************************************************************/
  139. void openLedLight(unsigned char Lbit, unsigned char LNum)
  140. {
  141. LED_Port = 0x00;//关闭端口,停止输出,避免出现重影
  142. LED_PortBS = tabIndex[Lbit];
  143. LED_Port =ledTab[LNum];
  144. }
  145. /********************************************************************
  146. 函数名称:dynamicLed
  147. 函数功能:实现LED的循环动态显示
  148. 输入参数:Counter 表示要点亮的LED的个数取值1~8
  149.           Light 灯的亮度的控制,数值越大灯越亮,取值范围0~255
  150. 输出参数:无
  151. *********************************************************************/
  152. void dynamicLed(unsigned char Counter,unsigned char Ligh)
  153. {
  154.   unsigned char i;
  155.   for(i=0;i<Counter;i++)
  156. {
  157.    Delay_us(Ligh);//实现灯亮度的调整
  158.    openLedLight(i,Num[i]);
  159. }
  160. }

  161. unsigned short ScanKey()
  162. { unsigned char i,key=0;
  163. KEY_PORTC=0x0f;
  164. KeyPortPU=0x0f;      //I/O Mode Config & Pull-up Enable
  165. KEY_PORT=0b11101111;              //Initial Scancode
  166. for(i=0;i<=3;i++)
  167. { if(!(KEY_PORT & 1)) break;        //Check Column 0
  168.   key++;
  169.   if(!(KEY_PORT & 1<<1)) break;      //Check Column 1
  170.   key++;
  171.   if(!(KEY_PORT & 1<<2)) break;      //Check Column 2
  172.   key++;
  173.   if(!(KEY_PORT & 1<<3)) break;      //Check Column 3
  174.   key++;
  175.   KEY_PORT<<=1; KEY_PORT|=0b0000001;    //Scancode for Next Row
  176. }
  177. return key;
  178. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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