HC6800-ES-V2.0 发表于 2018-12-13 08:16 那请问下 就是完全的 每个矩阵按键控制不同的点阵数字或者图案怎么写 |
jsj@1234 发表于 2018-12-13 12:31 楼主你做出来了吗,我也想做和你一样的加矩阵键盘的 |
哈哈,拿着程序照搬是不对的,要根据程序是否和硬件配套不?跟硬件不配套你弄的代码再好也等于0。 |
jsj@1234 发表于 2018-12-13 12:31 设置一个按键标志位,利用中断函数来扫描这个标志位(举例:1ms进入一次中断,一旦连续4次检测到0,就更新对应的按键值)。然后在main函数里面用if(标志位)来判断就可以了;加一下自己的代码:
然后是中断里面的:
|
HC6800-ES-V2.0 发表于 2018-12-13 08:16 大神怎么把矩阵键盘控制加进去? |
HC6800-ES-V2.0 发表于 2018-12-13 08:16 好的,我试试,谢谢老哥 |
你大概没有搞清楚你的板子的点阵电路吧! 你的这个板子上,8*8点阵,是这样连接的: ![]() ![]() 你的程序中,一点届没有看到控制595的程序,点阵当然是不会亮的了。 给你一个示例程序,点阵显示一些数字字符: #include<reg51.h> #include<intrins.h> sbit SRCLK=P3^6; sbit RCLK=P3^5; sbit SER=P3^4; //--定义要使用的IO口--// #define COMMONPORTS P0 //--列选通控制--// unsigned char code TAB[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //--点阵字码--// unsigned char code CHARCODE[18][8]= { {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0 {0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1 {0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2 {0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3 {0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4 {0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5 {0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6 {0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7 {0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8 {0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9 {0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P {0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R {0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E {0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C {0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H {0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I {0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N {0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中 }; void delay(unsigned int time) { unsigned int i,j; for(i=0;i<time;i++) for(j=0;j<121;j++); } /******************************************************************************* * 函数名 : Hc595SendByte(unsigned char dat) * 函数功能 : 想74H595发送一个字节的数据 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Hc595SendByte(unsigned char dat) { unsigned char a; SRCLK=0; RCLK=0; for(a=0;a<8;a++) { SER=dat>>7; dat<<=1; SRCLK=1; _nop_(); _nop_(); SRCLK=0; } RCLK=1; _nop_(); _nop_(); RCLK=0; } /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void main() { unsigned char tab, j; unsigned int i; while(1) { for(i= 0; i<50; i++ ) //两个字之间的扫描间隔时间 { for(tab=0;tab<8;tab++) { Hc595SendByte(0x00); //消隐 COMMONPORTS = TAB[tab]; //输出字码 Hc595SendByte(CHARCODE[j][tab]); delay(2); } } j++; if(j == 18) { j = 0; } } } 另外还要提醒你,一定要将标有JOE的跳线冒接到GND那边才行哦。 |
1 程序是否和硬件不配套。 2 查硬件供电是否正常。 |