|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真
單片機(jī)源程序如下:
- #include<at89x52.h>
- #include <intrins.h>
- #include "key_8574.h"
- #include"1602.h"
- uchar key; //定于全局變量key,用于按鍵掃描后的碼值存放
- //#define LED P2 //用于事例
- uchar i;
- int temp=0; //1602的列
- int temp1=0; //1602的行
- /*4*4鍵盤對(duì)應(yīng)的值*/
- uchar zi[]={' ',
- '1','2','3','A',
- '4','5','6','B',
- '7','8','9','C',
- '*','0','#','D', };
- /*********************************************
- 函數(shù)名稱:delay_ms
- 函數(shù)功能:延時(shí)函數(shù) 單位為1ms
- 入口參數(shù):uint a
- 出口參數(shù):無(wú)
- 備 注:
- *********************************************/
- void delay_ms(uint a)
- {
- uchar b;
- for(;a>0;a--)
- for(b=110;b>0;b--);
- }
- /*********************************************
- 函數(shù)名稱:shuru
- 函數(shù)功能:實(shí)現(xiàn)4*4矩陣按鍵在1602上的輸出
- 入口參數(shù):無(wú)
- 出口參數(shù):無(wú)
- 備 注:實(shí)現(xiàn)輸出0~9,光標(biāo)的移位
- *********************************************/
- void shuru()
- {
- if(key!=0)
- {
- delay_ms(10); //按鍵消抖
- if(key!=0)
- {
- i=key;
- switch(i)
- {
- case 4:
- write_com_1602(0x14); //光標(biāo)右移一位 (0x14)~(0x17)光標(biāo)右移一位
- temp++; //列加1 //(0x18)~(0x1b)屏幕左移
- break; //(0x1c)~(0x1f)屏幕右移
- case 8:
- write_com_1602(0x10); //光標(biāo)左移一位 (0x10)~(0x13)光標(biāo)左移一位
- temp--; //列減1
- break;
- case 16:
- switch(temp1) //查詢當(dāng)前光標(biāo)在哪一行
- {
- case 1:
- temp1=0; //改變光標(biāo)的行
- write_com_1602(0x80+temp);//改變光標(biāo)的行,列不變
- break;
- case 0:
- temp1=1; //改變光標(biāo)的行
- write_com_1602(0xc0+temp);//改變光標(biāo)的行,列不變
- break;
- }
- break;
- case 12:
- write_com_1602(0x01); //顯示清屏
- temp=0; //回到第一列
- temp1=0; //回到第一行
- break;
- case 15:
- temp++; //向后移動(dòng)一位
- if(temp1==0) //如果在第一行
- {
- write_com_1602(0x80+temp);//光標(biāo)顯示在第一行
- }
- else //否則
- {
- write_com_1602(0xc0+temp);//光標(biāo)顯示在第二行
- }
- break;
- default:
- write_char_1602(temp1,temp,zi[ i]); //在當(dāng)前位置輸出數(shù)字[ i]
- if(temp1==0) //如果在第一行
- {
- write_com_1602(0x80+temp); //光標(biāo)顯示在第一行
- }
- else //否則
- {
- write_com_1602(0xc0+temp); //光標(biāo)顯示在第二行
- }
- break;
-
- }
- if(temp==16)//如果到了最后一列
- {
- temp=0; //回到第一列
- temp1++;//到下一行
- }
- if(temp1==2)//如果到了最后一行
- {
- temp1=0;//回到第一行
- }
- if(temp<0) //如果向左移,移過(guò)了第一列
- {
- temp=16;//到最后一列
- temp1--;//回到上一行
- }
- if(temp1<0) //如果向上移,移過(guò)了第一行
- {
- temp1=1;//到第二行
- temp=15;//到最后一列
- }
- }
- while(key!=0); //等待按鍵釋放
- }
- }
- /*-----------主函數(shù)------------*/
- void main()
- {
- init_8574();//初始化函數(shù)
- init_1602();
- /*外部中斷0被pcf8574占用*/
- IT0 = 1; //令I(lǐng)NT0下降沿觸發(fā)
- EX0 = 1; //開(kāi)INT0中斷
- EA = 1; //開(kāi)啟總中斷
- write_com_1602(0x01);//顯示清屏
- while(1)
- {
- shuru();
- }
- }
- /*---------------------------------------------
- **函數(shù)名稱:int0()
- **函數(shù)功能:中斷系統(tǒng)
- **入口參數(shù):無(wú)
- **輸出參數(shù):無(wú)
- **說(shuō)明:當(dāng)pcf8574P口變化時(shí)會(huì)產(chǎn)生中斷變化,單片機(jī)
- 根據(jù)中斷進(jìn)行按鍵掃描
- ---------------------------------------------*/
- void int0() interrupt 0
- {
- EX0 = 0;//為了防止多次進(jìn)入中斷造成干擾,先關(guān)閉中斷
- key = key_scan();//讀取按鍵值
- EX0 = 1;//開(kāi)啟中斷
- }
復(fù)制代碼
全部資料51hei下載地址:
3-3光標(biāo)控制.zip
(128.43 KB, 下載次數(shù): 54)
2020-5-14 09:40 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|