|
- /*************************************************************************
- 工程名:4×4行列矩陣鍵盤(pán)
- 作 者:老芹
- 用定時(shí)器0設(shè)置一個(gè)基準(zhǔn)計(jì)時(shí)器,代替CPU軟件延時(shí),從而解放CPU,避免空耗時(shí)
- *************************************************************************/
- #include<STC15F2K60S2.h>
- #include"LCD1602.h"
- #include"hardware.h"
- #include"intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tab[4][4] = { {'1','2','3','A'}, //0~9,A~D,*,#的鍵值
- {'4','5','6','B'},
- {'7','8','9','C'},
- {'*','0','#','D'}
- };
- uchar temp;
- uchar Timer_10ms_con=0; //10ms定時(shí)計(jì)數(shù)控制
- uchar Timer_10ms=0; //10ms定時(shí)計(jì)數(shù)
- extern LCD_int(); //初始化LCD
- void Timer0_Init(); //定時(shí)器0初始化
- void LCD_write_com(uchar com); //寫(xiě)一個(gè)字節(jié)數(shù)據(jù)到LCD
- uchar keyscan() //鍵盤(pán)掃描
- {
- uchar key_H,key_L,key_temp,key,row,column;
- key_data = 0xf0; //高四位做輸入
- if(key_data == 0xf0) //沒(méi)有按鍵動(dòng)作
- {
- key = 0;
- return(key);
- }
- while(1)
- {
- if(Timer_10ms<5) //替代常規(guī)10ms軟件延時(shí),如delay(10)類(lèi);
- {
- Timer_10ms_con=1;
- key = 0;
- return(key);
- }
- Timer_10ms=0; //10ms到
- Timer_10ms_con=0; //定時(shí)計(jì)數(shù)控制復(fù)位
- if(key_data==0xf0) //是干擾,退出
- {
- key = 0;
- return(key);
- }
- key_H = key_data;
- key_data = 0x0f; //低四位做輸入
- _nop_(); //STC等高速51單片機(jī),在端口置"1",后,如果立即讀數(shù)據(jù),會(huì)讀出不確定值,所以加入短暫延時(shí)
- _nop_();
- key_L = key_data;
- while(key_data!=0x0f); //按鍵是否放開(kāi)
- key_temp = key_H|key_L;
- switch(key_temp)
- {
- case 0x7e:row=3;column=0;break; //顯示"*"
- case 0x7b:row=3;column=2;break; //顯示"#"
- case 0xe7:row=0;column=3;break; //顯示"A"
- case 0xd7:row=1;column=3;break; //顯示"B"
- case 0xb7:row=2;column=3;break; //顯示"C"
- case 0x77:row=3;column=3;break; //顯示"D"
- case 0x7d:row=3;column=1;break; //顯示"0"
- case 0xee:row=0;column=0;break; //顯示"1"
- case 0xed:row=0;column=1;break; //顯示"2"
- case 0xeb:row=0;column=2;break; //顯示"3"
- case 0xde:row=1;column=0;break; //顯示"4"
- case 0xdd:row=1;column=1;break; //顯示"5"
- case 0xdb:row=1;column=2;break; //顯示"6"
- case 0xbe:row=2;column=0;break; //顯示"7"
- case 0xbd:row=2;column=1;break; //顯示"8"
- case 0xbb:row=2;column=2;break; //顯示"9"
- }
- key=tab[row][column];
- return (key);
- }
- }
- void main()
- {
- uchar i; //定時(shí)器初始化
- Timer0_Init();
- LCD_int(); //1602液晶模塊初始化
- LCD_prints("Welcome");
- P0=0xff;
- while(1)
- {
- temp=keyscan();
- if(temp!=0)
- {
- P0=temp;
- LCD_set_position(0x40+i);
- LCD_printc(temp);
- i++;
- if(i==17)
- {
- i=0;
- LCD_write_com(0x01);
- LCD_prints("Welcome");
- LCD_set_position(0x40+i);
- LCD_printc(temp);
- }
- }
-
- }
- }
- void Timer0_Init() //定時(shí)器初始化
- { //2毫秒@11.0592MHz
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x9A; //設(shè)置定時(shí)初值
- TH0 = 0xA9; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 =1;
- EA = 1;
- }
- void Timer0() interrupt 1 //定時(shí)器中斷
- { //16位自動(dòng)重裝模式,無(wú)需重賦初值
- if(Timer_10ms_con==1) Timer_10ms++;
- }
復(fù)制代碼
//LCD1602.C
- #include<STC15F2K60S2.h>
- #include "hardware.h"
- #include "lcd1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- void LCD_check_busy() //檢測(cè)LCD狀態(tài)
- {
- while(1)
- {
- LCD_EN=0;
- LCD_RS=0;
- LCD_RW=1;
- LCD_DATA=0xff;
- LCD_EN=1;
- if(!LCD_BUSY) break;
- }
- LCD_EN=0;
- }
- void LCD_cls() //LCD清屏
- {
- //LCD_check_busy(); //仿真時(shí)該語(yǔ)句可以屏蔽
- LCD_RS=0;
- LCD_RW=0;
- LCD_DATA=1;
- LCD_EN=1;
- LCD_EN=0;
- }
- void LCD_write_com(uchar com) //寫(xiě)指令到LCD
- {
- LCD_check_busy();
- LCD_RS=0;
- LCD_RW=0;
- LCD_DATA=com;
- LCD_EN=1;
- LCD_EN=0;
- }
- void LCD_write_data(uchar LCD_data) //寫(xiě)一個(gè)字節(jié)數(shù)據(jù)到LCD
- {
- LCD_check_busy();
- LCD_RS=1;
- LCD_RW=0;
- LCD_DATA=LCD_data;
- LCD_EN=1;
- LCD_EN=0;
- }
- void LCD_set_position(uchar x) //LCD光標(biāo)定位到x處
- {
- LCD_write_com(0x80+x);
- }
- /*
- void LCD_go_home(void) //LCD光標(biāo)歸位
- {
- LCD_write_instruction(LCD_GO_HOME);
- }
- */
- void LCD_printc(uchar lcd_data) //輸出一個(gè)字符到LCD
- {
- LCD_write_data(lcd_data);
- }
- void LCD_prints(uchar *lcd_string) //輸出一個(gè)字符串到LCD
- {
- uchar i=0;
- while(lcd_string[i]!=0x00)
- {
- LCD_write_data(lcd_string[i]);
- i++;
- }
- }
- void LCD_int() //初始化LCD
- {
- LCD_write_com(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
- LCD_write_com(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
- LCD_write_com(LCD_DISPLAY_DOUBLE_LINE);
- LCD_cls();
- LCD_write_com(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
- }
復(fù)制代碼
//LCD1602.H
- #ifndef __LCD_H__
- #define __LCD_H__
- #define LCD_GO_HOME 0x02 //AC=0,光標(biāo)、畫(huà)面回HOME位
- //輸入方式設(shè)置
- #define LCD_AC_AUTO_INCREMENT 0x06 //數(shù)據(jù)讀、寫(xiě)操作后,AC自動(dòng)增一
- #define LCD_AC_AUTO_DECREASE 0x04 //數(shù)據(jù)讀、寫(xiě)操作后,AC自動(dòng)減一
- #define LCD_MOVE_ENABLE 0x05 //數(shù)據(jù)讀、寫(xiě)操作,畫(huà)面平移
- #define LCD_MOVE_DISENABLE 0x04 //數(shù)據(jù)讀、寫(xiě)操作,畫(huà)面不動(dòng)
- //設(shè)置顯示、光標(biāo)及閃爍開(kāi)、關(guān)
- #define LCD_DISPLAY_ON 0x0C //顯示開(kāi)
- #define LCD_DISPLAY_OFF 0x08 //顯示關(guān)
- #define LCD_CURSOR_ON 0x0A //光標(biāo)顯示
- #define LCD_CURSOR_OFF 0x08 //光標(biāo)不顯示
- #define LCD_CURSOR_BLINK_ON 0x09 //光標(biāo)閃爍
- #define LCD_CURSOR_BLINK_OFF 0x08 //光標(biāo)不閃爍
- //光標(biāo)、畫(huà)面移動(dòng),不影響DDRAM
- #define LCD_LEFT_MOVE 0x18 //LCD顯示左移一位
- #define LCD_RIGHT_MOVE 0x1C //LCD顯示右移一位
- #define LCD_CURSOR_LEFT_MOVE 0x10 //光標(biāo)左移一位
- #define LCD_CURSOR_RIGHT_MOVE 0x14 //光標(biāo)右移一位
- //工作方式設(shè)置
- #define LCD_DISPLAY_DOUBLE_LINE 0x38 //兩行顯示
- #define LCD_DISPLAY_SINGLE_LINE 0x30 //單行顯示
- void LCD_cls(void);
- void LCD_write_data(unsigned char);
- void LCD_initial(void);
- void LCD_set_position(unsigned char);
- void LCD_prints(unsigned char *);
- void LCD_printc(unsigned char);
- #endif
- //hardware.h
- #include<STC15F2K60S2.h>
- #ifndef __HARDWAR_H__
- #define __HARDWAR_H__
- /*---------------------------------------------------------
- LCD數(shù)據(jù)、控制口定義
- ---------------------------------------------------------*/
- #define LCD_DATA P1 //LCD的數(shù)據(jù)口
- #define key_data P3 //矩陣鍵盤(pán)的數(shù)據(jù)口
- sbit LCD_BUSY=LCD_DATA^7; //LCD忙信號(hào)位
- sbit LCD_RW=P2^0; //LCD讀寫(xiě)控制
- sbit LCD_RS=P2^1; //LCD寄存器選擇
- sbit LCD_EN=P2^2; //LCD使能信號(hào)*/
- #endif
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|