[通用8051核FLASH系列] 【芯圣电子HC89S105A测评报告】+串口打印矩阵键盘值

[复制链接]
1698|10
 楼主| 比神乐 发表于 2023-5-24 10:19 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:31 编辑

今天搞了一下矩阵键盘。
四根行线P1.0-P1.4,四根列线P1.4-P1.7
键值用串口1打印
代码:
  1. #define ALLOCATE_EXTERN
  2. #include "HC89S105AC8.h"

  3. #define uint8_t unsigned char
  4. #define uint16_t  unsigned int

  5. #define Hang_00_L  P1_0=0                                
  6. #define Hang_00_H  P1_0=1

  7. #define Hang_01_L  P1_1=0
  8. #define Hang_01_H  P1_1=1

  9. #define Hang_02_L  P1_2=0
  10. #define Hang_02_H  P1_2=1

  11. #define Hang_03_L  P1_3=0
  12. #define Hang_03_H  P1_3=1

  13. #define Lie_00_V   P1_4
  14. #define Lie_01_V   P1_5
  15. #define Lie_02_V   P1_6
  16. #define Lie_03_V   P1_7

  17. #define Lie_04_V   ((P1&0xF0)>>4)


  18. #define Hang_10_L  P1_4=0
  19. #define Hang_10_H  P1_4=1

  20. #define Hang_11_L  P1_5=0
  21. #define Hang_11_H  P1_5=1

  22. #define Hang_12_L  P1_6=0
  23. #define Hang_12_H  P1_6=1

  24. #define Hang_13_L  P1_7=0
  25. #define Hang_13_H  P1_7=1

  26. #define Lie_10_V    P1_0
  27. #define Lie_11_V    P1_1
  28. #define Lie_12_V    P1_2
  29. #define Lie_13_V    P1_3

  30. #define Lie_14_V   ((P1&0x0f)<<4)

  31. #define  jpys 20   //??????jpys==20?????????


  32. uint8_t cord_h,cord_l;//???????
  33. uint8_t temp;
  34. unsigned char guc_Uartflag = 0;                //UART判断标志位        
  35. unsigned char guc_Uartcnt = 0;                    //UART计数使用
  36. unsigned char guc_Uartbuf_a[5] = {0};        //用于存放接和收收据
  37. unsigned char guc_i;
  38. uint8_t txBuf[] = "Key Value = :   \r\n";
  39.                                     //发送数据计数
  40.                                        
  41. void DelayMs(uint16_t nms)
  42. {
  43.         uint16_t i,j;                  
  44.         for(i=0;i<nms;i++)
  45.        for(j=0;j<200;j++);
  46. }
  47.         
  48. void PORT_Initialize1(void)
  49. {
  50.    P1M0=0xcc;
  51.    P1M1=0xcc;
  52.    P1M2=0x22;
  53.    P1M3=0x22;
  54. }
  55. void PORT_Initialize2(void)
  56. {
  57.    P1M0=0x22;
  58.    P1M1=0x22;
  59.    P1M2=0xcc;
  60.    P1M3=0xcc;
  61. }
  62. unsigned char KeyScan(void)  //????????????????
  63. {
  64.     uint16_t i,j;

  65.     PORT_Initialize1();
  66.     for(i=0;i<1250;i++);
  67.     Hang_00_L;
  68.     Hang_01_L;
  69.     Hang_02_L;
  70.     Hang_03_L;
  71.     for(i=0;i<1250;i++);
  72.     //cord_h=(Lie_04_V&0x0f);
  73.     cord_h=(uint8_t)(Lie_04_V);
  74.     //cord_h=Lie_01_V|Lie_02_V|Lie_03_V|Lie_04_V;
  75.     if(cord_h != 0xf0)    //?????????
  76.     {
  77.          DelayMs(10);        //??
  78.          cord_h=(uint8_t)(Lie_04_V);
  79.          
  80.         if(cord_h!=0xf0)
  81.         {
  82.             cord_h=(uint8_t)(Lie_04_V);        //?????
  83.             for(i=0;i<1250;i++);
  84.             PORT_Initialize2();
  85.             for(i=0;i<1250;i++);
  86.             if((cord_h&0x01)==0x01)
  87.                 Hang_10_H;
  88.             else
  89.                 Hang_10_L;
  90.             if((cord_h&0x02)==0x02)
  91.                 Hang_11_H;
  92.             else
  93.                 Hang_11_L;
  94.             if((cord_h&0x04)==0x04)
  95.                 Hang_12_H;
  96.             else
  97.                 Hang_12_L;
  98.             if((cord_h&0x08)==0x08)
  99.                 Hang_13_H;
  100.             else
  101.                 Hang_13_L;

  102.             for(i=0;i<1250;i++);
  103.             cord_l=(uint8_t)(Lie_14_V);                   //?????
  104.             while(1)     //???????
  105.             {
  106.                 j=(uint8_t)(Lie_14_V);
  107.                 if(j==0xF0)
  108.                     break;
  109.                 for(i=0;i<1250;i++);
  110.             }
  111.             return(cord_h+cord_l);//????????
  112.         }
  113.     }
  114.     return(0xff);     //????*/
  115. }

  116. unsigned char KeyPro(void)
  117. {
  118. switch(KeyScan())
  119. {
  120.   case 0x7e:return 0;break;//0 ??????????????
  121.   case 0x7d:return 1;break;//1
  122.   case 0x7b:return 2;break;//2
  123.   case 0x77:return 3;break;//3
  124.   case 0xbe:return 4;break;//4
  125.   case 0xbd:return 5;break;//5
  126.   case 0xbb:return 6;break;//6
  127.   case 0xb7:return 7;break;//7
  128.   case 0xde:return 8;break;//8
  129.   case 0xdd:return 9;break;//9
  130.   case 0xdb:return 10;break;//a
  131.   case 0xd7:return 11;break;//b
  132.   case 0xee:return 12;break;//c
  133.   case 0xed:return 13;break;//d
  134.   case 0xeb:return 14;break;//e
  135.   case 0xe7:return 15;break;//f
  136.   default:return 0xff;break;
  137. }
  138. }
  139. /***************************************************************************************
  140.   * @实现效果        UART1接收到上位机发送的数据后,把接收的数据再次发送给上位机
  141.   * @注意                波特率1200,8位数据,无校验位               
  142. ***************************************************************************************/
  143. void main(void)
  144. {
  145.         uint8_t i;
  146. /********************************系统初始化*******************************************/               
  147.         WDTCCR = 0x00;                           //关闭看门狗
  148.                                                            //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
  149.         CLKCON = 0x02;                           //选择内部高频RC为系统时钟,Fosc=32MHz
  150.         CLKDIV = 0x02;                           //Fosc 2分频得到Fper,Fper=16MHz        
  151. /**********************************IO配置初始化**************************************/        
  152.     P0M0 = P0M0&0xF0|0x02;                //P00设置为上拉输入
  153.     P0M0 = P0M0&0x0F|0x80;                //P01设置为推挽输出
  154.         
  155. /**********************************UART配置初始化**************************************/        
  156.     TXD_MAP = 0x01;                                                //TXD映射P01
  157.                 RXD_MAP = 0x00;                                                //RXD映射P00
  158.         
  159.         //8位数据发送,波特率1200
  160.         //波特率计算
  161.         //波特率 = 1/16 * 时钟源频率 / (65536 - 0xFCBE)
  162.         //       = 1/16 * 16000000 / 834)
  163.         //        = 1199.04(误差0.05%)

  164.         //波特率1200
  165.         //反推初值
  166.         //初值 = (65536 - (Fper / 波特率) * (1 / 16))
  167.         //           = (65536 - (16000000 / 1200) * (1 / 16))
  168.         //           = (65536 - 833.33)
  169.         //     = FCBE
  170.         

  171.     SBRTH = 0xFCBE/256;      
  172.         SBRTL = 0xFCBE%256;
  173.         SCON2 = 0x12;                                //8位UART 独立波特率,波特率可变
  174.         SCON  = 0x10;                                 //开串口接收

  175.         //IE = 0x10;                                         //使能串口中断
  176.         //EA = 1;                                                //使能总中断
  177.         while(1)
  178.         {
  179. //                if(guc_Uartflag)
  180. //                {
  181. //                        IE &=~ 0x10;                                  //失能UART1中断
  182. //                        for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
  183. //                        {
  184. //                                SBUF = guc_Uartbuf_a[guc_i];                          //发送数据
  185. //                                while(!(SCON&0x02));
  186. //                                SCON &=~ 0x02;                        //发送中断请求中断标志位清0
  187. //                        }
  188. //                        guc_Uartflag = 0;                        //标志位置0        
  189. //                        guc_Uartcnt = 0;
  190. //                        SCON |= 0x10;                                 //使能串口中断
  191. //                        IE |= 0x10;                                      //UART1中断使能
  192. //                }
  193.                 temp=KeyPro();
  194.         if(temp!=0xff)
  195.         {

  196.                                                 if((temp>=0)&&(temp<=9))
  197.                                                         txBuf[14]=temp+0x30;
  198.                                                 else if((temp>=10)&&(temp<=15))
  199.                                                         txBuf[14]=temp+55;
  200.                                                 for(i = 0; i < sizeof(txBuf); i++)
  201.                                                 {
  202.                                                                 SBUF = txBuf[i];                          //发送数据
  203.                                                                 while(!(SCON&0x02));
  204.                                                                 SCON &=~ 0x02;                        //发送中断请求中断标志位?
  205.                                                 }
  206.         }
  207.         }
  208. }
效果图:
6.jpg 7.jpg
keaibukelian 发表于 2023-6-10 11:09 | 显示全部楼层
我一开始误解了 还以为没有上位机  只是单片机通过串口呢
wowu 发表于 2023-6-10 11:38 | 显示全部楼层
八个引脚最多可以控制多少个键盘呢?
heimaojingzhang 发表于 2023-6-10 11:46 | 显示全部楼层
这样做的话 上位机和单片机之间的协议需要自己定义了
wakayi 发表于 2023-6-10 11:55 | 显示全部楼层
现在使用并口控制键盘的案例还多吗 感觉太费引脚了
renzheshengui 发表于 2023-6-10 13:09 | 显示全部楼层
使用键盘的时候,楼主使用扫描的方式 好像是做了10毫秒的延时处理,这样会不会因为抖动产生误操作呢
tpgf 发表于 2023-6-10 13:31 | 显示全部楼层
感觉实用性并不高 但是可以很好的熟悉io的使用以及串口的配置
chenqianqian 发表于 2023-6-11 15:49 来自手机 | 显示全部楼层
现在都是用专用接口芯片了
lajdfla001 发表于 2023-6-19 18:09 | 显示全部楼层
这个笔记本,确实不错的。
kjkujkj22 发表于 2023-6-19 19:02 | 显示全部楼层
这个芯片是不是很好的?
jflahdink09 发表于 2023-6-19 19:07 | 显示全部楼层
这个芯片多少钱?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部