新聞中心

        AVR矩陣鍵盤程序

        作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        搞了一頓竟然連矩陣鍵盤的程序都不會寫

        do
        {
        i=(i<<1|i>>7);
        PORTD=i;
        DDRD=0X0F;//
        key=PIND;//不論如何配置DDxn,都可以通過讀取PINxn 寄存器來獲得引腳電平
        j=key&0xf0;

        }while(j==0xf0);//直到發(fā)現(xiàn)按鍵按下。若沒有找到按鍵按下 的,繼續(xù)循環(huán)

        本文引用地址:http://www.104case.com/article/201611/316376.htm

        i的初值0x7f。i=(i<<1|i>>7);之后。i=1111 1110b

        第二次,i= 1111 1101b

        保證只有一位為0


        下面是程序,寫得很巧妙

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #pragma data:code //save to areas of program
        const table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c ,
        0x39,0x5e,0x79,0x71,0};

        void delay(uint ms)
        {
        uint i,j;
        for(i=0;ifor(j=0;j<1141;j++);
        }
        void show_init()
        {
        DDRA|=BIT(3);
        DDRB=0XFF;
        DDRA|=BIT(4);
        }
        void show(uchar aa,uchar bb)//第aa個數(shù)碼管顯示bb
        {

        //PORTB=0XFF;
        PORTA|=BIT(4);
        PORTB=~BIT(aa);
        PORTA&=~BIT(4);

        PORTA|=BIT(3);
        PORTB=table[bb];
        PORTA&=~BIT(3);


        delay(10);
        }
        uchar key_press()
        {
        uchar i;
        DDRD=0XFF;
        PORTD=0XF0;

        DDRD=0X0F;
        i=PIND;
        if(i==0xf0)
        {
        DDRD=0XFF;
        return 0;

        }
        else
        {
        DDRD=0XFF;
        return 1;
        }
        }
        uchar key_scan()
        {
        uchar key,i=0x7f,j,code;
        delay(10);
        if(key_press())
        {
        do
        {
        i=(i<<1|i>>7);
        PORTD=i;
        DDRD=0X0F;
        key=PIND;
        j=key&0xf0;

        }while(j==0xf0);

        while(key_press());

        switch(key)
        {
        case 0x7e: code=0;break;
        case 0xbe: code=1;break;
        case 0xde: code=2;break;
        case 0xee: code=3;break;

        case 0x7d: code=4;break;
        case 0xbd: code=5;break;
        case 0xdd: code=6;break;
        case 0xed: code=7;break;

        case 0x7b: code=8;break;
        case 0xbb: code=9;break;
        case 0xdb: code=10;break;
        case 0xeb: code=11;break;

        case 0x77: code=12;break;
        case 0xb7: code=13;break;
        case 0xd7: code=14;break;
        case 0xe7: code=15;break;

        }
        }

        return code;
        }

        void main()
        {
        uchar s;
        show_init();
        while(1)
        {
        if(key_press())
        {
        s=key_scan();
        show(0,s);
        }
        }

        }




        關(guān)鍵詞: AVR矩陣鍵

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 马山县| 达日县| 科技| 普陀区| 额济纳旗| 区。| 通州区| 惠安县| 当阳市| 罗平县| 玉田县| 宝坻区| 邯郸县| 香河县| 天峻县| 汉阴县| 荔浦县| 万安县| 浮梁县| 赤峰市| 拉萨市| 马龙县| 山东省| 托克逊县| 明星| 田阳县| 依兰县| 宁明县| 翁牛特旗| 吴桥县| 浠水县| 克什克腾旗| 都安| 通化市| 蕉岭县| 平凉市| 南开区| 公主岭市| 长兴县| 中牟县| 云浮市|