4137|6

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高手进来指导下。我用C语言写了两天的日历时钟,有闹钟功能、计时功能。 [复制链接]

  1. #include
  2. #include
  3. #define UCHAR unsigned char
  4. #define UINT unsigned int

  5. void init();
  6. void delay(UINT);
  7. void displayWeek(UCHAR week);
  8. void displayTime(UCHAR first, UCHAR second);
  9. void writeCmd(UCHAR cmd);
  10. void writeData(UCHAR dat);
  11. UCHAR keyscan();
  12. void keyUpDown(UCHAR *value, bit up, bit down);
  13. bit processDayMon(UCHAR *day, UCHAR *month);
  14. void display(UCHAR *seconds, UCHAR *minute, UCHAR *hour, UCHAR *day, UCHAR *week, UCHAR *month, bit displayOn);
  15. UCHAR getWeek(UCHAR day, UCHAR month, UINT year);
  16. void timeUpdate(UCHAR *value, UCHAR *nextValue, UCHAR largest, UCHAR smallest);
  17. void displayCounter(UCHAR *minute, UCHAR *seconds, UCHAR *tenMs);
  18. void recoverClock();
  19. void update();  


  20. sbit rs = P1^1;    //rs 数据/命令选择端
  21. sbit lcden = P1^2;
  22. sbit beep = P1^0;
  23. UCHAR seconds,minute,hour, week, day, month;  
  24. UCHAR alarmMinute, alarmHour;
  25. UCHAR countMinute, countSeconds, countTenMs;
  26. UCHAR keyValue, key1Times, key2Times, key3Times, key5Times, key6Times, key7Times, key9Times;
  27. UINT year;
  28. UINT cnt0, cnt1;
  29. bit leapYear, alarmOn;
  30. bit flagTimer0, flagTimer1;
  31. bit timeUp, timeDown;
  32. UCHAR code weekTable[][3] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
  33. UCHAR code monthTable[][12] =
  34. {
  35.     {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  36.     {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
  37. };

  38. void main()
  39. {
  40.     init();
  41.     while(1)
  42.     {
  43.         update();
  44.     }
  45. }

  46. void update()
  47. {
  48.     keyValue = keyscan();   
  49.     switch(keyValue)
  50.     {
  51.         case 1:while(keyscan() == 1); //等待按键松开
  52.             if(++key1Times == 2) //第二次按下恢复时钟界面
  53.             {
  54.                 key1Times = 0;
  55.                 recoverClock();
  56.                 break;            
  57.             }
  58.             writeCmd(0x01); //第一次按下清屏  
  59.             displayCounter(&countMinute, &countSeconds, &countTenMs);//初始化计时界面
  60.             break;
  61.         case 2:while(keyscan() == 2);if(++key2Times == 7)key2Times = 0;break;
  62.         case 3:while(keyscan() == 3);
  63.             if(++key3Times == 3)
  64.             {
  65.                 key3Times = 0;
  66.                 beep = 1; //关闭闹钟
  67.                 writeCmd(0x80 + 0x4e); //第二次按下清除 "On"标记  
  68.                 writeData(' ');
  69.                 writeData(' ');
  70.             }
  71.             break;        
  72.         case 5:while(keyscan() == 5);timeUp = 1;break;
  73.         case 6:while(keyscan() == 6);timeDown = 1;break;
  74.         case 7:while(keyscan() == 7);if(++key7Times == 3)key7Times = 0;break;
  75.         case 9:while(keyscan() == 9);if(++key9Times == 3)key9Times = 1;break;
  76.         
  77.     }
  78.     keyValue = 0;
  79.     if(flagTimer0) /*每增加一秒时刷新时间变量 */  
  80.     {
  81.         flagTimer0 = 0;
  82.         seconds++;
  83.         if(key3Times != 1 && key1Times != 1)  //在时钟状态下才刷新时间变量及其屏幕显示
  84.             display(&seconds, &minute, &hour, &day, &week, &month, 1);
  85.         else   //仅刷新时间变量,不刷新显示
  86.             display(&seconds, &minute, &hour, &day, &week, &month, 0);
  87.     }        
  88.     /*当调整时间时,根据按下key2键的次数   
  89.      *将光标移到相应的位置进行闪烁
  90.      */
  91.     if(key2Times && key3Times != 1 && key1Times != 1) //在时钟状态下按下key2
  92.     {   
  93.         writeCmd(0x0f); //显示光标
  94.         switch(key2Times) //根据按下key2Times的次数把光标移到相应的位置进行闪烁
  95.         {
  96.             case 1:writeCmd(0x80 + 0x4a); //光标移到秒处进行闪烁  
  97.                 keyUpDown(&seconds, timeUp, timeDown);
  98.                 break;
  99.             case 2:writeCmd(0x80 + 0x47);//分
  100.                 keyUpDown(&minute, timeUp, timeDown);
  101.                 break;
  102.             case 3:writeCmd(0x80 + 0x44);  //时
  103.                 keyUpDown(&hour ,timeUp, timeDown);
  104.                 break;
  105.             case 4:writeCmd(0x80 + 0x0a);  //日
  106.                 keyUpDown(&day, timeUp, timeDown);
  107.                 break;
  108.             case 5:writeCmd(0x80 + 0x07); //月
  109.                 keyUpDown(&month, timeUp, timeDown);
  110.                 break;
  111.             case 6:writeCmd(0x80 + 0x04); //年
  112.                 if(timeUp == 1)  //加一
  113.                    year++;
  114.                 else if(timeDown == 1) //减一
  115.                    year--;
  116.                 break;
  117.             case 7:writeCmd(0x0c);key2Times = 0;break; //正常显示时钟 
  118.         }
  119.         if(timeUp || timeDown)  //如果有按下调整时间的键盘则刷新时间
  120.         {   
  121.             display(&seconds, &minute, &hour, &day, &week, &month, 1);  
  122.             timeUp = timeDown = 0; //刷新完时间后让调整时间的变量标记归0  
  123.         }                 
  124.     }
  125.     if(key3Times == 1) //第一次按下设置闹钟时间 
  126.     {
  127.         writeCmd(0x0c);
  128.         writeCmd(0x80 + 0x4d);
  129.         writeData('S');    //显示"Set",进入设置闹钟界面
  130.         writeData('e');
  131.         writeData('t');
  132.         writeCmd(0x0f);
  133.         switch(key7Times)
  134.         {            
  135.             case 1:writeCmd(0x80 + 0x47);//进入设置分的状态
  136.                 keyUpDown(&alarmMinute, timeUp, timeDown);
  137.                 break;
  138.             case 2:writeCmd(0x80 + 0x44);  //时
  139.                 keyUpDown(&alarmHour ,timeUp, timeDown);
  140.                 break;   
  141.         }
  142.         if(timeUp || timeDown)
  143.         {
  144.             timeUpdate(&alarmMinute, &alarmHour, 59, 0);
  145.             if(alarmHour == 24)
  146.                 alarmHour = 0;
  147.             writeCmd(0x80 + 0x47);
  148.             displayTime(alarmMinute / 10, alarmMinute % 10);
  149.             writeCmd(0x80 + 0x44);
  150.             displayTime(alarmHour / 10, alarmHour % 10);
  151.             timeUp = timeDown = 0;        
  152.         }
  153.     }
  154.     else if(key3Times == 2) //设置好闹钟返回时钟界面并开启闹钟
  155.     {
  156.         writeCmd(0x0c);
  157.         writeCmd(0x80 + 0x4d);
  158.         writeData(' ');
  159.         writeData('O'); //显示"On",提示闹钟已开启
  160.         writeData('n');
  161.         if(alarmMinute == minute && alarmHour == hour)
  162.         {
  163.             alarmOn = 1; //闹钟时间到了         
  164.         }
  165.         if(alarmOn == 1)
  166.         {   
  167.             beep = ~beep;
  168.             delay(rand() % 100);
  169.             //超时三分钟自动关闭闹钟
  170.             if(hour == alarmHour && minute - alarmMinute > 2)
  171.             {
  172.                 alarmOn = 0;
  173.             }
  174.             else if(hour > alarmHour && minute + 60 - alarmMinute > 2)
  175.             {
  176.                 alarmOn = 0;
  177.             }
  178.         }           
  179.     }
  180.     if(key1Times)  //计时器界面
  181.     {   //displayCounter(&countMinute, &countSeconds, &countTenMs);
  182.         if(key9Times == 1)
  183.         {
  184.             TR1 = 1;
  185.             if(flagTimer1)
  186.             {
  187.                 countTenMs++;
  188.                 displayCounter(&countMinute, &countSeconds, &countTenMs);
  189.                 flagTimer1 = 0;
  190.             }
  191.         }
  192.         else if(key9Times == 2)
  193.         {
  194.             TR1 = 0;
  195.         }              
  196.     }         
  197. }

  198. void writeCmd(UCHAR cmd)
  199. {
  200.     rs = 0; //命令选择端
  201.     P0 = cmd;
  202.     lcden = 1;
  203.     delay(1);
  204.     lcden = 0;   
  205. }

  206. void writeData(UCHAR dat)
  207. {
  208.     rs = 1; //数据选择端   
  209.     P0 = dat;
  210.     lcden = 1;
  211.     delay(1); //延时让数据写到液晶上去
  212.     lcden = 0;  
  213. }      
  214. void init()
  215. {   
  216.     alarmOn = 0;
  217.     alarmHour = 12;
  218.     alarmMinute = 1;
  219.     countMinute = countSeconds = countTenMs = 0;
  220.     TMOD = 0X11;
  221.     EA = 1;
  222.     ET0 = 1;
  223.     ET1 = 1;
  224.     TR0 = 1;
  225.     writeCmd(0x38); //设置显示模式   
  226.     writeCmd(0x0c); //设置显示开关及光标
  227.    
  228.     /*下面初始化时间变量
  229.      *2010-05-26  Wed
  230.          12:00:00
  231.      */
  232.     year = 2010;
  233.     month = 5;
  234.     day = 26;
  235.     week = 3; //星期三
  236.     hour = 12;
  237.     minute = 0;
  238.     seconds = 0;
  239.     leapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);

  240.     /*初始化时液晶显示 */
  241.     writeCmd(0x80 + 0x02);
  242.     displayTime(year / 1000, year / 100 % 10);
  243.     displayTime(year % 100 / 10, year % 10);
  244.     writeData('-');
  245.     displayTime(month / 10, month % 10);
  246.     writeData('-');
  247.     displayTime(day / 10, day % 10);
  248.     writeData(' '); //光标向前移动一 位
  249.     displayWeek(week);
  250.     writeCmd(0x80 + 0x44);
  251.     displayTime(hour / 10, hour % 10);
  252.     writeData(':');
  253.     displayTime(minute / 10, minute % 10);
  254.     writeData(':');
  255.     displayTime(seconds / 10, seconds % 10);         
  256. }  


  257. void timer0() interrupt 1
  258. {
  259.     TH0 = (65536 - 46080) / 256;  //定时时间为50ms
  260.     TL0 = (65536 - 46080) % 256;
  261.     if(++cnt0 == 20)
  262.     {
  263.         cnt0 = 0;
  264.         flagTimer0 = 1;            
  265.     }     
  266. }

  267. void timer1() interrupt 3
  268. {
  269.     TH0 = (65536 - 9216) / 256; //定时时间为 10ms;
  270.     TL0 = (65536 - 9216) % 256;
  271.     if(++cnt1 == 1)
  272.     {
  273.         cnt1 = 0;
  274.         flagTimer1 = 1;
  275.     }
  276. }         

  277. void delay(UINT ms)
  278. {
  279.     UINT x, y;

  280.     for(x = ms; x; x--)
  281.         for(y = 197; y; y--)
  282.             ;
  283. }

复制代码
此帖出自编程基础论坛

最新回复

http://download.eeworld.net/source/2408952 程序电路图、及源码下载地址。   详情 回复 发表于 2010-5-30 13:11
点赞 关注
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  1. void displayWeek(UCHAR week)
  2. {
  3.     UCHAR i;

  4.     week--; //因为weekTable数组是从0开始的,故减去1
  5.     writeCmd(0x80 + 0x0d); //初始化地址指针
  6.     writeCmd(0x0c); //不显示光标
  7.     for(i = 0; i < 3; i++)
  8.         writeData(weekTable[week][i]);   
  9. }

  10. /*函数功能:刷新显示屏幕上任意两个数字      
  11. *参    数:类型:unsinged char所要显示二个数字的数值   
  12. */
  13. void displayTime(UCHAR first, UCHAR second)
  14. {
  15.     writeCmd(0x0c); //不显示光标
  16.     writeData(first + 48);  //转成数字相对应的ASCII值  
  17.     writeData(second + 48);
  18. }

  19. /*函数功能:更新时间变量及刷新屏幕时间显示
  20. *参数    :所要显示的时间变量的地址,displayOn为0时仅更新时间变量  
  21. */
  22. void display(UCHAR *seconds, UCHAR *minute, UCHAR *hour, UCHAR *day, UCHAR *week, UCHAR *month, bit displayOn)
  23. {
  24.     timeUpdate(seconds, minute, 59, 0);
  25.     timeUpdate(minute, hour, 59, 0);
  26.     timeUpdate(hour, day, 23, 0);
  27.     if(*day == 0) //每个月的第一天再往后减一,即回到上个月的最后一天
  28.     {
  29.         if(*month == 1)  //如果一月份的第一天
  30.         {
  31.             year--;    //回到去年的最后一天
  32.             *day = 31;
  33.             *month = 12;
  34.         }
  35.         else  //除一月份外每个月的第一天
  36.         {   
  37.             if(leapYear)  //把日改为上个月的最后一天
  38.                 *day = monthTable[1][*month - 2];
  39.             else
  40.                 *day = monthTable[0][*month - 2];
  41.             (*month)--;  //月减一
  42.         }
  43.     }
  44.     leapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
  45.     processDayMon(day, month); //每月的最后一天再往前加一天         
  46.     if(*month == 13) //每年的最后一个月再往前加一个月  
  47.     {
  48.         *month = 1;
  49.         year++;
  50.     }
  51.     else if(*month == 0)  //每年的第一个月再往后减一个月
  52.     {
  53.         *month = 12;
  54.         year--;
  55.     }                 
  56.     //timeUpdate(month, &year, 12, 1);
  57.     leapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
  58.     if((*week = getWeek(*day, *month, year)) == 0)
  59.         *week = 7;
  60.     if(displayOn)   
  61.     {
  62.         writeCmd(0x80 + 0x4a); //地址指针移到秒的位置
  63.         displayTime(*seconds / 10, *seconds % 10); //更新秒的显示
  64.         writeCmd(0x80 + 0x47); //地址指针移到分钟的位置
  65.         displayTime(*minute / 10, *minute % 10); //更新分钟的显示
  66.         writeCmd(0x80 + 0x44); //地址指针移到小时的位置
  67.         displayTime(*hour / 10, *hour % 10);
  68.         writeCmd(0x80 + 0x0a); //地址指针移到日的位置
  69.         displayTime(*day / 10, *day % 10);
  70.         displayWeek(*week); //更新星期 
  71.         writeCmd(0x80 + 0x07); //地址指针移到月的位置
  72.         displayTime(*month / 10, *month % 10);
  73.         if(year % 100 == 0) //当年的前两位发生改变时,刷新年的前两位
  74.         {
  75.             writeCmd(0x80 + 0x02); //地址指针移到年的高二位
  76.             displayTime(year % 1000, year / 100 % 10);
  77.         }
  78.         writeCmd(0x80 + 0x04); //地址指针移到年的低二位
  79.         displayTime(year % 100 / 10, year % 10);
  80.     }
  81. }

  82. /*函数功能:当相应的时间单位超出范围时对其进行更新处理    
  83. *参数  : value:所要判断的时间变量的地址,nextValue:该时间变量的下一级单位时间的地址,
  84.             largest:*value对应的时间单位的所能显示的最大值,如月份为12,分钟为59
  85.             smallest:*value对应的时间单位的所能显示的最小值,如月份为1,分钟为0
  86. */
  87. /*小时分钟秒这些我是用UCHAR类型来表示的,但年我是用unsigned int类型来表示的
  88.   *这样子对于年怎么实现参数的传递呢?   
  89.   *我用timeUpdate(&month, (char*)year,)
  90.   *或者把参数原型改成 timeUpdate(UCHAR *value, UINT *value,,,);
  91.   *然后把month强制转成UINT *型..timeUpdta((UINT*)&month, &year...);
  92.   编译通过,但运行结果是错的. */
  93. void timeUpdate(UCHAR *value, UCHAR *nextValue, UCHAR largest, UCHAR smallest)
  94. {
  95.     largest++; //让相应的时间单位所能显示的最大值加1
  96.     smallest--;
  97.     if(*value == largest) //当对应的时间单位超出所能显示的最大值时  
  98.     {
  99.         *value = smallest; //低一级时间单位回到最小值
  100.         (*nextValue)++;    //高一级时间单位加1                                    
  101.     }
  102.     else if(*value == smallest) //对应的时间单位的最小值再往下减一时 
  103.     {
  104.         *value = largest;  //低一级时间单位回到最大值
  105.         (*nextValue)--;    //高一级时间单位减1
  106.     }
  107. }

  108. /*函数功能:算出某年某月某日是星期几
  109. *返 回值 :返回0,代表星期天,其余返回值代表星期几
  110. */  
  111. UCHAR getWeek(UCHAR day, UCHAR month, UINT year)
  112. {
  113.     UINT temp, yearTemp;
  114.     UCHAR i;
  115.    
  116.     temp = 0; //必须初始化temp的值,否则出错了
  117.     yearTemp = year - 1;
  118.     for(i = 0; i < month - 1; i++)
  119.         if(leapYear)
  120.             temp += monthTable[1][i];
  121.         else
  122.             temp += monthTable[0][i];
  123.     temp += yearTemp + yearTemp / 4 - yearTemp / 100 + yearTemp / 400 + day;

  124.     return (temp % 7);  
  125. }

  126. /*函数功能:每个月的最后一天再往前加一天,对月日进行处理  
  127. *参    数:所要处理的日、月的地址
  128. *返回 值:如果是每个月的最后一天,返回值为1,否则为0
  129. */
  130. bit processDayMon(UCHAR *day, UCHAR *month)
  131. {
  132.     if(leapYear && monthTable[1][*month - 1] < *day  || monthTable[0][*month - 1] < *day)
  133.     {
  134.         *day = 1;
  135.         (*month)++;
  136.         return 1;   
  137.     }

  138.     return 0;   
  139. }

  140. /*函数功能:刷新计时器时间变量及其屏幕显示
  141. *参数    :相对应的时间的地址
  142. */
  143. void displayCounter(UCHAR *minute, UCHAR *seconds, UCHAR *tenMs)
  144. {
  145.     if(*tenMs == 100)
  146.     {
  147.         (*seconds)++;
  148.         *tenMs = 0;
  149.     }
  150.     if(*seconds == 60)
  151.     {
  152.         (*minute)++;
  153.         *seconds = 0;
  154.     }
  155.     if(*minute == 60)
  156.         *minute = 0;   
  157.     writeCmd(0x80 + 0x44);
  158.     displayTime(*minute / 10, *minute % 10);
  159.     writeData(':');
  160.     displayTime(*seconds / 10, *seconds % 10);
  161.     writeData(':');
  162.     displayTime(*tenMs / 10, *tenMs % 10);
  163.    
  164. }

  165. /*函数功能:恢复时钟界面 */
  166. void recoverClock()
  167. {
  168.     writeCmd(0x01); //清屏
  169.     writeCmd(0x80 + 0x06);
  170.     writeData('-');
  171.     writeCmd(0x80 + 0x09);   
  172.     writeData('-');
  173.     writeCmd(0x80 + 0x02);
  174.     displayTime(year / 1000, year / 100 % 10);
  175.     writeCmd(0x80 + 0x46);
  176.     writeData(':');
  177.     writeCmd(0x80 + 0x49);
  178.     writeData(':');
  179. }
复制代码
此帖出自编程基础论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
/*函数功能:线反转法扫描4*4矩阵键盘按键  
*返回值  :如有键按下,返回对应的按键编码,从1到16。返回0代表没键按下
*/
UCHAR keyscan()
{
    UCHAR i, j;
    P2 = 0x0f;
    /* "==" "!="优先级比"&"高,不加括号出错了 !*/     
    if((P2 & 0x0f) != 0x0f)  
    {
        switch(P2)   //获取按键所在的行
        {
            case 0x0e: i = 0;break;
            case 0x0d: i = 1;break;
            case 0x0b: i = 2;break;
            case 0x07: i = 3;break;
        }
        delay(10);  
        P2 = 0xf0;
        if((P2 & 0xf0) != 0xf0)
        {
            switch(P2)   //获取按键所在的列
            {
                case 0xe0: j = 1;break;
                case 0xd0: j = 2;break;
                case 0xb0: j = 3;break;
                case 0x70: j = 4;break;
            }
            return i * 4 + j;
        }            
    }               
    return 0;
}

void keyUpDown(UCHAR *value, bit up, bit down)
{
    if(up == 1)  //加一
       ++(*value);
    else if(down == 1) //减一
       --(*value);
}
此帖出自编程基础论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
那么问题是???
此帖出自编程基础论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 

从左到右,从上到下依次命名为
key1,key2,key3,key4
key5…………………
1、key1键: 菜单功能选择按键
        第一次按下:进入计时器界面
        第二次按下:返回时钟界面
2、key2键: 时钟调整选择按键
        第一次按下:调整秒
        第二次按下:调整分钟
        第三次按下:调整小时
        第四次按下:调整日
        第五次按下:调整月份
        第六次按下:调整年
第七次按下:返回时钟界面
3、key3键: 第一次按下开启闹钟,第二次按下确定闹钟时间,第三次按下关闭闹钟
4、key4键:
5、key5键: 按一下加1
6、key6键: 按一下减1

7.        key7键:设置闹钟按键,第一、二次按下分别调节分、时 
8.        key8键:
9.        key9键:计时器开始/暂停计时
10.        key10键:按住该键显示时间,松开继续显示计时
11.        key11键:按下后清零
12.        key12键:按下后清零并重新计时
13.        key13键:
14.        key14键
15.        key15键
16.        key16键:
               时钟
1、初始化时钟时间为2010-05-26 Wed
                       12:00:00
2、时间变量:seconds,minute,hour, week, day, month, year;
3、时间的设置:根据按下key2键的次数将光标移到相应的位置进行闪烁,
        ,然后根据key5 key6键的按下对相应的时间变量进行增或减1、

               闹钟
功能:设置闹钟,时间到了后响铃,三分钟后若无取消闹钟,则自动关闭闹钟。
实现方法:
当第一次按下key3键时,alarmOn = 1.,进行闹钟时间设置, 在屏幕右下角显示字符串“Set”。第二次按下时开启闹钟定时,在屏幕右下角显示字符串“On” ,第三次按下时关闭闹钟。根据按下key7键的次数将光标移到相应的位置进行闪烁,,然后根据key5 key6键的按下进行增或减1,每增减一次调用相对应的屏幕刷新函数.。设置好后,将该时间值存在变量alarmMinute, alarmHour里,。此后不断检测系统时间与所设闹钟时间是否相等,当相等时让蜂鸣器发声。此时如果再次按下key8键则,alarmOn = 0,关闭蜂鸣器,消除字符串“On”,恢复时钟界面。如果没有按下key8键,则3分钟后蜂鸣器自动关闭,消除字符串“On”。
功能:精确到10ms,计时范围:0~60:00:00,即1小时。
按下key9键:计时器开始/暂停计时
key10键:按住该键显示时间,松开继续显示计时
key11键:按下后清零
key12键:按下后清零并重新计时


  1. /*我写到计时器这里就卡住了。我想以10ms进行计时,但运行结果确不是我想要的。
  2. 不是以10ms进行计时,,是不是程序太大了,写太多了,到反应中断时10ms已经过去了,来不及显示
复制代码

此帖出自编程基础论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 e3399 的回复:
/*函数功能:线反转法扫描4*4矩阵键盘按键  
*返回值 :如有键按下,返回对应的按键编码,从1到16。返回0代表没键按下
*/
UCHAR keyscan()
{
  UCHAR i, j;
  P2 = 0x0f;
  /* "==" "!="优先级比"&"高,不加括号出错了 !*/  
  if((P2 & 0x0f) != 0x0f)  
  {
……

如上
此帖出自编程基础论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
http://download.eeworld.net/source/2408952
程序电路图、及源码下载地址。
此帖出自编程基础论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表