找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3739|回復(fù): 2
收起左側(cè)

用單片機(jī)pcf8574+4x4矩陣按鍵實現(xiàn)1602光標(biāo)控制程序

[復(fù)制鏈接]
ID:584513 發(fā)表于 2020-5-14 09:41 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

仿真

仿真


單片機(jī)源程序如下:
  1. #include<at89x52.h>
  2. #include <intrins.h>
  3. #include "key_8574.h"
  4. #include"1602.h"
  5. uchar key; //定于全局變量key,用于按鍵掃描后的碼值存放
  6. //#define LED P2        //用于事例
  7. uchar i;
  8. int temp=0;         //1602的列
  9. int temp1=0; //1602的行
  10. /*4*4鍵盤對應(yīng)的值*/
  11. uchar zi[]={' ',
  12.                         '1','2','3','A',                 
  13.                         '4','5','6','B',
  14.                         '7','8','9','C',
  15.                         '*','0','#','D', };
  16. /*********************************************
  17.     函數(shù)名稱:delay_ms
  18.         函數(shù)功能:延時函數(shù) 單位為1ms
  19.         入口參數(shù):uint a
  20.         出口參數(shù):無
  21.         備 注:
  22. *********************************************/
  23. void delay_ms(uint a)
  24. {
  25.         uchar b;
  26.         for(;a>0;a--)
  27.                 for(b=110;b>0;b--);
  28. }
  29. /*********************************************
  30.     函數(shù)名稱:shuru
  31.         函數(shù)功能:實現(xiàn)4*4矩陣按鍵在1602上的輸出
  32.         入口參數(shù):無
  33.         出口參數(shù):無
  34.         備 注:實現(xiàn)輸出0~9,光標(biāo)的移位
  35. *********************************************/
  36. void shuru()
  37. {
  38.         if(key!=0)                                          
  39.         {
  40.                 delay_ms(10); //按鍵消抖
  41.                 if(key!=0)
  42.                 {
  43.                         i=key;
  44.                         switch(i)
  45.                         {
  46.                                 case 4:
  47.                                         write_com_1602(0x14);        //光標(biāo)右移一位         (0x14)~(0x17)光標(biāo)右移一位
  48.                                         temp++;        //列加1                                    //(0x18)~(0x1b)屏幕左移
  49.                                 break;                                                                //(0x1c)~(0x1f)屏幕右移
  50.                                 case 8:
  51.                                         write_com_1602(0x10);        //光標(biāo)左移一位         (0x10)~(0x13)光標(biāo)左移一位
  52.                                         temp--; //列減1
  53.                                 break;
  54.                                 case 16:
  55.                                         switch(temp1)                        //查詢當(dāng)前光標(biāo)在哪一行
  56.                                         {        
  57.                                                 case 1:
  58.                                                         temp1=0;                //改變光標(biāo)的行
  59.                                                         write_com_1602(0x80+temp);//改變光標(biāo)的行,列不變
  60.                                                 break;
  61.                                                 case 0:
  62.                                                         temp1=1;                //改變光標(biāo)的行
  63.                                                         write_com_1602(0xc0+temp);//改變光標(biāo)的行,列不變
  64.                                                 break;
  65.                                         }                                         
  66.                                 break;                                                         
  67.                                 case 12:
  68.                                         write_com_1602(0x01);        //顯示清屏
  69.                                         temp=0;                                        //回到第一列
  70.                                         temp1=0;                                //回到第一行
  71.                                 break;
  72.                                 case 15:
  73.                                         temp++;                                        //向后移動一位
  74.                                         if(temp1==0)                                //如果在第一行
  75.                                         {
  76.                                                 write_com_1602(0x80+temp);//光標(biāo)顯示在第一行        
  77.                                         }
  78.                                         else                                                  //否則
  79.                                         {
  80.                                                 write_com_1602(0xc0+temp);//光標(biāo)顯示在第二行
  81.                                         }
  82.                                         break;
  83.                                 default:
  84.                                         write_char_1602(temp1,temp,zi[ i]); //在當(dāng)前位置輸出數(shù)字[ i]
  85.                                         if(temp1==0)                                                 //如果在第一行
  86.                                         {
  87.                                                 write_com_1602(0x80+temp);         //光標(biāo)顯示在第一行
  88.                                         }
  89.                                         else                                                         //否則
  90.                                         {
  91.                                                 write_com_1602(0xc0+temp);         //光標(biāo)顯示在第二行
  92.                                         }                                                           
  93.                                 break;
  94.                                 
  95.                         }
  96.                         if(temp==16)//如果到了最后一列                                                           
  97.                         {
  98.                                 temp=0;        //回到第一列
  99.                                 temp1++;//到下一行
  100.                         }
  101.                         if(temp1==2)//如果到了最后一行
  102.                         {
  103.                                 temp1=0;//回到第一行
  104.                         }
  105.                         if(temp<0)        //如果向左移,移過了第一列
  106.                         {
  107.                                 temp=16;//到最后一列
  108.                                 temp1--;//回到上一行
  109.                         }
  110.                         if(temp1<0)        //如果向上移,移過了第一行
  111.                         {
  112.                                 temp1=1;//到第二行
  113.                                 temp=15;//到最后一列
  114.                         }
  115.                 }
  116.                         while(key!=0);          //等待按鍵釋放        
  117.         }        
  118. }
  119. /*-----------主函數(shù)------------*/
  120. void main()
  121. {
  122.         init_8574();//初始化函數(shù)
  123.         init_1602();
  124.         /*外部中斷0被pcf8574占用*/
  125.         IT0 = 1;        //令I(lǐng)NT0下降沿觸發(fā)
  126.         EX0 = 1;        //開INT0中斷
  127.         EA = 1;                //開啟總中斷
  128.         write_com_1602(0x01);//顯示清屏
  129.         while(1)
  130.         {
  131.                 shuru();
  132.         }
  133. }


  134. /*---------------------------------------------
  135. **函數(shù)名稱:int0()
  136. **函數(shù)功能:中斷系統(tǒng)
  137. **入口參數(shù):無
  138. **輸出參數(shù):無
  139. **說明:當(dāng)pcf8574P口變化時會產(chǎn)生中斷變化,單片機(jī)
  140.                 根據(jù)中斷進(jìn)行按鍵掃描
  141. ---------------------------------------------*/
  142. void int0() interrupt 0
  143. {
  144.         EX0 = 0;//為了防止多次進(jìn)入中斷造成干擾,先關(guān)閉中斷
  145.         key = key_scan();//讀取按鍵值
  146.         EX0 = 1;//開啟中斷
  147. }

復(fù)制代碼

51hei.png

全部資料51hei下載地址:
3-3光標(biāo)控制.zip (128.43 KB, 下載次數(shù): 54)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:589833 發(fā)表于 2020-5-16 10:22 | 顯示全部樓層
贊一個
回復(fù)

使用道具 舉報

ID:1080302 發(fā)表于 2023-5-28 00:45 來自手機(jī) | 顯示全部樓層
原來如此,豁然開朗
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表